Selenium 相对定位

news2024/11/23 20:26:30

目录

前言:

相对定位

工作原理

可用的相对定位

Above

Below

Left of

Right of

Near

链式相对定位

相对于WebElement的相对定位

实例演示


前言:

Selenium传统定位基本能解决80%的定位需求,但是还是有一些复杂场景传统定位定不到的场景。在现在框架横行的年代以及快速迭代的开发流程中,开发为了完成任务很多html文档都没有id,class或者其他易于识别的dom元素,虽然使用绝对路径能够定位到,但是你不能保证下次是有效的。因此大部分定位语法基本是使用相对路径定位的,但是相对定位也有个缺点就是有时候定位会有N个匹配,特别是笔者公司做的报表平台,很多控件是复用的,因此你定位到的元素不一定就是你想交互的元素,使用Selenium相对定位能很好解决这个痛点。

相对定位

Selenium 4引入了相对定位器(以前称为友好定位器)。当不容易为所需元素构造定位器,但很容易在空间上描述元素相对于具有易于构造定位器的元素的位置时,这些定位器是有用的

工作原理

Selenium使用JavaScript函数getBoundingClientRect()来确定页面上元素的大小和位置,并可以使用这些信息来定位相邻的元素。找到相关元素。

相对定位器方法可以将先前定位的元素引用或另一个定位器作为原点的参数。在这些示例中,我们将仅使用定位器,但您可以在最后的方法中用元素对象交换定位器,它也会起作用。

让我们考虑下面的例子来理解相对定位器。

在这里插入图片描述

可用的相对定位

Above

如果由于某种原因,电子邮件文本字段元素不容易识别,但密码文本字段元素可以识别,我们可以使用它是密码元素“上方”的“输入”元素这一事实来定位文本字段元素。

from selenium.webdriver.common.by import By
from selenium.webdriver.support.relative_locator import locate_with
email_locator = locate_with(By.TAG_NAME, "input").above({By.ID: "password"})

Below

如果密码文本字段元素由于某种原因不容易识别,但电子邮件文本字段元素是,我们可以使用它是电子邮件元素“下面”的“输入”元素这一事实来定位文本字段元素。

password_locator = locate_with(By.TAG_NAME, "input").below({By.ID: "email"})

Left of

如果由于某种原因,取消按钮不容易识别,但提交按钮元素是,我们可以使用取消按钮元素是提交元素“左侧”的“按钮”元素这一事实来定位取消按钮元素。

cancel_locator = locate_with(By.TAG_NAME, "button").to_left_of({By.ID: "submit"})

Right of

如果提交按钮由于某种原因不容易识别,但取消按钮元素是,我们可以使用提交按钮元素是取消元素右侧的“按钮”元素这一事实来定位提交按钮元素。

submit_locator = locate_with(By.TAG_NAME, "button").to_right_of({By.ID: "cancel"})

Near

如果相对定位不明显,或者根据窗口大小而变化,可以使用near方法来识别距离所提供定位器最多50像素的元素。一个很好的用例是使用一个表单元素,该元素没有一个容易构建的定位器,但它的相关输入标签元素有。

email_locator = locate_with(By.TAG_NAME, "input").near({By.ID: "lbl-email"})

链式相对定位

如果需要,也可以链式定位器。有时,元素最容易被识别为既在一个元素的上方/下方,又在另一元素的右侧/左侧。

submit_locator = locate_with(By.TAG_NAME, "button").below({By.ID: "email"}).to_right_of({By.ID: "cancel"})

 其中to_right_of、above、to_left_of、below 传参类型为element_or_locator: Union[WebElement, Dict] = None,可以是webelement如:

 news_loc = (By.XPATH, "//*[@id='hotsearch-content-wrapper']//li//a//span[@class='title-content-title']")

 new_element=driver.find_element(*news_loc)

或者字典:

to_right_of({By.XPATH: "//*[@id='s-usersetting-top']"})

near方法多了一个int类型的入参表示相对其他定位元素的距离。可以使用near方法来识别距离所提供定位器最多50像素的元素

near(30)

相对于WebElement的相对定位

 在Selenium webdriver.remote.webelement源码中发现存在find_element和find_elements2个方法,这在查找元素子节点元素是非常有效的,避免了写不必要的定位语法

    def find_element(self, by=By.ID, value=None) -> WebElement:
    def find_elements(self, by=By.ID, value=None) -> List[WebElement]:

如以下示例,定位这个百度热搜,可以先定位到上面一级,然后根据上面一级往下定位

 

element=driver.find_element(By.ID,'hotsearch-content-wrapper')
elements=element.find_elements(By.TAG_NAME,'li')

实例演示

import logging
import time

import pytest
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import By
from selenium.webdriver.support.relative_locator import locate_with


class TestRelative:
    @pytest.mark.skip
    def test_relative_loc_locate_with(self):
        # 点击百度新闻信息
        driver = webdriver.Chrome()

        driver.get('https://www.baidu.com')
        driver.maximize_window()
        # driver.implicitly_wait(15)
        news_loc = (By.XPATH, "//*[@id='hotsearch-content-wrapper']//li//a//span[@class='title-content-title']")
        # 定位后返回RelativeBy对象,需要用find_elements来解析,locate_with比较适合定位多个元素的比如本例的新闻列表
        input_baidu = locate_with(*news_loc)
        elements = driver.find_elements(input_baidu)

        for element in elements:
            logging.info(element.get_attribute('textContent'))
            # logging.info(element.text)
            if element.get_attribute('textContent') == '书写历史 建立友谊 增进互信':
                element.click()
            time.sleep(1)
        assert '书写历史 建立友谊 增进互信' in driver.page_source
if __name__ == '__main__':
    pytest.main([])

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

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

相关文章

C语言:实现有序序列判断

题目: 输入一个整数序列,判断是否是有序序列,有序,指序列中的整数从小到大排序或者从大到小排序(相同元素也视为有序)。 输入描述: 第一行输入一个整数N (3≤N≤50) 。 第二行输入N个整数,用空格分隔N个整数…

面试滑铁卢,被HR坑惨了......

阎王易见,小鬼难缠。我一直相信这个世界上好人居多,但是也没想到自己也会在阴沟里翻船。我感觉自己被字节跳动的HR坑了。 在这里,我只想告诫大家,offer一定要拿到自己的手里才是真的,口头offer都是不牢靠的&#xff0…

C++学习之详解命名空间

1.理解命名空间 namespace命名空间正如翻译的那样给命名划分空间,每个函数名或变量等都有自己的使用范围,避免的使用函数名冲突的问题; 打个比方,一个班如果有两人叫做张三,那么其中如何区分这两个人那么就得给他们起…

UI自动化测试 | Jenkins配置优化

前一段时间帮助团队搭建了UI自动化环境,这里将Jenkins环境的一些配置分享给大家。 背景: 团队下半年的目标之一是实现自动化测试,这里要吐槽一下,之前开发的测试平台了,最初的目的是用来做接口自动化测试和性能测试&…

如何判断一家公司值不值得去?

通常职场新手都有这样的困惑:收到某某公司的面试(或者offer),我该不该去呢? 为什么有这样的困惑? 大部分原因是因为海投简历导致的。刚出来工作时,我也海投过简历,不管公司好不好&a…

Java使用jna调用c开发的动态库dll文件

文章目录 前言1.c开发动态库dll1.1 新建项目dllDemo1.2 选择C library 在选择shared1.3 项目的目录结构1.4 定义动态库函数1.5 导出动态库 2.java中使用jna调用dll2.1 需要引入jna的依赖2.2 加载动态库dll2.3 测试程序2.3.1 测试代码:2.3.2 测试结果输出 前言 在日…

maven的依赖范围scope使用

测试依赖的范围 #1、依赖范围 标签的位置:dependencies/dependency/scope 标签的可选值:compile/test/provided/system/runtime/import #①compile 和 test 对比 main目录(空间)test目录(空间)开发过程…

linux重新安装Yapi

需要保留原来Yapi对应的数据,这样就不需要安装mongo。 1. 安装Yapi npm install -g yapi-cli —registry https://registry.npm.taobao.org yapi server2.平台部署配置 安装成功后,默认端口是9000,开发服务器9000端口,需要服务…

崩盘预警币圈项目:Fintoch(分投趣)为何模式能做千亿资金?

崩盘预警币圈项目:Fintoch(分投趣)为何模式能做千亿资金? 大家好,小编是微三云的胡佳东,一家软件开发公司的负责人 Fintoch(分投趣)为何模式崩盘前能够吸引如此巨额资金&#xff1f…

供应链 | 基于图神经网络和深度强化学习的柔性车间调度方法

编者按 本次解读的文章发表于IEEE TRANSACTIONS ON INDUSTRIAL INFORMATICS,原文摘要总结如下:本文考虑了众所周知的灵活作业车间调度问题,并通过提出一种新颖的深度强化学习(DRL)方法来端到端地学习高质量的优先级调度…

SpringBoot实现过滤器Filter的三种方式

# 实现Filter接口方式① 使用Filter接口方式② 使用Component注解方式③ Java Config 配置类 # 实现Filter接口 过滤器 Filter 由 Servlet 提供,基于函数回调实现链式对网络请求与响应的拦截与修改。由于基于 Servlet ,其可以对web服务器管理的几乎所有…

重复消费和堆积

接受消息会重复这一现状,然后通过一些方法来消除重复消息对业务的影响 利用幂等性解决重复消息问题 幂等(其任意多次执行所产生的影响均与一次执行的影响相同。) 一个幂等的方法,使用同样的参数,对它进行多次调用和一…

flutter七牛云上传sdk插件qiniu_flutter_sdk使用

flutter七牛云上传sdk插件qiniu_flutter_sdk使用 最近在拆分代码,将上传组件设置成插件,下面记录下实现过程。 一、创建flutter_plugin上传插件 这里Android Studio使用创建plugin 填写一下信息 Project nameProject locationDescriptionProject typ…

单片机入门所需的基础数电和模电知识

要学习单片机并入门相关领域,推荐掌握以下数电和模电的基础知识: 数电知识: 布尔代数和逻辑门:了解布尔代数的基本概念和逻辑门的工作原理,包括与门、或门、非门、与非门、或非门、异或门等。 时序逻辑和时钟信号&a…

AIOps介绍

AIOps介绍 AIOps是指人工智能运维(Artificial Intelligence for IT Operations)的缩写。它是将人工智能(AI)和机器学习(ML)技术应用于IT运维领域的一种方法。 传统的IT运维通常需要人工监测和管理大量的系…

脑机接口科普0022——黑门02:伦理道德问题

本文禁止转载!!!! 脑机接口这个技术,是属于黑科技技术中的一种。 现在已经有很多专家,以及机构,提出脑机接口的存在的一些问题。法律是一块的问题,伦理道德是另一块的问题。 虽然…

苹果iPhone14卡死怎么办?解决办法分享!

正常使用的iPhone14虽然很少会出现卡死的情况,但iPhone就是一台微型电脑,像电脑一样“死机”也不是没可能。 有用户称在使用iPhone14时出现突然出现弹出的提示框无法点击取消,锁屏也解决不了死机的问题。同时又因为屏幕其他区域不能操作&…

MySQL免安装配置教程(win10)

一、下载安装包 1.1、下载zip包 打开官网地址下载zip安装包,这里下载的版本是5.7,可自行选择。 对应下载网址:https://downloads.mysql.com/archives/community/ 根据自己电脑进行选择对应安装包 若需要下载msi安装包(图形化界…

Mysql漏洞处理之升级版本到5.7.42过程指导手册

一、背景 某次安全漏扫,发现MySQL大量漏洞,基于Mysql之用于内网,且版本确实有点旧,考虑升级,综合漏洞分析,只能升级到最新版5.7.42和8.0.33,现场环境:Mysql 5.7.28、5.7.20和mysql&…

高等职业学院校园IP网络广播应用-河北资源环境职业技术学院校园IP广播

职业院校大学校园IP网络广播在河北资源环境职业技术学院产教融合基地的应用 北京海特伟业科技任洪卓发布于2023年6月20日 一、高等职业院校校园IP网络广播系统-广播中心 河北资源环境职业技术学院产教融合基地-高等职业院校校园IP网络广播系统是基于TCP/IP协议校园局域网构建…