Xpath定位元素
Xpath定位元素
XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。通俗一点讲就是通过元素的路径来查找到这个元素的,相当于通过定位一个对象的坐标来找到这个对象。Selenium WebDriver支持使用XPath表达式来定位元素。当发现通过ID、name或class属性值无法定位元素时,可以尝试使用XPath的方式。通过XPath可以灵活地应用绝对或相对路径来定位元素。
一、路径表达式
XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点。 |
/ | 从根节点选取。 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 |
. | 选取当前节点。 |
.. | 选取当前节点的父节点。 |
@ | 选取属性。 |
在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:
路径表达式 | 结果 |
---|---|
/bookstore/book[1] | 选取属于 bookstore 子元素的第一个 book 元素。 |
/bookstore/book[last()] | 选取属于 bookstore 子元素的最后一个 book 元素。 |
/bookstore/book[last()-1] | 选取属于 bookstore 子元素的倒数第二个 book 元素。 |
/bookstore/book[position()❤️] | 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。 |
//title[@lang] | 选取所有拥有名为 lang 的属性的 title 元素。 |
//title[@lang='eng'] | 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。 |
/bookstore/book[price>35.00] | 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。 |
/bookstore/book[price>35.00]/title | 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。 |
二、绝对路径
XPath表达式表示从HTML代码的最外层逐层查找,最后定位到按钮节点。比如:通过浏览器F12
赋值出的百度搜索框的绝对路径,如下:
/html/body/div/div[2]/div[5]/div[1]/div/form/span[1]/input
层级结构如下:
示例代码:
from time import sleep
from selenium import webdriver
class TestBaidu:
def setup(self):
self.url = "https://www.baidu.com/"
self.driver = webdriver.Chrome()
self.driver.maximize_window()
self.driver.get(self.url)
self.driver.implicitly_wait(5)
def teardown(self):
sleep(2)
self.driver.quit()
def test_locator_by_xpath(self):
"""xpath定位"""
self.driver.find_element_by_xpath("/html/body/div/div[2]/div[5]/div[1]/div/form/span[1]/input").send_keys("selenium")
self.driver.find_element_by_xpath("/html/body/div/div[2]/div[5]/div[1]/div/form/span[2]/input").click() #搜索按钮
一般情况不采用,绝对路径定位方法,从代码量就可以看出太长,而且也难以维护,一旦页面稍许变动,就得改变绝对定位方式的值。
三、相对路径
XPath定位元素除了使用绝对路径外,也可以使用元素的某个属性值来定位。
1、表达式
在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:
路径表达式 | 结果 |
---|---|
/bookstore/* | 选取 bookstore 元素的所有子元素。 |
//* | 选取文档中的所有元素。 |
//title[@*] | 选取所有带有属性的 title 元素。 |
2、常用定位方法
定位方式 | 解释 |
---|---|
//*[@id='kw'] |
按ID属性查找百度输入框 |
//*[@name='wd'] |
按name属性查找百度输入框 |
//*[@class='s_ipt'] |
按class属性查找百度输入框 |
//*[contains(@value,'百度一下')] |
按条件定位搜索按钮,其中value的值包含“百度一下” |
//*[contains(@value,'百度一下') and contains(@id,'su')] |
按条件定位搜索按钮,其中value的值包含“百度一下”,并且id的值包含su |
//*[@value='百度一下' and @id='su'] |
按条件定位搜索按钮,其中value的值包含“百度一下”,并且id的值包含su |
//*[@value='百度一下' or @id='su'] |
按条件定位搜索按钮,其中value的值包含“百度一下”,或者id的值包含su |
from time import sleep
from selenium import webdriver
class TestBaidu:
def setup(self):
self.url = "https://www.baidu.com/"
self.driver = webdriver.Chrome()
self.driver.maximize_window()
self.driver.get(self.url)
self.driver.implicitly_wait(5)
def teardown(self):
sleep(2)
self.driver.quit()
def test_locator_by_xpath(self):
"""xpath定位"""
# self.driver.find_element_by_xpath("/html/body/div/div[2]/div[5]/div[1]/div/form/span[1]/input").send_keys("selenium")
# self.driver.find_element_by_xpath("/html/body/div/div[2]/div[5]/div[1]/div/form/span[2]/input").click() #搜索按钮
# self.driver.find_element_by_xpath("//*[@id='kw']").send_keys("selenium")
# self.driver.find_element_by_xpath("//*[@id='su']").click()
# self.driver.find_element_by_xpath("//*[@class='s_ipt']").send_keys("selenium")
# self.driver.find_element_by_xpath("//*[@name='su']").click()
# self.driver.find_element_by_xpath("//*[@name='wd']").send_keys("selenium")
# self.driver.find_element_by_xpath("//*[contains(@value,'百度一下')]").click()
# self.driver.find_element_by_xpath("//*[@name='wd']").send_keys("selenium")
# self.driver.find_element_by_xpath("//*[contains(@value,'百度一下') and contains(@id,'su')]").click()
self.driver.find_element_by_xpath("//*[@name='wd']").send_keys("selenium")
self.driver.find_element_by_xpath("//*[@value='百度一下' and @id='su']").click()
四、参考链接
1、xpath定位:https://www.w3school.com.cn/xpath/xpath_syntax.asp
2、css定位:https://www.w3school.com.cn/cssref/css_selectors.asp
3、jQuery 选择器:https://www.w3school.com.cn/jquery/jquery_selectors.asp
4、following-sibling等方法:https://blog.csdn.net/hb5cn/article/details/84937449