📅  最后修改于: 2023-12-03 14:41:11.807000             🧑  作者: Mango
当我们需要通过框架或面板嵌套时,或者需要找到没有唯一id或name属性的元素时,使用XPath语法就变得必要了,因为XPath语法可以让我们使用元素的任何属性来定位。
XPath全称XML Path Language,它是一种基于XML的查询语言,可以使用XPath来定位文档中的任何元素。
在Selenium Python中,我们可以使用find_element_by_xpath()
方法来使用XPath定位元素。
XPath语法非常灵活,但对于Selenium Python的定位来说,只需要知道一些基本的规则和语法即可。
XPath有两种选择器:绝对路径和相对路径。
我们通常使用相对路径,因为绝对路径可能会因为页面结构的变化导致失败。
路径表达式是XPath的核心,由多个路径步骤组成。
路径步骤是由轴、节点测试和零或多个谓词组成的。
以下是路径表达式的一些示例:
/html/body/div[2]/div[1]/div/span[1]
:绝对路径。//span[@id='example']
:相对路径,查找id为example的span标签。轴指定了要在哪些节点上进行搜索。
以下是XPath的一些常用轴:
ancestor
:查找所有祖先节点。ancestor-or-self
:查找所有祖先或当前节点。attribute
:查找所有属性。child
:查找所有直接子节点。descendant
:查找所有后代节点。descendant-or-self
:查找所有后代或当前节点。following
:查找当前节点之后的所有节点。following-sibling
:查找当前节点之后的所有兄弟节点。parent
:查找父节点。preceding
:查找当前节点之前的所有节点。preceding-sibling
:查找当前节点之前的所有兄弟节点。self
:查找当前节点。节点测试用于确定满足给定条件的节点类型。
以下是XPath的一些常用节点测试:
node()
:匹配任何节点。comment()
:匹配注释节点。text()
:匹配文本节点。processing-instruction()
:匹配处理指令节点。*
:匹配所有元素节点。node()[not(self::*)]
:匹配非元素节点。谓词用于过滤节点,使得XPath表达式选择的节点更加精确。
以下是XPath的一些常用谓词:
[@attribute]
:匹配具有指定属性的节点。[@attribute='value']
:匹配具有指定属性和属性值的节点。[position()]
:匹配在指定位置的节点。[last()]
:匹配最后一个节点。[text()='value']
:匹配具有指定文本内容的节点。[contains(@attribute,'value')]
:匹配具有指定属性并且属性值包含指定子串的节点。使用XPath定位元素,需要在浏览器的开发者工具中使用XPath获取元素的XPath表达式,然后将其传入find_element_by_xpath()
方法中即可。
以下是一个示例:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.example.com/')
element = driver.find_element_by_xpath('//input[@id="search"]')
在这个示例中,我们使用了一个相对路径,查找id为search的input元素。
如果想要查找多个元素,可以使用find_elements_by_xpath()
方法。
elements = driver.find_elements_by_xpath('//ul[@class="list"]/li')
在这个示例中,我们使用了路径表达式//ul[@class="list"]/li
,匹配了所有class为list的ul元素下的所有li元素。
XPath语法非常灵活,可以使用各种各样的选择器、轴、节点测试和谓词来定位元素。但是,在使用XPath定位元素时,我们需要注意不使用绝对路径,以避免因为页面结构的变化导致失败。
在实际开发中,建议使用Chrome浏览器的开发者工具来获取元素的XPath表达式,以确保XPath表达式的正确性。