一、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进行定位呢?具体情况具体分析,怎么简单怎么来。