Selenium教程__元素定位(2)

news2024/11/26 16:51:28

Selenium操作页面上的文本输入框、按钮、单选框、复选框等,凡是能在页面显示的任何元素都需要先对元素进行定位。

Selenium提供了以下方法来定位页面中元素:

  • find_element_by_id:通过id属性值进行匹配查找,返回匹配到的第一个元素,未匹配到就报错
  • find_element_by_name:通过name属性值进行匹配查找,返回匹配到的第一个元素,未匹配到就报错
  • find_element_by_link_text:通过链接内容进行完全匹配查找,返回匹配到的第一个元素,未匹配到就报错
  • find_element_by_partical_link_text:通过链接内容进行模糊匹配查找,返回匹配到的第一个元素,未匹配到就报错
  • find_element_by_tag_name:通过html标签名称进行匹配查找,返回匹配到的第一个元素,未匹配到就报错
  • find_element_by_class_name:通过class属性值进行匹配查找,返回匹配到的第一个元素,未匹配到就报错
  • find_element_by_xpath:通过xpath进行匹配查找,返回匹配到的第一个元素,未匹配到就报错
  • find_element_by_css_selector:通过CSS选择器进行匹配查找,返回匹配到的第一个元素,未匹配到就报错

上面方法只会匹配查找只会获取第一个元素。除了上面这些查找单个元素的方法之外,Selenium还定义查找多个元素的方法:

  • find_elements_by_id:通过id属性值进行匹配查找,返回所有匹配到的元素列表,未匹配到返空列表
  • find_elements_by_name:通过name属性值进行匹配查找,返回所有匹配到的元素列表,未匹配到返空列表
  • find_elements_by_link_text:通过链接内容进行完全匹配查找,返回所有匹配到的元素列表,未匹配到返空列表
  • find_elements_by_partical_link_text:通过链接内容进行模糊匹配查找,返回所有匹配到的元素列表,未匹配到返空列表
  • find_elements_by_tag_name:通过html标签名称进行匹配查找,返回所有匹配到的元素列表,未匹配到返空列表
  • find_elements_by_class_name:通过class属性值进行匹配查找,返回所有匹配到的元素列表,未匹配到返空列表
  • find_elements_by_xpath:通过xpath进行匹配查找,返回所有匹配到的元素列表,未匹配到返空列表
  • find_elements_by_css_selector:通过CSS选择器进行匹配查找,返回所有匹配到的元素列表,未匹配到返空列表

by_id

当知道元素的id属性后,可以使用该方法定位元素。

假如页面元素代码如下

<input id="username" type="text">
<input id="username" type="text">

可以这样定位元素

el = driver.find_element_by_id("username")
print(el)
els = driver.find_elements_by_id("username")
print(els)

打印定位的元素

by_name

当知道元素的name属性后,可以使用该方法定位元素。

假如页面元素代码如下

<input type="text" name="username" id="username">
<input type="text" name="username" id="username">

可以这样定位元素

el = driver.find_element_by_name("username")
print(el)
els = driver.find_elements_by_name("username")
print(els)

by_link_text

当知道链接元素的内容后,可以使用该方法定位元素。该方法需要完全匹配链接中的内容,若只是部分匹配链接中的内容则定位不到该元素。

假如页面元素代码如下

<a href="#">标签a</a>

可以这样定位元素

el = driver.find_element_by_link_text("标签a")
print(el)
els = driver.find_elements_by_link_text("标签a")
print(els)
el = driver.find_element_by_link_text("标签")  # 报错
print(el)

by_partical_link_text

当知道链接元素的内容后,可以使用该方法定位元素。该方法可以部分匹配链接中的内容。

假如页面元素代码如下

<a href="#">标签a</a>
<a href="#">标签b</a>

可以这样定位元素

el = driver.find_element_by_partial_link_text("标签")     # 返回标签a元素
print(el)
els = driver.find_elements_by_partial_link_text("标签")   # 返回标签a、标签b元素
print(els)

by_tag_name

通过html标签定位元素。

假如页面元素代码如下

<div>元素1</div>
<div>元素2</div>

可以这样定位元素

el = driver.find_element_by_tag_name("div")
print(el)
els = driver.find_elements_by_tag_name("div")
print(els)

by_class_name

通过class属性值定位元素。

假如页面元素代码如下

<div class="el">元素1</div>
<div class="el">元素2</div>

可以这样定位元素

el = driver.find_element_by_class_name("el")
print(el)
els = driver.find_elements_by_class_name("el")
print(els)

by_xpath

XPath 是一门在 XML 文档中查找信息的语言。基于XML的树状结构,XPath提供在数据结构树中找寻节点的能力。

使用chrome自带的xpath定位元素的方法如下:

 复制出来的XPath地址如下

//*[@id="su"]  # 选取文档中id值为su的元素

说明:

  • //*:选取文档中的所有元素。
  • @:选取属性

selenium使用xpath定位效率上比上面的方法底,但胜在灵活性高。

使用xpath通过元素内容定位

假如页面元素代码如下

<a href="#">标签a</a>

可以这样定位元素

# 类似于by_link_text,通过参数值(标签a)精准匹配包含该值的元素
el1 = driver.find_element_by_xpath("//*[text()='标签a']")
print(el1)

# 类似于by_partial_link_text,通过参数值(标签)模糊匹配包含该值的元素
el2 = driver.find_element_by_xpath("//*[contains(text(), '标签')]")
print(el2)

定位结果

使用xpath通过元素属性定位

假如页面元素代码如下

<input type="text" name="username" id="username" placeholder="用户名">
<div class="el">元素1</div>

可以这样定位

el1 = driver.find_element_by_xpath("//*[@name='username']")     # 定位元素name属性值为"username"的元素
print(el1)
el2 = driver.find_element_by_xpath("//*[@placeholder='用户名']")       # 定位元素placeholder属性值为"用户名"的元素
print(el2)
el3 = driver.find_element_by_xpath("//*[@class='el']")      # 定位元素class属性值为"el"的元素
print(el3)

定位结果

使用xpath层级定位

假如页面代码如下

<div class="el">
    <span><a href="#">元素1</a></span>
    <span id="me"><a href="#">元素2</a></span>
</div>

 可以这样定位

# 定位子级元素
el = driver.find_element_by_xpath("//*[@id='me']/a")    # 定位id值为me下的a标签
print(el)
# 通过已定位元素定位子级元素
el_me = driver.find_element_by_id("me")
el1 = el_me.find_element_by_xpath("a")     # 定位该元素下的a标签
print(el1)

# 定位父级元素
el = driver.find_element_by_xpath("//*[@id='me']/..")
print(el)
# 通过已定位元素定位父级元素
el = el_me.find_element_by_xpath("..")
print(el)

# 定位同级元素
el = driver.find_element_by_xpath("//*[@id='me']/../span[1]")
print(el)
# 通过已定位元素定位同级元素
el = el_me.find_element_by_xpath("../span[1]")     # 如果一个元素有多个相同标签,可以通过索引定位指定标签,索引值从1开始
print(el)

 定位结果

使用xpath定位包含某属性的所有元素

假如页面代码如下

<div class="el">
    <span><a href="#">元素1</a></span>
    <span id="me"><a href="#">元素2</a></span>
</div>

可以这样定位

els = driver.find_elements_by_xpath("//*[@href]")
print(f"包含href属性的元素个数为:{len(els)}")

定位结果

by_css_selector

css_selector和xpath类似,该方法是基于css选择器对元素进行定位。

使用css_selector通过属性id定位元素

假如页面代码如下

<input type="text" name="username" id="username" placeholder="用户名">

可以这样定位

el = driver.find_element_by_css_selector("#username")       # 井号表示属性id
print(el)

使用css_selector通过属性class定位元素

 假如页面代码如下

<div class="el">元素1</div>

可以这样定位

el = driver.find_element_by_css_selector(".el")
print(el)

使用css_selector通过指定属性定位元素

假如页面代码如下

<input type="text" name="username" id="username" placeholder="用户名">

可以这样定位

# 通过属性定位
el = driver.find_element_by_css_selector("[placeholder='用户名']")    # 匹配元素的placeholder属性值为'用户名'的元素
print(el)

# 通过标签+属性定位
el = driver.find_element_by_css_selector("input[placeholder='用户名']")    # 匹配元素的标签为input且其placeholder属性值为'用户名'的元素
print(el)

# 通过多属性定位
el1 = driver.find_element_by_css_selector("#username[placeholder='用户名'][type='text']")
el2 = driver.find_element_by_css_selector("input#username[placeholder='用户名'][type='text']")
print(el1 == el2)

定位结果

使用css_selector通过模糊匹配属性值定位元素

假如页面代码如下

<input type="text" name="username" id="username" placeholder="用户名">

可以这样定位

# 模糊匹配
el = driver.find_element_by_css_selector("[name^=user]")  # 匹配name属性以user开头的元素
print(el)
el = driver.find_element_by_css_selector("[id$=name]")    # 匹配id属性以name结尾的元素
print(el)
el = driver.find_element_by_css_selector("[placeholder*=户]")    # 匹配placeholder属性包含户字的元素
print(el)

定位结果

使用css_selector层级定位

假如页面代码如下

<div class="el">
    <span><a href="#">元素2</a></span>
    <span id="me"><a href="#">元素2</a></span>
</div>

可以这样定位

# 定位子级元素
# 直接定位子集元素
el = driver.find_element_by_css_selector("#me > a:nth-child(1)")    # 定位id为me元素下的第一个a标签,若有且只有1个a标签可以不写:后的内容
print(el)
el = driver.find_element_by_css_selector("#me a:nth-child(1)")    # 定位id为me元素下的第一个a标签,若有且只有1个a标签可以不写:后的内容
print(el)

# 通过已知元素定位子级元素
el_me = driver.find_element_by_id("me")
el = el_me.find_element_by_css_selector("a:nth-child(1)")
print(el)

注:层级与层级之间以大于号>或空格分层,查找元素定位必须一层一层往下写,有多个则匹配多个

定位结果

使用css_selector定位包含某属性的所有元素

假如页面代码如下

<div class="el">
    <span><a href="#">元素1</a></span>
    <span id="me"><a href="#">元素2</a></span>
</div>

可以这样定位

els = driver.find_elements_by_css_selector("[href]")
print(f"包含href属性的元素个数为:{len(els)}")

定位结果


-事必有法,然后有成- 最后祝大家早日达到测试的天花板!



以下是我收集到的比较好的学习教程资源,虽然不是什么很值钱的东西,如果你刚好需要,可以留言【777】直接拿走就好了

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/662614.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

利用zOffice SDK实现合同续签系统

经过用户调研和实际考察发现。商务、政务和个人的真实使用场景中&#xff0c;很多用户会有通过“用户数据”“固定模板”生成“批量合同&#xff08;文件&#xff09;”的需求&#xff0c;并且存在着使用痛点。在在线办公不断发展的今天&#xff0c;我们需要一个在线编辑的工具…

使用Jsoup工具解析页面数据

前提是需要联网 F12打开浏览器控制台&#xff0c;通过元素找到需要爬取的数据 1、添加网页解析依赖 <!--解析网页依赖--> <dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.10.2</version&g…

【id:21】【1分】E. DS单链表--类实现

题目描述 用C语言和类实现单链表&#xff0c;含头结点 属性包括&#xff1a;data数据域、next指针域 操作包括&#xff1a;插入、删除、查找 注意&#xff1a;单链表不是数组&#xff0c;所以位置从1开始对应首结点&#xff0c;头结点不放数据 类定义参考 输入 n 第1行先输…

GRE over IPsec VPN配置

GRE over IPsec VPN配置 【实验目的】 理解GRE Tunnel的概念。理解GRE over IPsec VPN的概念。掌握GRE Tunnel的配置。掌握GRE over IPsec VPN的配置。验证配置。 【实验拓扑】 实验拓扑如下图所示。 实验拓扑 设备参数表如下表所示。 设备参数表 设备 接口 IP地址 子网…

Ziya:一个自回归、双语、开源和多功能的大语言模型

什么是Ziya&#xff1f; Ziya是一个基于LLaMa的130亿参数的中英双语预训练语言模型&#xff0c;它由IDEA研究院认知计算与自然语言研究中心&#xff08;CCNL&#xff09;推出&#xff0c;是开源通用大模型系列的一员。Ziya具备翻译&#xff0c;编程&#xff0c;文本分类&#…

JS中遍历对象的方法讲解

文章目录 for...in循环当使用for...in循环遍历对象时&#xff0c;需要注意以下几点&#xff1a; Object.keys()方法结合forEach()循环Object.entries()结合forEach()循环Object.getOwnPropertyNames()方法结合forEach()循环 在JavaScript中&#xff0c;有几种常用的方法可以用来…

runjs在vue2项目中的使用

安装run.js插件 安装chalk const { run } require(runjs) const chalk require(chalk) const config require(../vue.config.js) const rawArgv process.argv.slice(2) const args rawArgv.join( )if (process.env.npm_config_preview || rawArgv.includes(--preview)) …

【科普】Windows10如何关闭搜索功能中的广告? Windows10如何关闭自动更新?

目录 一、Windows10如何关闭搜索功能中的广告&#xff1f;1.1 问题描述1.2 关闭步骤1.2.1 关闭显示搜索1.2.2 修改注册表 二、Windows10如何关闭自动更新&#xff1f;2.1 问题描述2.2 关闭步骤 一、Windows10如何关闭搜索功能中的广告&#xff1f; 1.1 问题描述 windows10的搜…

云安全技术(五)之评估云服务供商

评估云服务提供商 Evaluate Cloud Service Providers 1.1 根据标准认证 Verification against criteria ISO/EC 27001和27001:2013NIST SP 800-53支付卡行业数据安全标准(PCI DSS)SOC 1、SOC 2和SOC 3通用准则(Common Criteria)FIPS 140-2 1.2 系统/子系统产品认证 System/su…

pytest - 使用pytest过程中的5大超级技巧(实例详解篇)

从简单的断言和测试用例组织到更先进的参数化和夹具管理&#xff0c;pytest提供了强大的功能和灵活性。让我们一起探索这些技巧&#xff0c;使你的测试变得更加高效精准&#xff01; 无需担心阅读时间过长&#xff0c;本文已经为您准备了详尽的解析和实际示例。立即开始&#…

基于MATLAB的前景检测器实现道路车辆实时检测跟踪(完整代码分享)

交通问题越来越开始影响着人们的生产和生活,由于汽车拥有量的急剧增加,城市交通问题日益严重,因此交通问题开始成为人们关心的社会热点。在我国,近年来,交通事故频繁发生,有效的交通监测和管理已迫在眉睫。 完整代码: clc; clear; close all; warning off; addpath(gen…

redis源码之:字典dict

先来看看dict的大致结构&#xff1a; debug所用demo如下&#xff1a; void testDict(); int main(int argc, char **argv) {testDict(); } void testDict(){dict *dict0 dictCreate(&hashDictType, NULL);//注意key要用sds,如果是普通字符串&#xff0c;长度会判为0&…

这年头不会还有人纯文字聊天吧 ?教你用Python一键获取斗图表情包

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 很多兄弟在聊天上没有下太多的功夫&#xff0c;导致自己聊天的时候很容易尬住&#xff0c; 然后就不知道聊啥了&#xff0c;这时候合适表情包分分钟就能救场&#xff0c; 但是一看自己收藏的表情包&#xff0c;好家伙…

【MySQL】一文带你彻底了解事务机制

文章目录 何谓事务&#xff1f;事务的特性&#xff1a;ACID事务的操作隔离性引发的并发问题不可重复读和幻读有什么区别 事务的隔离级别MySQL 的隔离级别是基于锁实现的吗&#xff1f;默认隔离级别解决幻读的方法总结 我们设想一个场景&#xff0c;这个场景中我们需要插入多条相…

网络安全学术顶会——CCS '22 议题清单、摘要与总结(下)

注意&#xff1a;本文由GPT4与Claude联合生成。 161、Secure Auctions in the Presence of Rational Adversaries 密封竞标拍卖用于在一组感兴趣的参与者之间分配资源。传统上&#xff0c;拍卖需要一个受信任的拍卖师在场&#xff0c;竞标者向其提供他们的私人出价。然而&#…

Flask简单入门

Flask 是一个使用 Python 编写的轻量级 Web 应用框架。它使用 Werkzeug 作为底层 WSGI 实现&#xff0c;而 Jinja2 则是其默认模板引擎。Flask 的设计简单易用&#xff0c;灵活性高&#xff0c;可以快速构建出完整功能的 Web 应用。 本文将从 Flask 的基础知识介绍、开发环境…

基于SSD算法的电动车头盔检测【附代码】

本项目是基于SSD算法实现的电动车头盔检测。完整的项目是基于SSD的改进-->知识蒸馏-->自蒸馏-->剪枝-->trt推理。本想用来发论文的&#xff0c;但可能没那时间和精力了&#xff0c;这里仅选择项目中的一部分内容进行开源。 目录 开源说明 项目功能说明 项目代码…

尚硅谷微信小程序开发 仿网易云音乐App 小程序 后端接口服务器搭建

小程序学习 尚硅谷微信小程序开发 项目网易云小程序学习地址&#xff1a; 01-尚硅谷-小程序-课程介绍_哔哩哔哩_bilibili 视频相关的教程文档与笔记分享 链接&#xff1a;https://pan.baidu.com/s/1aq7ks8B3fJ1Wahge17YYUw?pwd7oqm 提取码&#xff1a;7oqm 配套服务器 老师…

还敢说你会接口测试吗?全覆盖接口测试扫描总结(详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 接口的本质及其工…

搭建SpringBoot项目 详细教程

一、搭建SpringBoot项目 这个项目&#xff0c;可以作为种子项目&#xff0c;我打算把它放置Gitee上。包含大部分web开发的相关功能&#xff0c;后期所有的Spring Boot项目都可以用这个项目&#xff0c;简单修改一下配置&#xff0c;就可以快速开发了。 选择Spring initializr…