Selenium 4 引入了关联元素定位策略(Relative Locators)。这种方式主要是应对一些不好定位的元素,但是其周边相关联的元素比较好定位。实现步骤是先定位周边较容易定位的元素,再根据关联元素定位策略定位到想定位的那个元素。如下以具体案例讲解用法。

以页面relative_locator1.html为例,用于后续测试用。渲染页面,如图所示。

Above模式

假定“输入用户名”input元素不好定位,而“输入密码”input元素容易定位,此时就可用relative locator的Above模式定位到“输入用户名”input元素。实现通过password input元素获取到username input元素,并且在username输入框输入字符“name1”。代码如下:

#大牛测试qq:2574674466from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.relative_locator import locate_with
#这是在mac上执行的基于chrome浏览器上的测试,如下driver地址请根据实际情况进行修改。
chrome_driver_server = Service("/Users/xxx/Downloads/chromedriver")
driver  = webdriver.Chrome(service=chrome_driver_server)#如下是打开本地文件,请根据实际地址进行改写
driver.get("file:///Users/jason118/PycharmProjects/selenium4.0-automation/Chapter4/relative_locator1.html")
#通过relative locator的above方式先获取到password input,然后再获取username input.
username_locator = locate_with(By.TAG_NAME,"input").above({By.ID: "id_pass"})
username = driver.find_element(username_locator)username.send_keys('name1')

Below模式

以上面html为例,假设“输入密码”input元素不好定位,而“输入用户名”input元素容易定位,则可利用relative locator的Below模式定位到“输入密码”input元素。实现通过username input元素获取到password input元素,并且在password输入框输入字符“password1”。代码如下:

password_locator = locate_with(By.TAG_NAME,"input").below({By.ID: "id_username"})
password = driver.find_element(password_locator)
password.send_keys('daniu')

Left of模式

以上面html页面为例,假设“取消”按钮不好定位,而右边的“登录”按钮较容易定位,则可用relative locator的Left of模式定位到“取消”按钮元素。代码如下。

cancel_locator = locate_with(By.TAG_NAME,"button").to_left_of({By.ID: "id_login"})
cancel_element = driver.find_element(cancel_locator)
#输出取消按钮
print(cancel_element)

Right of模式

以上面html为例,假设“登录”按钮不好定位,而左边的“取消”按钮较容易定位,则可利用relative locator的Right of模式定位到“登录”按钮元素,代码如下。

#通过relative locator的Right of方式先获取到"取消"按钮,然后再获取"登录"按钮.
login_locator = locate_with(By.TAG_NAME,"button").to_right_of({By.ID: "id_cancel"})

Near模式

常用于某些元素与元素之间的相对关系不是很明显,如元素A并不是在元素B的正上方、正下方、正右边、正左边等,可采用Near模式,即在某元素的附近(方圆50px之内)也可被定位到。以上面html为例,如果要定位“输入用户名:”label元素,可以先定位username输入框元素,再使用Near模式定位到label标签,代码如下。

label_username_locator = locate_with(By.TAG_NAME,"label").near({By.ID: "id_username"})
label_username_element = driver.find_element(label_username_locator)
print(label_username_element)

Chaining relative locators模式

Chaining relative locators模式。意思是目标元素的位置既满足在元素A的“Above”位置,又满足在元素B的“Right of” 位置。以上面html为例,假设“取消”按钮元素不好定位,可以利用这种模式进行定位,需满足“输入密码”label元素的“Below”位置,又满足“登录”按钮元素的“Left of”位置,代码如下。

cancel_button_locator = locate_with(By.TAG_NAME,"button").below({By.ID: "id_label2"}).to_left_of({By.ID: "id_login"})
cancel_button_element = driver.find_element(cancel_button_locator)
#输出元素对象
print(cancel_button_element)

Selenium4新特性-关联定位策略相关推荐

  1. html5新特性 gps,老生常谈H5新特性:地理定位

    HTML5新特性 1.新的语义标签 2.表单2.0 3.视频和音频 4.Canvas绘图 5.SVG绘图 6.地理定位 7.拖放API 8.WebWorker 9.WebStorage 10.WebS ...

  2. oracle 10g在线重定义新特性——关联对象自动重命名(二)

    9i的在线重定义存在一个问题,执行完在线重定义后,表的名称虽然保持不变,但是索引.约束.触发器等关联对象的名称会发生变化,有时候这会带来一定的问题,而要在事后手工修改,会比较麻烦. 10g的在线重定义 ...

  3. HTML5 新特性 - 地理定位(基于高德地图API)

    定位的基础与原理 IP定位 运营商基站定位 GPS定位 地理定位的实现 地理定位API允许用户向web应用程序提供他们的位置(经纬度).但是这个操作需要用户授权. 获取地理定位的相关代码如下: let ...

  4. 【SpringBoot】2021终极版shiro+jwt整合策略,包含shiro1.5+新特性,极简配置,全网独家。

    2021终极版shiro+jwt整合策略,包含shiro1.5+新特性,极简配置,全网独家. 前言:shiro1.4的配置之繁琐业内闻名,其实它自1.5之后就有了不小的改进,能够大大精简我们前期的整合 ...

  5. 新特性解读 | MySQL 8.0 新密码策略(上)

    作者:杨涛涛 资深数据库专家,专研 MySQL 十余年.擅长 MySQL.PostgreSQL.MongoDB 等开源数据库相关的备份恢复.SQL 调优.监控运维.高可用架构设计等.目前任职于爱可生, ...

  6. 【JDK8语法新特性】:超全总结{lamda,stream,optional,新日期类API},JDK8对策略模式支持,可以直接贴代码运行测试。

    文章目录 Java8新特性 速度快 代码更少(增加了新的语法,lamda表达式)(主要) 强大的Stream API(主要) 便于并行 最大减少空指针异常(Optional API) 提供了线程安全的 ...

  7. 分而治之:Oracle 18c 及 12.2 分区新特性的 N 种优化实践(含PPT)

    关注"数据和云",精彩不容错过 本文根据 杨廷琨 2018 年 5 月 11 日在[第九届中国数据库技术大会]上的演讲内容整理而成,关注公众号并回复 "Yangtingk ...

  8. mysql 5.6特性_MySQL 5.6新特性概览

    MySQL5.6 features This is the MySQL™ Reference Manual. It documents MySQL 5.6 through 5.6.28 添加的新特性( ...

  9. 笔记③:牛客校招冲刺集训营---C++工程师(5.9 C++新特性)

    0625 C++工程师 第5章 高频考点与真题精讲 5.1 指针 & 5.2 函数 5.3 面向对象(和5.4.5.5共三次直播课) 5.3.1 - 5.3.11 5.3.12-38 5.6 ...

最新文章

  1. ram在计算机网络中表示的是,2018年职称计算机考试题库(20)
  2. 【LeetCode 剑指offer刷题】查找与排序题14:Wiggle Sort(系列)
  3. 07.full text query_string查询
  4. Mysql Incorrect string value问题解决
  5. 如何在子网中访问上层网络的计算机文件夹
  6. VUE2)vue-devtools的安装与使用
  7. 不是单组分组函数_面向对象编程是否已淘汰?函数式编程的枪口瞄错了对象
  8. oracle instead of update触发器,oracle INSTEAD OF 触发器
  9. Unity3D基础27:C#随机函数与物体销毁
  10. Linux安装php-7.0.16,完成php和apache的配置
  11. Python编程之画圆
  12. “芝诺大数据教学科研平台”荣获“2018大数据应用优秀案例”
  13. 有哪些超好用的邮件群发软件?这款做邮件推广的一定要试试!
  14. 中国细胞治疗第二届年会会议议程
  15. Java 逐行读写 TXT 文件
  16. 电池高压安全注意事项
  17. IT高薪者所具备的人格魅力(上)
  18. 基于STM32的简易RTOS分析-时间片轮转调度
  19. python爬取玉米、小麦、水稻信息数据到本地为网页形式和mysql数据库中
  20. C++整数快速读写(快速读入+快速写)

热门文章

  1. 开源B2B2C WSTMart商城系统开发框架及插件介绍
  2. GD32F303固件库开发(17)----内部Flash读写
  3. 雷神加速器无限更新失败️️️
  4. 解决vmware虚拟机和宿主机之间不能复制粘贴问题
  5. 垃圾分类小程序,识别和站点查询,答题,用户后台管理集一体的小程序
  6. linux+记账软件下载,快速记账软件下载-快速记账appv3.11.0-Linux公社
  7. mysql源码分析——InnoDB的内存应用整体架构源码
  8. 经典蓝色横向二级导航栏
  9. 创建一个8*8的国际象棋棋盘(黑块为0,白块为1)
  10. js小题狂练(2)-用户英文名规范