百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

selenium中的Xpath元素定位方法_selenium常用api之元素定位有哪几种方法

myzbx 2025-02-20 17:00 35 浏览

Selenium 是一个强大的工具,用于自动化Web浏览器的操作。XPath(XML Path Language)是Selenium中用来定位页面元素的一种方法,它提供了一种在XML文档中查找信息的语言。以下是Selenium中XPath的一些常见用法:

常用表达式规则

用法

名称

表达式

示例

描述

绝对路径

/

/html/body/input

从根节点html逐级往下找(不跳跃)


相对路径

//

//input

所有input标签


相对路径

//

//input[1]

每个父节点下的第一个input标签


相对路径

//

//input[last()]

每个父节点下的最后一个input标签


相对路径

//

//input[last()-1]

每个父节点下的倒数第二个input标签


相对路径

//

//input[position()<4]

每个父节点下的前3个标签


基础用法

[@属性名='属性值']

//*[@id='username']

id是唯一的,找到id值为'username'的标签


基础用法

[@属性名='属性值']

//input[@name='zp']

找到所有input标签下name值为'zp'的标签


基础用法

[@属性名='属性值']

//button[@class='a b']

找到所有button标签下class值为'a b'的标签


属性法

[@属性名]

//@class

找到所有具有class属性的标签


属性法

运算符

//*[@width>500]

属性值是数字的,可以使用运算符进行比较


属性法

函数

starts-with(@属性名,'属性开头的值')

//*[starts-with(@id,'user')]

找到值以'user'开头的id所在的标签

属性法

函数

contains(@属性名,'属性包含的值')

//*[contains(@id,'sernam')]

找到值中包含'sernam'的id所在标签

属性法

text()='文本'

//*[text()='百度搜索']

匹配文本的值,完全匹配。可代替find_element_by_link_text方法


属性法

contains(text(),'文本包含的值')

//*[contains(text(),'度搜')]

匹配文本包含的值,模糊匹配。可代替
find_element_by_partial_link_text方法


多属性匹配运算符

运算符

描述

示例

and

age=19 or age=20

or

age>19 and age<21

mod

计算除法的余数

5 mod 7

|

计算两个节点集

//book | //cd

+

加法

6 + 4

-

减法

6 - 4

*

乘法

6 * 4

div

除法

8 div 4

=

等于

age=19

!=

不等于

age!=19

<

小于

age<19

<=

小于等于

age<=19

>

大于

age>19

>=

大于等于

age>=19

案例介绍


基于chrome 浏览器的console可以进行快速定位测试。

console中调用xpath的基本格式:$x("xpath表达式")

绝对定位与相对定位

  • 绝对定位:$x("/xpath表达式")
  • 相对定位:$x("//xpath表达式")




1.2 通配符与不包含筛选

属性@

通配符*

不包含not()

包含contains()

selenium 中xpath 常见用法


绝对路径与相对路径

绝对路径:从根节点开始选择元素,使用单斜杠/表示。

示例:/html/body/div[1]/form/input

特点:如果网页结构变化,容易导致定位失败。

相对路径:不从根节点开始,而是从任意位置开始选择元素,使用双斜杠//表示。

示例://input[@name='username']

特点:更灵活,推荐使用。

基于属性定位

使用@符号来选择具有特定属性的元素。

示例://*[@id='loginForm'] 或 //input[@name='password']

基于文本内容定位

使用text()函数来选择包含特定文本的元素。

示例://*[text()='Submit'] 完全匹配

示例://*[contains(text(), 'Sub') 部分匹配

使用逻辑运算符

and 和 or 运算符可以组合多个条件。

示例://input[@type='text' and @name='email']

示例://button[@type='submit' or @class='btn-primary']

使用位置和索引

可以使用方括号[]指定元素的位置或索引。

示例://ul/li[1] 第一个列表项

示例://div[last()] 最后一个

元素

示例://a[position() < 3] 前两个链接

使用通配符

* 表示任何元素。

示例://*[@class='highlight'] 匹配所有类名为highlight的元素,不论标签是什么。

多个属性值匹配

可以通过contains()函数匹配部分属性值。

示例://*[contains(@class, 'btn')] 匹配类名包含btn的所有元素。

属性值以特定字符串开头或结尾

starts-with() 函数用于匹配以特定字符串开头的属性值。

示例://*[starts-with(@id, 'user_')] 匹配ID以user_开头的所有元素。

ends-with() 函数用于匹配以特定字符串结尾的属性值。(注意:此函数仅在支持XPath 2.0及以上版本的浏览器中可用)

组合使用多种定位方式

XPath表达式可以非常复杂,可以根据需要组合多种定位方式。

示例://div[@class='container']//a[contains(@href, 'example.com')]

这些只是Selenium中使用XPath的一部分技巧。XPath的强大之处在于它的灵活性和表达能力,能够帮助测试人员准确定位复杂的HTML结构中的元素。然而,在实际应用中应该尽量保持XPath表达式的简单和可读性,同时要注意避免过于依赖DOM结构,以防页面结构调整后定位器失效。

示例代码:

from selenium import webdriver

from selenium.webdriver.common.by import By

from selenium.webdriver.chrome.service import Service as ChromeService

from webdriver_manager.chrome import ChromeDriverManager

# 初始化WebDriver(这里以Chrome为例)

driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))

# 打开目标网页

driver.get('https://example.com')

try:

# 绝对路径与相对路径

absolute_path_element = driver.find_element(By.XPATH, "/html/body/div[1]/form/input")

relative_path_element = driver.find_element(By.XPATH, "//input[@name='username']")

# 基于属性定位

by_id_element = driver.find_element(By.XPATH, "//*[@id='loginForm']")

by_name_element = driver.find_element(By.XPATH, "//input[@name='password']")

# 基于文本内容定位

text_exact_match = driver.find_element(By.XPATH, "//*[text()='Submit']")

text_partial_match = driver.find_element(By.XPATH, "//*[contains(text(), 'Sub')]")

# 使用逻辑运算符

and_operator = driver.find_element(By.XPATH, "//input[@type='text' and @name='email']")

or_operator = driver.find_element(By.XPATH, "//button[@type='submit' or @class='btn-primary']")

# 使用位置和索引

first_li = driver.find_element(By.XPATH, "//ul/li[1]")

last_div = driver.find_element(By.XPATH, "//div[last()]")

first_two_links = driver.find_elements(By.XPATH, "//a[position() < 3]")

# 使用通配符

wildcard_class = driver.find_elements(By.XPATH, "//*[@class='highlight']")

# 多个属性值匹配

contains_class = driver.find_elements(By.XPATH, "//*[contains(@class, 'btn')]")

# 属性值以特定字符串开头或结尾

starts_with_id = driver.find_elements(By.XPATH, "//*[starts-with(@id, 'user_')]")

# 注意:ends-with 函数仅在支持XPath 2.0及以上版本的浏览器中可用

# ends_with_class = driver.find_elements(By.XPATH, "//*[ends-with(@class, 'end')]")

# 组合使用多种定位方式

combined_locators = driver.find_elements(By.XPATH, "//div[@class='container']//a[contains(@href, 'example.com')]")

# 输出找到的元素数量(对于find_elements方法)或者打印元素的文本(对于find_element方法)

print(f"Found {len(combined_locators)} elements using combined locators.")

finally:

# 关闭浏览器

driver.quit()

相关推荐

vue 基础-组件中事件的触发和监听

前言《vue基础》系列是再次回炉vue记的笔记,除了官网那部分知识点外,还会加入自己的一些理解。(里面会有部分和官网相同的文案,有经验的同学择感兴趣的阅读)vue中单纯的事件调用,你一定不陌生...

JMH基准测试和JMH-Visual-chart可视化

原文地址:https://github.com/Sayi/sayi.github.com/issues/68如何度量一段代码的性能,换种实现方式会有更佳的性能表现吗?你或许想知道fastjson是否正...

一文轻松看懂丰田汽车的电路图(丰田车电路图识读技巧)

丰田汽车电路图符号、含义丰田汽车电路图识读说明电路图中字母是注释标号,其各部分的含义如下:注释标号A:表示系统标题,在电路图上方用横线划分,区域内用文字和系统符号表示下方电路系统的名称。注释标号B:表...

杭州高级中学发文言文版校庆公告引热议——全文932字,74处注释

阅读提示校方回应:我们期待以这种‘复古’的方式引起公众注意,也算是为树立起大众的文化自信、唤起大众对传统文化的关注作出一点贡献。5月14日,杭州高级中学官方微信发布了一篇文言文版的校庆公告。几个小...

Python 和 JS 有什么相似?(python和js哪个快)

Python是一门运用很广泛的语言,自动化脚本、爬虫,甚至在深度学习领域也都有Python的身影。作为一名前端开发者,也了解ES6中的很多特性借鉴自Python(比如默认参数、解构赋值、...

阿里卖家 Flutter for Web 工程实践

作者:马坤乐(坤吾)Flutter自2015年初次亮相以来,经过了多年的发展已经相当成熟,在阿里、美团、拼多多等互联网公司都有广泛的应用。在ICBU阿里卖家上90+%的新业务使用Flu...

诗经275思文押韵、注释、古音、今韵

诗经275-1思文押韵(备注:□=非韵、■=i韵、●=o/u韵、◆=ng韵、=i/o二象性)「」1.思文后稷,克配彼天。立我烝民,莫菲尔极。贻我来牟,帝命率育。无此疆尔界,陈常于时夏。□□□■,...

SolidWorks中常用命令快捷键(solidworks有哪些快捷键)

1.A:中心线2.B:镜向3.C:画圆4.D:智能标柱尺寸5.E:删除6.F:草图倒圆角7.G:画直线8.H:从装配制作工程9.I:等距实体10.J:从装配制作装配11.K:多边形12.L:延伸13....

第一章、TS语言简介(tsl语言)

TypeScript(简称TS)是微软公司开发的一种基于JavaScript(简称JS)语言的编程语言。它的目的并不是创造一种全新语言,而是增强JavaScript的功能,使其更适合多人合...

为什么要用JMH?何时应该用?(日本jmh地面分析图网站)

if快还是switch快?HashMap的初始化size要不要指定,指定之后性能可以提高多少?各种序列化方法哪个耗时更短?无论出自何种原因需要进行性能评估,量化指标总是必要的。在大部分场合...

雅虎“YSlow - 23 条规则”详尽阐释

以下乃是雅虎“YSlow-23条规则”的详尽阐释,旨在优化网页之性能以及用户之体验,乃是结合技术之原理与实践之方法梳理而成:1.减少HTTP请求次数说明:每一次HTTP请求皆会增添延迟...

JavaScript 运算符(js ~运算符)

JavaScript运算符JS变量JS算数JavaScript运算符实例向变量赋值,并把它们相加:varx=7;//向x赋值5vary=8;//向y赋值2...

在Notebook中使用Sublime Text 快捷键

编程派微信号:codingpy前几天,我在公众号上发布了两篇译文,对JupyterNotebook做了一些基础性的介绍。虽然说比较基础,而且第二篇阅读量并不高,但是我认为对于其他对于Noteb...

晨光静好时!2 道 JS 与 TS 面试题解析,开启惬意学习日

当第一缕晨光温柔地唤醒窗台的绿植,泡上一杯清香四溢的茉莉花茶,坐在洒满阳光的角落。此刻,放下对面试的焦虑,让我们像聊生活趣事般,轻松拆解两道JavaScript和TypeScript的高频面试...

2024年CSPJ题目解析,语法基本功&gt;算法!

前言:每次有家长来找我们咨询报课,说孩子学了一年了,竞赛成绩不理想,问怎么才能强化,提升,我们经过一番询问,发现这类孩子普遍都是在算法上已经花了非常多的时间了,但是语法根本不过关。对这种孩子我们普遍建...