文章目录
- 1.8种元素定位方法
- 2.xpath定位的高级用法
- 1. 绝对路径
- 2.相对路径
- 3. 索引定位
- 4.使用XPATH的属性值定位元素
- 5.使用XPATH的属性名称定位元素
- 6.使用任意值来匹配属性及元素
- 7.使用模糊的属性值匹配
- starts-with()
- ends-with()
- contains()
- text()
- last()
- 8.过虑某个元素
- name()
- 9.常用函数
- parent 选取当前节点的父节点
- ancestor 选取当前节点的所有先辈(父、祖父等)
- descendant选取当前节点的所有后代元素(子、孙等)
- descendant-or-self选取当前节点的所有后代元素(子、孙等)以及当前节点本身
- preceding 选取文档中当前节点的开始标签之前的所有节点
- preceding-sibling选取当前节点之前的所有同级节点
- following 选取文档中当前节点的结束标签之后的所有节点(包括自己及自己的后代元素
- following-sibling选取当前节点之后的所有同级节点
- 3.xpath定位实例
1.8种元素定位方法
-
find_element_by_id:通过ID进行匹配查找,只返回匹配到的一个元素
-
find_element_by_name:通过name进行匹配查找,只返回匹配到的一个元素
-
find_element_by_xpath:通过xpath进行匹配查找,只返回匹配到的一个元素
-
find_element_by_link_text:通过链接内容进行匹配查找,只返回匹配到的一个元素
-
find_element_by_partical_link_text:通过部分链接内容进行匹配查找,只返回匹配到的一个元素
-
find_element_by_tag_name:通过标签名称进行匹配查找,只返回匹配到的一个元素
-
find_element_by_class_name:通过class名称进行匹配查找,只返回匹配到的一个元素
-
find_element_by_css_selector:通过CSS选择器进行匹配查找,只返回匹配到的一个元素
2.xpath定位的高级用法
表达式 | 描述 |
---|---|
/ | 从根节点选取,也就是当前节点的最顶层(默认情况下当前节点是 html 最顶层,若从某元素开始,当前节点为此元素) |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 |
. | 选取当前节点 |
. . | 选取当前节点的父节点 |
@ | 选取属性 |
1. 绝对路径
以 “/” 开头, 让xpath 从文档的根节点开始解析
driver.find_element_by_xpath(“html/body/div/form/input”)
2.相对路径
以"//" 开头, 让xpath 从文档的任何元素节点开始解析(也就是说每个节点都作为起点找一下
driver.find_element_by_xpath(“//body/div/form/input”)
3. 索引定位
driver.find_element_by_xpath(“//input[1]”)
4.使用XPATH的属性值定位元素
driver.find_element_by_xpath(“//input[@id=‘username’]”)
driver.find_element_by_xpath(“//input[@type=‘submit’][@name=‘sub1’]”)
driver.find_element_by_xpath(“//input[@type=‘submit’ and @name=‘sub1’]”)
driver.find_element_by_xpath(“//input[@type=‘submit’ or @name=‘sub1’]”)
5.使用XPATH的属性名称定位元素
查找所有input标签中含有type属性的元素
driver.find_element_by_xpath(“//input[@type]”)
查找所有a标签中含有onclick属性的元素
driver.find_element_by_xpath(“//a[@onclick]”)
6.使用任意值来匹配属性及元素
匹配所有input元素中含有属性的值为readonly的元素
driver.find_element_by_xpath(“//input[@*=‘readonly’]”))
7.使用模糊的属性值匹配
starts-with()
匹配一个属性开始位置的关键字,是模糊定位的一种。
匹配id以submit开头的元素,如:id=‘submit’
driver.find_element_by_xpath(“//input[starts-with(@id,‘submit’)]”)
ends-with()
匹配一个属性结束位置的关键字,是模糊定位的一种。
匹配id以submit结尾的元素,如:id=‘submit’
driver.find_element_by_xpath(“//input[ends-with(@id,‘submit’)]”)
contains()
匹配一个属性值中包含的字符串,也是模糊定位的一种。
匹配id中含有submit的元素,如:id=‘submit’
driver.find_element_by_xpath(“//input[contains(@id,‘submit’)]”)
匹配name属性中包含na关键字的页面元素
driver.find_element_by_xpath(“//input[contains(@name,‘na’)]”)
text()
根据文本信息匹配元素位置。
表示div元素->form元素->input元素的最后一个子元素,得到id值为e2的E元素
driver.find_element_by_xpath(“//div[@class=‘class3’][contains(text(),‘div2’)]/…/text()”)
last()
函数位置定位。
表示div元素->form元素->input元素的最后一个子元素,得到id值为e2的E元素
driver.find_element_by_xpath(“/div/form/input[last()]”)
8.过虑某个元素
name()
获取标签名称。
表示过虑掉在 div id='query_reulst_box' 的下的 style 标签和 meta 标签
driver.find_element_by_xpath("//div[@id='query_reulst_box']/*[not(name()='style' and name()='meta')]//text())
9.常用函数
parent 选取当前节点的父节点
//*[@id=“content_views”]/p[51]/span[1]/parent::p
ancestor 选取当前节点的所有先辈(父、祖父等)
//*[@id=“content_views”]/p[51]/span[1]/ancestor-or-self::div
descendant选取当前节点的所有后代元素(子、孙等)
//*[@id=“content_views”]/descendant::span
descendant-or-self选取当前节点的所有后代元素(子、孙等)以及当前节点本身
//*[@id=“content_views”]/p[51]/descendant-or-self::p
preceding 选取文档中当前节点的开始标签之前的所有节点
//*[@id=“content_views”]/p[51]/preceding::p
preceding-sibling选取当前节点之前的所有同级节点
//*[@id=“content_views”]/p[51]/span[2]/preceding-sibling::span
following 选取文档中当前节点的结束标签之后的所有节点(包括自己及自己的后代元素
//*[@id=“content_views”]/p[51]/following::p
following-sibling选取当前节点之后的所有同级节点
//*[@id=“content_views”]/p[51]/span[2]/following-sibling::span
3.xpath定位实例
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>上课啦</title>
</head>
<body>
<p id="abc">浔阳江头夜送客,枫叶荻花秋瑟瑟1</p>
<p id="abd">浔阳江头夜送客,枫叶荻花秋瑟瑟2</p>
<input name="a1">
<div><select><option>主人下马客在船,举酒欲饮无管弦</option><option>醉不成欢惨将别,别时茫茫江浸月</option><option>忽闻水上琵琶声,主人忘归客不发</option></select>
</div>
<a href="http://www.baidu.com">访问百度</a>
<span>君既为府吏,守节情不移</span>
<span class="a2">鸡鸣入机织,夜夜不得息</span>
<div><table><tr><td>头上玳瑁光,腰若流纨素</td></tr><tr><td>出师未捷身先死,长使英雄泪满襟</td></tr></table>
</div>
</body>
</html>
# -*- coding: utf-8 -*-
# @project : day5
# @author: lw
# @file: study.py
# @ide: PyCharm
# @time: 2021/8/1 19:30
import timefrom selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManagerservice = ChromeService(executable_path=ChromeDriverManager().install())driver = webdriver.Chrome(service=service)
fileHtml1 = "file:///Users/liwei/Downloads/%E8%85%BE%E8%AE%AF%E8%AF%BE%E5%A0%8237-38%E6%9C%9F2020-7-8/day2/test.html"
driver.get(fileHtml1)element_absolute = driver.find_elements("xpath", "//body/p")
print("Xpath 绝对径定位: ")
for element in element_absolute:print(element.text)print("================================================")
print("Xpath 相对路径定位: ")
element_xiangdui = driver.find_elements("xpath", "//body/p")
for element in element_xiangdui:print(element.text)print("================================================")
print("Xpath 索引定位: ")
element_index = driver.find_elements("xpath","//*[@id][2]")
for element in element_index:print(element.text)print("================================================")
print("XPATH的属性名称元素: ")
element_attribute = driver.find_elements("xpath", "//*[@id]")
for element in element_attribute:print(element.text)print("================================================")
print("XPATH的属性值定位元素: ")
element_attributeValue = driver.find_elements("xpath", "//*[@id='abc']")
for element in element_attributeValue:print(element.text)print("================================================")
print("使用任意值来匹配属性及元素: ")
element_any = driver.find_elements("xpath", "//*[@*='a2']")
for element in element_any:print(element.text)print("================================================")
print("使用模糊的属性值匹配: ")
element_starts = driver.find_elements("xpath", "//*[starts-with(@id,'a')]")
# end是新语法不是所有浏览器都支持
# element_ends = driver.find_elements("xpath", "//*[ends-with(@id,'d')]")
element_contains = driver.find_elements("xpath", "//*[contains(@id,'a')]")for element in element_starts:print("starts-with(@id,'a')" + element.text)# for element in element_ends:
# print("ends-with(@id,'d')" + element.text)for element in element_contains:print("contains(@id,'a')" + element.text)print("================================================")
print("根据文本信息匹配元素位置: ")
element_text = driver.find_element("xpath", "//*[text()='访问百度']")
print(element_text.text)print("================================================")
print("last()元素位置: ")
element_last = driver.find_element("xpath", "//*[@id][last()]")
print(element_last.text)print("================================================")
print("name函数: ")
element_name = driver.find_elements("xpath","//*[not (name()='p' or name()='div')]//*[name()='select']")
for element in element_name:print(element.text)print("================================================")
print("常见位置函数: ")
element_parent = driver.find_element("xpath", "//*[@id]/parent::body")
print("parent"+element_parent.tag_name)
element_ancestor = driver.find_element("xpath", "//td/ancestor::tbody")
print("ancestor"+element_ancestor.tag_name)
element_descendant = driver.find_element("xpath", "//div[1]/descendant::option")
print("element_descendant" + element_descendant.text)'''
//div[1]/descendant::option[3]/preceding::option
//div[1]/descendant::option[3]/preceding-sibling::option
//div[1]/descendant::option[1]/following::option
//div[1]/descendant::option[1]/following-sibling::option'''driver.quit()
Xpath 绝对径定位:
浔阳江头夜送客,枫叶荻花秋瑟瑟1
浔阳江头夜送客,枫叶荻花秋瑟瑟2
================================================
Xpath 相对路径定位:
浔阳江头夜送客,枫叶荻花秋瑟瑟1
浔阳江头夜送客,枫叶荻花秋瑟瑟2
================================================
Xpath 索引定位:
浔阳江头夜送客,枫叶荻花秋瑟瑟2
================================================
XPATH的属性名称元素:
浔阳江头夜送客,枫叶荻花秋瑟瑟1
浔阳江头夜送客,枫叶荻花秋瑟瑟2
================================================
XPATH的属性值定位元素:
浔阳江头夜送客,枫叶荻花秋瑟瑟1
================================================
使用任意值来匹配属性及元素:
鸡鸣入机织,夜夜不得息
================================================
使用模糊的属性值匹配:
starts-with(@id,‘a’)浔阳江头夜送客,枫叶荻花秋瑟瑟1
starts-with(@id,‘a’)浔阳江头夜送客,枫叶荻花秋瑟瑟2
contains(@id,‘a’)浔阳江头夜送客,枫叶荻花秋瑟瑟1
contains(@id,‘a’)浔阳江头夜送客,枫叶荻花秋瑟瑟2
================================================
根据文本信息匹配元素位置:
访问百度
================================================
last()元素位置:
浔阳江头夜送客,枫叶荻花秋瑟瑟2
================================================
name函数:
主人下马客在船,举酒欲饮无管弦
醉不成欢惨将别,别时茫茫江浸月
忽闻水上琵琶声,主人忘归客不发
================================================
常见位置函数:
parentbody
ancestortbody
element_descendant主人下马客在船,举酒欲饮无管弦
Process finished with exit code 0