03-xpath定位元素

本文详细介绍了XPath在SeleniumWebdriver中用于网页元素定位的各种方法,包括通过属性(id、name、class)、标签、层级关系、索引、逻辑运算及模糊匹配,以及何时选择使用这些方法的建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、xpath:属性定位

        xpath也可以通过元素的id、name、class这些属性来对元素进行定位,下面是使用xpath对百度网页搜索框进行定位的相关代码:

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.baidu.com')

# 使用xpath通过id属性进行定位
driver.find_element('xpath', "//*[@id='kw']").send_keys('python')

# 使用xpath通过name属性进行定位
driver.find_element('xpath', "//*[@name='wd']").send_keys('python')

# 使用xpath通过class属性进行定位
driver.find_element('xpath', "//*[@class='s_ipt']").send_keys('python')

二、xpath:其它属性

        如果一个元素没有id、name、class属性,这时候也可以通过其它属性定位到该元素。下面是使用xpath对百度网页搜索框进行定位的相关代码:

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.baidu.com')

# 使用xpath通过其他属性进行定位
driver.find_element('xpath', "//*[@autocomplete='off']").send_keys('python')

三、xpath:标签

        如果一个网页中同名的属性比较多时,可以通过标签进行筛选,可以使得元素定位更加准确。如果不想指定标签名称,可以用*号表示任意标签;如果想指定具体某个标签,直接写上标签名称即可。下面是使用xpath对百度网页搜索框进行定位的相关代码:

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.baidu.com')

# 使用xpath通过input标签和id属性进行定位
driver.find_element('xpath', "//input[@id='kw']").send_keys('python')

# 使用xpath通过input标签和name属性进行定位
driver.find_element('xpath', "//input[@name='wd']").send_keys('python')

# 使用xpath通过input标签和其他属性进行定位
driver.find_element('xpath', "//input[@autocomplete='off']").send_keys('python')

四、xpath:层级

        如果一个元素无法直接定位到,这时候我们可以先找它的父元素,找到它的父元素之后,再找下一个层级就能定位到目标元素了。

        如上图所示,要定位的是input这个标签,它的父元素有属性:id=s_kw_wrap,因此可以很方便的定位到它的父元素。要是它的父元素也无法直接定位到,就依次向上找它父元素的父元素(爷爷元素),它的爷爷元素有属性:id=form,因此可以很方便的定位到它的爷爷元素。然后就可以根据父元素和目标元素之间的层级关系,来定位到目标元素。

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.baidu.com')

# 通过定位父元素来定位目标input输入框
driver.find_element('xpath', "//span[@id='s_kw_wrap']/input").send_keys('python')

# 通过定位父元素的父元素(爷爷元素)来定位目标input输入框
driver.find_element('xpath', "//form[@id='form']/span/input").send_keys('python')

五、xpath:索引

        如果一个元素和它的兄弟元素有着一样的标签,这时候无法通过层级定位到,因为都是一个父亲生的,属于多胞胎兄弟。虽然多胞胎兄弟很难识别,但是出生是有先后顺序的,于是可以通过它在家里的排行来进行定位。

        如上图所示,select元素下有三个具有相同标签(option)的元素。这时候就可以使用xpath根据元素索引分别进行定位:(注:这里的索引是从1开始的,和python中的索引不一样)

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.baidu.com')

# 使用xpath定位老大
driver.find_element('xpath', "//select[@id='nr']/option[1]").click()

# 使用xpath定位老二
driver.find_element('xpath', "//select[@id='nr']/option[2]").click()

# 使用xpath定位老三
driver.find_element('xpath', "//select[@id='nr']/option[3]").click()

六、xpath:逻辑运算

        xpath还有一个比较强的功能,是可以对多个属性做逻辑运算的,支持与(and)、或(or)、非(not)。一般用的比较多的是and运算,意味着目标元素需要同时满足多个属性。下面是使用xpath对百度网页搜索框进行定位的相关代码:

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.baidu.com')

# 使用xpath的逻辑运算来定位目标input输入框
driver.find_element('xpath', "//input[@maxlength='255' and @autocomplete='off']").send_keys('python')

七、xpath:模糊匹配

        xpath还有一个非常强大的功能,即模糊匹配。掌握了模糊匹配功能,基本上没有定位不到的元素。比如我要定位百度页面的超链接 ‘hao123’,在上一篇中讲过可以通过link text进行精准匹配,也可以通过partial link text进行模糊匹配,xpath也可以实现同样的功能,并且更为强大。

from selenium import webdriver

driver = webdriver.Chrome()
driver.get('https://www.baidu.com')

# 使用xpath模糊匹配标签文本内容(这里是指标签文本内容中包含子串'hao12'的元素)
driver.find_element('xpath', "//*[contains(text(), 'hao12')]").click()

# 使用xpath模糊匹配某个属性(这里是指id属性值中包含子串'kw'的元素)
driver.find_element('xpath', "//*[contains(@id, 'kw')]").send_keys('python')

# 使用xpath模糊匹配以什么开头(这里是指id属性值以's_kw_'开头的元素)
driver.find_element('xpath', "//*[starts-with(@id, 's_kw_')]").click()

# 使用xpath模糊匹配以什么结尾(这里是指id属性值以'kw_wrap'结尾的元素)
driver.find_element('xpath', "//*[ends-with(@id, 'kw_wrap')]").click()

        以上是xpath定位元素的语法,xpath具有强大的功能,即可根据元素任意属性进行定位,又可根据元素位置进行定位,是定位元素的最终解决办法之一。

        在定位元素过程中,到底该使用id、name、class等属性进行定位,还是使用xpath进行定位呢?具体情况具体分析,怎么简单怎么来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值