Python Selenium库XPath元素定位详细教程

使用 Python 的 Selenium 库进行元素定位时,XPath 是一种常用的定位方式。XPath 是一种在 XML 文档中导航和定位元素的语言,同时也适用于 HTML 文档。下面是 XPath 的详细用法以及一个封装了通过 XPath 定位各种元素的类的示例。

XPath 详细用法:

  1. 绝对路径和相对路径

  2. 绝对路径:以根节点开始的完整路径,例如 /html/body/div[1]/p[2]
  3. 相对路径:以当前节点为参照物的路径,例如 //div/p[3]
  4. 元素定位

  5. 通过标签名定位://tagname
  6. 通过类名定位://*[contains(@class, 'classname')]
  7. 通过id定位://*[@id='elementId']
  8. 通过属性定位://*[@attribute='value']
  9. 通过文本内容定位://*[text()='some text']
  10. 层级关系

  11. 选择所有子孙节点://parent/child/grandchild
  12. 选择直接子节点://parent/child
  13. 逻辑运算

  14. 与运算:[condition1 and condition2]
  15. 或运算:[condition1 or condition2]
  16. 位置定位

  17. 第一个匹配的元素:(//div)[1]
  18. 最后一个匹配的元素:(//div)[last()]
  19. 倒数第二个匹配的元素:(//div)[last()-1

举例说明一下

  • 通过绝对路径定位元素:

    element = driver.find_element_by_xpath("/html/body/div[1]/form/input")

  • 通过相对路径定位元素:

    element = driver.find_element_by_xpath("//form/input[@name='username']")

  • 使用属性定位元素:

    element = driver.find_element_by_xpath("//*[@id='submitBtn']")

  • 使用文本内容定位元素:

    element = driver.find_element_by_xpath("//*[text()='Login']")

  • 模糊匹配定位元素:

    element = driver.find_element_by_xpath("//input[contains(@class, 'input-text')]")

  • 封装通过 XPath 定位各种元素的类:

    下面是一个简单的示例,展示了如何封装一个类来实现使用 XPath 定位各种元素,并考虑了各种 XPath 的元素定位和层级关系:

    from selenium import webdriver
    
    class ElementLocator:
        def __init__(self, driver):
            self.driver = driver
    
        def find_element_by_absolute_path(self, absolute_xpath):
            return self.driver.find_element_by_xpath(absolute_xpath)
    
        def find_element_by_relative_path(self, relative_xpath):
            return self.driver.find_element_by_xpath(relative_xpath)
    
        def find_element_by_attribute(self, attribute, value):
            xpath = f"//*[@{attribute}='{value}']"
            return self.driver.find_element_by_xpath(xpath)
    
        def find_element_by_text_content(self, text):
            xpath = f"//*[text()='{text}']"
            return self.driver.find_element_by_xpath(xpath)
    
        def find_element_by_partial_attribute_value(self, attribute, partial_value):
            xpath = f"//*[contains(@{attribute}, '{partial_value}')]"
            return self.driver.find_element_by_xpath(xpath)
    
    # 示例使用
    driver = webdriver.Chrome()
    driver.get("https://example.com")
    
    locator = ElementLocator(driver)
    element1 = locator.find_element_by_absolute_path("/html/body/div[1]/form/input")
    element2 = locator.find_element_by_relative_path("//form/input[@name='username']")
    element3 = locator.find_element_by_attribute("id", "submitBtn")
    element4 = locator.find_element_by_text_content("Login")
    element5 = locator.find_element_by_partial_attribute_value("class", "input-text")
    

    在上述示例中,我们封装了一个名为 ElementLocator 的类,其中包含了根据 XPath 定位各种元素的方法,同时考虑了各种 XPath 的元素定位和层级关系。通过这个类,你可以方便地使用 XPath 定位各种类型的元素。

    当使用XPath进行元素定位时,可以结合不同的定位方式来定位各种元素。下面我会逐一介绍XPath的各种复杂用法:

    1. 元素定位
    通过标签名定位:
    //div
    通过id属性定位:
    //*[@id='elementId']
    通过class属性定位:
    //*[@class='className']
    通过其他属性定位:
    //*[@attributeName='value']
    2. 层级关系
    子元素定位:
    //div/a
    父元素定位:
    //a/..
    兄弟元素定位:
    //div/following-sibling::*
    3. 文本内容
    通过文本内容定位:
    xpath
    //*[text()='Some text']
    模糊匹配文本内容:
    //*[contains(text(), 'Partial Text')]
    4. Class
    通过class属性定位:
    //div[contains(@class, 'className')]
    5. 属性
    通过其它属性定位:
    //*[@attributeName='value']
    多个属性组合定位:
    //*[@attribute1='value1' and @attribute2='value2']
    使用正则表达式匹配属性值:
    //div[@id='regexMatch(\d+)']
    复杂用法示例:
    //div[contains(@class, 'content')]/h2[text()='Title']/following-sibling::p[1]
    这个XPath路径表示选择class包含'content'的div元素下的第一个h2元素,然后选择其下一个兄弟元素中的第一个p元素。

    作者:zwjapple

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python Selenium库XPath元素定位详细教程

    发表回复