Selenium 相对定位

目录

前言:

相对定位

工作原理

可用的相对定位

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([])

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

express框架学习笔记

express简介 express是一个基于Node.js平台的极简的、灵活的WEB应用开发框架。express是一个封装好的工具包,封装了很多功能,便于我们开发WEB应用(HTTP服务) express使用 新建express文件夹新建文件test01.js,代码如…

深蓝学院C++基础与深度解析笔记 第 5 章 语句

1. 语句基础 ● 语句的常见类别 – 表达式语句:表达式后加分号,对表达式求值后丢弃,可能产生副作用 – 空语句:仅包含一个分号的语句,可能与循环一起工作 – 复合语句(语句体):由大…

电商数仓(用户行为采集平台)数据仓库概念、用户行为日志、业务数据、模拟数据、用户行为数据采集模块、日志采集Flume

1、数据仓库概念 数据仓库( Data Warehouse ),是为企业制定决策,提供数据支持的。可以帮助企业,改进业务流程、提高产品质量等。 数据仓库的输入数据通常包括:业务数据、用户行为数据和爬虫数据等。 业务数…

流场粒子追踪精度数值实验

在计算流线,拉格朗日拟序结构等流场后处理时,我们常常需要计算无质量的粒子在流场中迁移时的轨迹,无质量意味着粒子的速度为流场当地的速度。此时,求解粒子的位移这个问题是一个非常简单的常微分方程问题。 假设流场中存在 i 个粒…

Java版本+企业电子招投标系统源代码之电子招投标系统建设的重点和未来趋势

计算机与网络技术的不断发展,推动了社会各行业信息化的步伐。时至今日,电子政务、电子商务已经非常普及,云计算、大数据、工业4.0、“互联网”等发展理念也逐步深入人心,如何将传统行业与互联网科技有效结合起来,产生1…

Vue实现元素沿着坐标数组移动,超出窗口视图时页面跟随元素滚动

一、实现元素沿着坐标数组移动 现在想要实现船沿着下图中的每个河岸移动。 实现思路: 1、将所有河岸的位置以 [{x: 1, y: 2}, {x: 4, y: 4}, …] 的形式保存在数组中。 data() {return {coordinateArr: [{ x: 54, y: 16 }, { x: 15, y: 31 }, { x: 51, y: 69 }…

升级Nginx

目录 前言 一、升级Nginx 1)首先在官网下载一个新版本的Nginx 2)首先将下载的压缩包进行解包 3)进入已解包的目录中 4)配置安装路径 5)make 6)备份原来Nginx的资源 7)重启Nginx服务 8&#…

【2023最全教程】Web自动化测试怎么做?Web自动化测试的详细流程和步骤

一、什么是web自动化测试 自动化(Automation)是指机器设备、系统或过程(生产、管理过程)在没有人或较少人的直接参与下,按照人的要求,经过自动检测、信息处理、分析判断、操纵控制,实现预期的目…

毕业季Android开发面试,有哪些常见的题?

前言 对于计算机行业早已烂大街,随之而来的毕业季。还会有大批的程序员涌进来,而我们想要继续进入Android开发岗位的人员,最先考虑的是面试。面试题是我们决定踏进工作的重要环节。 对于刚毕业的实习生来说,如何在应聘中脱颖而出…

LightningChart .NET 10.5.1 Crack LightningChart 2023

LightningChart .NET v.10.5.1 已经发布! DataCursor 和 3D TransparencyRenderMode 现在可用。 为所有 3D、Polar 和 Smith 系列启用 DataCursor 在早期阶段,LightningChart 提供了不同的工具,需要用户编写额外的代码才能启用数据跟踪功能。…

控制您的数据:Web3私有链为数据主权带来的突破性变革

在数字化时代,数据已经成为企业和个人最宝贵的资产之一。然而,随着大规模数据泄露和滥用事件的频发,数据主权和隐私保护成为了备受关注的问题。在这个背景下,Web3私有链的出现为数据主权带来了一场突破性的变革。 首先&#xff0c…

风景类Midjourney prompt提示词

稳定输出优美风景壁纸的Midjourney prompt提示词。 1\在夏夜,有淡蓝色的星空,海边,流星,烟花,海滩上全是蓝色的玫瑰和绿色的植物,由Ivan Aivazovsky和Dan Mumford,趋势在cgsociety,…

windows2022证书配置.docx

Windows证书的配置 要求两台主机,一台作为域,一台进入域 按要求来选择角色服务 确认之后安装 安装完以后配置证书服务 选择服务 按要求配置 注:此处不用域用户登陆无法使用企业CA 按要求来 创建新的私钥 这几处检查无误后默认即可 有效期…

AJAX概述

1.1什么是AJAX. Ajax即AsynchronousJavascript And XML:异步数据回调。 使用Ajax技术网页应用能够快速地将更新呈现在用户界面上,不需要重载(刷新)整个页面【只刷新局部】,这使得程序能够更快地回应用户的操作。、 1…

2023年5月青少年机器人技术等级考试理论综合试卷(四级)

青少年机器人技术等级考试理论综合试卷(四级)2023.6 分数: 100 题数: 30 一、 单选题(共 20 题, 共 80 分) 1.Arduino C 语言, 部分程序如下, 串口监视器输出结果是“D”时, 变量 i …

【集群】Haproxy搭建Web群集

文章目录 一、Haproxy 相关概念1. Haproxy 的概述2. Haproxy 的主要特性3. 常见的 Web 集群调度器4. 常见的应用分析4.1 LVS 应用4.2 Haproxy 应用4.3 LVS、Nginx、Haproxy的区别 5. Haproxy 调度算法原理5.1 roundrobin5.2 static-rr5.3 leastconn5.4 source5.5 uri5.6 url_pa…

SpringBoot + Vue前后端分离项目实战 || 二:Spring Boot后端与数据库连接

系列文章: SpringBoot Vue前后端分离项目实战 || 一:Vue前端设计 文章目录 新建Spring后台项目添加依赖 新建数据库IDEA 连接数据库IDEA 自动创建类实体定义数据传递至前端的格式 B站视频讲解:2023全网最简单但实用的SpringBootVue前后端分离…

RTC

文章目录 前言驱动应用程序运行 前言 RTC(Real Time Clock,实时时钟)是个常用的外设,通过 RTC 我们可以知道日期和时间信息,因此在需要记录时间的场合就需要实时时钟。 可以使用专用的实时时钟芯片来完成此功能&#…

扫雷小游戏【C语言】

目录 前言 一、基本实现逻辑 二、实现步骤 1. 我们希望在进入游戏时有一个菜单让我们选择 2. 我们希望可以重复的玩(一把玩完了还可以接着玩) 3. 采用多文件形式编程 4.要扫雷先得有棋盘(创建棋盘R*N) 5.初始化棋盘 6.打…

【网络安全】深入解析 PHP 代码审计技术与实战

前言 登录某个网站并浏览其页面时,注意到了一些看起来不太对劲的地方。这些迹象可能是该网站存在漏洞或被黑客入侵的标志。为了确保这个网站的安全性,需要进行代码审计,这是一项专门针对软件代码进行检查和分析的技术。在本文中,…