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

posted @ 2021-01-10 19:04  xyztank  阅读(654)  评论(0编辑  收藏  举报