selenium 定位方式4-xpath

Selenium 提供的另一种,能够唯一定位的方式:

  • find_element_by_xpath

XPath 基础知识

XPath (XML Path Language) 是由国际标准化组织 W3C 指定的,用来在 XML 和 HTML 文档中选择节点的语言。

XPath 学习链接

目前主流浏览器 (Chrome,Firefox,Edge,Safari) 都支持 XPath 语法。

XPath 相对于 css 选择器的优势:

  • 有些场景使用 css 定位元素很麻烦,而 XPath 却比较方便
  • XPath 还有其他领域会使用到,比如爬虫框架 Scrapy, 手机 APP 框架 Appium

XPath 语法中,整个 HTML 代码的根节点,使用 / 表示,这第一点跟 Linux 有相似之处。

定位根节点下的 html 节点:/html

定位根节点下 body 节点下的 form 节点:/html/body/form

通过上面两个简单的例子可发现, XPath 中的 /css 选择器中的 > 功能相似,都表示直接子节点关系

根据绝对路径定位元素

表示从 XPath 根节点/ 开始,一直通过查找子元素的方式,定位到指定的元素,就是绝对路径。

实际应用

在上图中,定位百度首页的搜索输入框,通过 /html/body/div/div/div/div/div/form/span/input 最终定位到2个元素,因此最后需要使用下标的方式,达到唯一定位的作用。

注意: XPath 中,下标值也是从 1 开始

除最终的 input 标签,前面路径中可以不添加下标值

# find_element_by_xpath 的应用:根据 xpath 绝对路径 定位元素
from selenium import webdriver  # 导入 webdriver 模块
from time import sleep  # 导入 sleep 模块,可以使程序强制休眠

driver = webdriver.Chrome()  # 调用 Chrome 浏览器
driver.maximize_window()  # 窗口最大化
driver.get('https://www.baidu.com/')  # 打开 百度
sleep(2)  # 强制休眠 2 秒
element = driver.find_element_by_xpath("/html/body/div/div/div/div/div/form/span/input[1]")  # 根据 绝对路径 定位元素
element.send_keys("自动化测试")  # 输入内容
sleep(2)  # 强制休眠 2 秒
element1 = driver.find_element_by_xpath("/html/body/div/div/div/a")  # 根据 绝对路径 定位元素
element1.click()  # 点击
sleep(3)  # 强制休眠 3 秒
driver.quit()  # 关闭浏览器

根据相对路径定位元素

使用绝对路径,会使得 XPath 语句十分冗长,为了简化 XPath 语句,可以使用 //,表示从当前节点往下寻找所有的后代元素,不管它在什么位置。

实际应用

# find_element_by_xpath 的应用:根据 xpath 相对路径 定位元素
from selenium import webdriver  # 导入 webdriver 模块
from time import sleep  # 导入 sleep 模块,可以使程序强制休眠

driver = webdriver.Chrome()  # 调用 Chrome 浏览器
driver.maximize_window()  # 窗口最大化
driver.get('https://www.baidu.com/')  # 打开 百度
sleep(2)  # 强制休眠 2 秒
element = driver.find_element_by_xpath("//div/form/span/input[1]")  # 根据 相对路径 定位元素
element.send_keys("自动化测试")  # 输入内容
sleep(2)  # 强制休眠 2 秒
element1 = driver.find_element_by_xpath("//div/div/a")  # 根据 相对路径 定位元素
element1.click()  # 点击
sleep(3)  # 强制休眠 3 秒
driver.quit()  # 关闭浏览器

通配符

使用表达式 //div/*,可以选择页面上所有的 div 节点的所有直接子节点。

根据属性定位元素

css 选择器一样, XPath 也可以根据属性来定位元素,语法格式:

[@属性名=‘属性值’]

  • 属性名注意前面有 @ 符号
  • 属性值一定要用引号, 可以是单引号,也可以是双引号
根据 id 属性定位

根据 class 属性定位

根据其他属性

实际应用
# find_element_by_xpath 的应用:根据 xpath 属性 定位元素
from selenium import webdriver  # 导入 webdriver 模块
from time import sleep  # 导入 sleep 模块,可以使程序强制休眠

driver = webdriver.Chrome()  # 调用 Chrome 浏览器
driver.maximize_window()  # 窗口最大化
driver.get('https://www.baidu.com/')  # 打开 百度
sleep(2)  # 强制休眠 2 秒
element = driver.find_element_by_xpath("//div/form/span/input[id='kw']")  # 根据 id 属性 定位元素
# element = driver.find_element_by_xpath("//div/form/span/input[class='s_ipt']")  # 根据 id 属性 定位元素
# element = driver.find_element_by_xpath("//div/form/span/input[name='wd']")  # 根据 id 属性 定位元素
element.send_keys("自动化测试")  # 输入内容
sleep(3)  # 强制休眠 3 秒
driver.quit()  # 关闭浏览器
组合属性定位

XPath 支持根据多个属性同时定位元素,语法格式:

//input[@type='text' and @ id='kw']:定位 type 属性值为 ‘text’ 并且 id 属性值为 ‘kw’ 的 input 元素

根据属性部分匹配
  1. 包含属性值://*[contains(@属性名,'部分属性值')],比如,//input[contains(@class,'_ip')]
  2. 匹配属性值开头://*[starts-with(@属性名,'属性值开头')],比如,//input[starts-with(@class,'s_ip')]
  3. 不支持匹配属性值结尾

根据次序定位

XPath 支持根据次序定位元素,而且语法比 css 选择器更简洁,语法格式:

//标签名[下标值]

某类型 第几个 子元素

//div[2]:定位到 作为第2个子元素的 div 元素;等价于 css 选择器中的 div:nth-of-type(2)

第几个子元素

//div/*[2]:定位到 父元素为 div 的第二个子元素,不区分类型;等价于 css 选择器中的 div:nth-child(2)

某类型 倒数第几个 子元素

//div[last()]:定位到 div 类型的最后1个元素;等价于 css 选择器中的 div:nth-last-child(1)

//div[last()-1]:定位到 div 类型的倒数第2个元素;等价于 css 选择器中的 div:nth-last-child(2)

//div[last()-n]:定位到 div 类型的倒数第2个元素;等价于 css 选择器中的 div:nth-last-child(n+1)

范围选择

这种定位方式是 css 选择器所不具有的。

//ul/li[position()<=2]:定位 ul类型下的第1~2个 li 元素

//ul/li[position()>=last()-1]:定位 ul类型下的最后2个 li 元素

组选择

XPath 组选择是使用 | 隔开的,语法格式:

//input | //h3:选择所有的 input 元素与 h3 元素,等价于 css 选择器中的:input, h3

定位父节点

XPath 选择父节点类似于 Linux 的返回上级目录,使用 /..,这是 css 选择器不具备的功能,语法格式:

//*[@id='kw']/..:定位到 id 为 ‘kw’ 的元素的父节点

而且还可以继续往上层找父节点://*[@id='kw']/../..

定位兄弟节点

XPath 定位兄弟节点,使用 following-sibling::preceding-sibling::,语法格式:

//*[@id='kw']/following-sibling::*:定位到 id 为 ‘kw’ 的元素的所有后续兄弟节点,等价于 css 选择器中的:#kw~ *

//*[@name='rsv_t']/preceding-sibling::*:定位到 name 为 ‘rsv_t’ 的元素的所有前面的节点

总结

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
XPath是一种XML文档的定位方法,也可以用于HTML文档的定位Selenium中也可以使用XPath定位网页元素。下面是使用XPath定位元素的详细步骤: 1. 打开浏览器并访问网页: ```python from selenium import webdriver driver = webdriver.Chrome() driver.get("http://www.example.com") ``` 2. 使用XPath定位元素: ```python # 通过元素id定位 element = driver.find_element_by_xpath('//*[@id="element_id"]') # 通过元素name定位 element = driver.find_element_by_xpath('//*[@name="element_name"]') # 通过元素class定位 element = driver.find_element_by_xpath('//*[@class="element_class"]') # 通过元素标签名定位 element = driver.find_element_by_xpath('//tag_name') # 通过元素属性定位 element = driver.find_element_by_xpath('//*[@attribute_name="attribute_value"]') # 通过元素文本内容定位 element = driver.find_element_by_xpath('//*[text()="text_content"]') # 通过元素部分文本内容定位 element = driver.find_element_by_xpath('//*[contains(text(), "text_content")]') ``` 3. 对元素进行操作: ```python # 输入文本 element.send_keys("text_input") # 点击元素 element.click() # 获取元素文本 print(element.text) # 获取元素属性值 print(element.get_attribute("attribute_name")) ``` 注意事项: - XPath定位需要用到浏览器的开发者工具,在开发者工具中可以查看元素的XPath路径。 - XPath路径中的引号需要用不同类型的引号包裹,例如在单引号内使用双引号包裹。 - 如果XPath路径中包含斜杠(/),则需要使用双斜杠(//)或者使用单引号包裹整个XPath路径。 - 在XPath路径中没有找到元素时,会抛出NoSuchElementException异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肖遥Janic

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值