什么是xpath?
XPath 是一门在 XML 文档中查找信息的语言。XPath 用于在 XML 文档中通过元素和属性进行导航。
xpath定位可以通过绝对路径定位,也可以通过相对路径定位。
绝对路径定位:从文档的根节点开始,逐层定位。类似与我们电脑中的文件绝对路径。
如:/html/body/app-root/html/body/app-root/div
由于绝对路径不灵活,当文档结构一旦发生改变,就肯能导致定位不准确,甚至无法定位,故不推荐。
相对路径定位:从文档中的任何位置开始,以//开头。那么我们说一下通过相对路径定位的方式:
方式1:通过元素属性定位
举例://input[@class='xxx']
这样就可以定位到属性class且值为xxx的input标签了。
如果需要定位子标签,可以用/
举例://input[@class='xxx]/div
这样就可以定位到input(class属性为xxx)的子标签div了。
方式2:通过索引号定位
举例://input/div[1]
这样就可以定位到inpu标签下的第一个div标签了。
注意:在xpath中,索引是从1开始。
拓展:当相同子标签较多时,如果直接定位到最后一个?可以通过last()
举例://input/div[last()]
这样就可以直接定位到子标签中的最后一个了。同样,如果是定位到倒数第二个,可以用last()-1,即//input/div[last()-1]
方式3:通过属性值模糊匹配定位
模糊匹配定位主要有2种:
如图中,//label[starts-with(@class, 'btn'],可以定位到class属性值以btn开头的label标签。
如图中,//label[contains(@class,'btn')],可以定位到class属性值包含btn的label标签。
注意:starts-with()与contains()都是函数,所以需要将属性值传入其中,区别与直接定位(@属性名=属性值),模糊定位的这两
个函数,属性名与属性值为2个参数,故不需要等号。
方式4:通过标签文本内容定位
如我们有这样一个元素:<label class="control_label">账号</label>
我们可以看到该元素的文本类容为'账号',那么我们就可以通过文本来定位://label[text()='账号']
注意:通过文本定位不同于通过属性值定位,无需使用@符号,直接使用text()=文本内容即可。
方式5:通过逻辑表达式来精确定位
有时候,我们仅仅通过一个属性值无法精确的定位到某个元素,这时候我们可以通过逻辑运算符
来进行帮助我们进行精确的定位。
格式为//标签名[@属性1='属性值1' and @属性2='属性值2'...]
举例://book[@category=”web” and @cover=”paperback”]
这样我们就可以定位到category属性值为web,且cover属性值为paperback的book元素了。只有
同时满足这两个条件的元素才会被定位到。
拓展:逻辑表达式还有or(或),!=(非),以及not。
举例://book[@category=”web” or @cover=”paperback”],//book[@category!='web']
其实,属性名=属性值这种表达式,也可以用>,<等等,灵活运用
方式6:通过轴定位(待补充)
在python中,通过xpath定位的方法如下:
def find_element_by_xpath(self, xpath): """ Finds an element by xpath. :Args: - xpath - The xpath locator of the element to find. :Returns: - WebElement - the element if it was found :Raises: - NoSuchElementException - if the element wasn't found :Usage: element = driver.find_element_by_xpath('//div/td[1]') """ return self.find_element(by=By.XPATH, value=xpath)
参数xpath:元素的xpath定位表达式。xpath表达式错误肯定会导致无法成功定位元素,那么就需要
进行验证其正确性后才能使用。
返回值:如果找到元素,则返回WebElement对象。否则,抛出NoSuchElementException异常。
用法举例:element = driver.find_element_by_xpath("//input[@class='kw']")
拓展:selenium中,八种定位方式最终都是通过调用find_element(by, value)方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。