全网最细,web自动化测试实战场景(滚动元素的滚动操作)直接上干g货......

news2025/1/16 19:56:46

前言

使用 selenium 进行 web 自动化测试对我们来说是个常规操作。用了很多次后,我们经常会抱怨 selenium 封装的操作实在是太少了。

比如说 selenium 没有对页面的滚动提供丰富 API , 有的只有一个孤零零的 location_once_scrolled_into_view 方法,把一个元素滚动到可视范围之内。 这远远不能满足日常的需求啊!要知道,现在大多数的网页都需要不停的滚动鼠标加载新内容。

如果是单个窗口的滚动还好,但是遇到一些变态的 ERP 系统就为难了。 每一个页面都像是战国时代的诸侯国,被割裂成一块块相互独立的模块,每个模块都需要滚动操作, 全局的窗口滚动根本就不好使。

我们来看一个例子。
打开禅道的演示页面, 除了窗口本身需要滚动以获取底部的更多内容以外, “最新动态” 和 “我的待办” 都有自己独立的滚动条。

这样的模块实现的技术有几种。有的会把一个区域的内容放在一个 iframe 当中,有的是包裹在一个 div 标签当中。不管是哪一种方式,实际上,我们都可以把他们当成是单个元素进行处理,如何来操作这些可以被滚动的元素呢?

上面说过,官方的 Selenium API当中只有一个 el.location_once_scrolled_into_view 方法把某个元素滚动到可视范围内。这个方法并不够灵活,如果想要更加灵活的操作,比如滑动到底部、滑动一半等,就需要借助 JavaScript 。 基本上,如果 selenium 没有实现的操作,都可以借助 JS 操作。

对于一个网页的 DOM 对象来说呢,有全局的 window.scrollTo 方法,可以对整个窗口实现滚动操作。如果想把网页滚动到最底部,可以在任意网页按 F12 进入开发者工具,选择 console 输入 JS 代码:

 window.scrollTo(0, document.body.scrollHeight);

同样的, 在 DOM 对象当中,也实现了对单个元素的滚动操作。 直接设置元素的 scrollTop 属性,表示讲可滚动元素的高度设置到多高。以禅道为例,如果要把 “最新动态” 这个元素向下滚动 800px,可以编写对应的 JS 代码:

// 定位元素
el = document.querySelector("div[data-name=最新动态]>div.panel-body");
 // 向下滚动 800 像素
el.scrollTop = 800;

 如果想滚动到一半,也可以通过元素的 scrollHeight 属性控制:

el.scrollTop = el.scrollHeight * 0.5;

 如果元素可以左右滚动,则可以设置元素的 scrollLeft 属性:

el.scrollLeft = el.scrollWidth * 0.5;

通过设置 scrollTop 和 scrollLeft 属性有时候比较麻烦,可以适用 scrollTo 方法简化操作, 表示滚动到一半的宽度,一半的高度;

el.scrollTo(el.scrollWidth * 0.5, el.scrollHeight * 0.5);

也可以适用 scrollBy 表示从现在的位置往右边和下边滑动多少像素点:

el.scrollBy(el.scrollWidth * 0.1, el.scrollHeight * 0.1);

如果希望通过 Selenium 实现滚动操作,可以调用 selenium 当中的 execute_script 方法去执行对应的js语句。要实现上面的效果,可以访问页面之后,执行 JS 语句:

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://demo.zentao.net/my/")
js_code = """
el = document.querySelector("div[data-name=最新动态]>div.panel-body");
el.scrollTo(0, el.scrollHeight);
"""
driver.execute_script(js_code);

 对 selenium 比较熟悉的同学可以封装一个上层 API, 当需要执行滚动操作时,直接调用方法就可以了:

class SeleniumUpAPI:
     """Selenium的上层封装"""
     def __init__(self, driver:Remote):
         self.driver = driver
 
     def element_scroll_to(self, el:WebElement, x_percent=0, y_percent=0):
         """滚动元素到百分比位置.
         x: 宽度的比率,0.5
         y: 高度的比率,0.5
         """
         jscode = """arguments[0].scrollTo(
             arguments[1] * arguments[0].scrollWidth,
             arguments[2] * arguments[0].scrollHeight
             );
         """
         self.driver.execute_script(jscode, el, x_percent, y_percent)

最后完整的代码:

import time
from selenium.webdriver import Remote, Chrome
from selenium.webdriver.remote.webelement import WebElement
 
class SeleniumUpAPI:
     """Selenium的上层封装"""
     def __init__(self, driver:Remote):
         self.driver = driver
 
     def element_scroll_to(self, el:WebElement, x_percent=0, y_percent=0):
         """滚动元素到百分比位置.
         x: 宽度的比率,0.5
         y: 高度的比率,0.5
         """
         jscode = """arguments[0].scrollTo(
             arguments[1] * arguments[0].scrollWidth,
             arguments[2] * arguments[0].scrollHeight
             );
         """
         self.driver.execute_script(jscode, el, x_percent, y_percent)
 
     def element_scroll_by(self, el:WebElement, x_percent=0, y_percent=0):
         """每次滚动多少个像素点,以元素百分比操作
         x: 宽度的比率,0.1
         y: 高度的比率,0.1
         """
         jscode = """arguments[0].scrollBy(
             arguments[1] * arguments[0].scrollWidth,
             arguments[2] * arguments[0].scrollHeight
             );
         """
         self.driver.execute_script(jscode, el, x_percent, y_percent)
 
 
 
class Element:
     def scroll(self, x_percent=0, y_percent=0):
         """滚动.
         x: 宽度的比率,0.5
         y: 高度的比率,0.5
         """
         jscode = """arguments[0].scroll({
             top:arguments[1] * arguments[0].scrollHeight,
             left:arguments[1] * arguments[0].scrollWidth
             });
         """
         self.driver.execute_script(self, el, y_percent, x_percent)
 
if __name__ == "__main__":
     driver = Chrome()
     driver.get("https://example.cypress.io/commands/actions")
     d = SeleniumUpAPI(driver)
     el = d.driver.find_element("id", "scroll-vertical")
     el.location_once_scrolled_into_view
     time.sleep(2)
     d.scroll_element(el, 0.5, 0.5)

             【下面是我整理的2023年最全的软件测试工程师学习知识架构体系图】


一、Python编程入门到精通


二、接口自动化项目实战 

三、Web自动化项目实战


四、App自动化项目实战 

五、一线大厂简历


六、测试开发DevOps体系 

七、常用自动化测试工具


八、JMeter性能测试 

九、总结(尾部小惊喜)

生命不息,奋斗不止。每一份努力都不会被辜负,只要坚持不懈,终究会有回报。珍惜时间,追求梦想。不忘初心,砥砺前行。你的未来,由你掌握!

生命短暂,时间宝贵,我们无法预知未来会发生什么,但我们可以掌握当下。珍惜每一天,努力奋斗,让自己变得更加强大和优秀。坚定信念,执着追求,成功终将属于你!

只有不断地挑战自己,才能不断地超越自己。坚持追求梦想,勇敢前行,你就会发现奋斗的过程是如此美好而值得。相信自己,你一定可以做到!

资料获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片进群领取。

【软件测试技术交流(资料分享)】:320231853(备注C)icon-default.png?t=N5F7http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=eU1h9ykztGeBOGy_wSKn0v33ThZlM8Xh&authKey=3aLC55z%2F7ZglBlNu5uwQopOR2WZAlAuFDvJ6sqEnXLJP8y9fvuhBS0p%2FNOTaZyQG&noverify=0&group_code=320231853

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

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

相关文章

css 解决多张图片显示时出现的空白间隙问题

1、出现的间隙 在后端设置富文本时,添加了多张图片,但是到前台展示时,每2张图片直接都会多出一个间隙; 2、空白间隙产生的原因 在网上查阅资料时,发现是由于图片设置了display: inline-block;属性,使图…

任意分频器电路设计

目录 任意分频器电路设计 1、任意偶数分频器电路设计 1.2、实验任务 1.3、程序设计 1.3.1、代码如下: 1.3.2、编写仿真 TB 文件 2、任意奇数分频器电路设计 2.1、实验任务 2.2、程序设计 2.2.1、奇数分频电路代码 2.2.2、编写仿真 TB 文件 2.2.3、仿真验…

关于前端项目安全问题的一些思考

1.路由守卫,本地路径与本地存储加密后的该用户所有能访问的的路径列表对比,是否有权限,这个要搞个一级页面-二级页面三级页面这种记录下来,后台管理员开启后赋予用户访问某些页面的权限,即能打开相关菜单的权限&#x…

【吴恩达老师《机器学习》】课后习题2之【逻辑回归(logistic_regression)】

逻辑回归-线性可分 用于解决输出标签y为0或1的二元分类问题 判断邮件是否属于垃圾邮件?银行卡交易是否属于诈骗?肿瘤是否为良性?等等。 案例:根据学生的两门学生成绩,建立一个逻辑回归模型,预测该学生是否会被大学录…

卷积码编码器的结构与表示

本专栏包含信息论与编码的核心知识,按知识点组织,可作为教学或学习的参考。markdown版本已归档至【Github仓库:https://github.com/timerring/information-theory 】或者公众号【AIShareLab】回复 信息论 获取。 文章目录 卷积码基础卷积码的…

Oracle数据库startup mount时的报错处理(ORA-01078LRM-00109)

安装监听 Disconnected [oraclerac1 ~]$ netcaOracle Net Services Configuration:[oraclerac1 ~]$ sqlplus / as sysdbaSQL*Plus: Release 11.2.0.4.0 Production on Tue Jun 20 22:50:36 2023Copyright (c) 1982, 2013, Oracle. All rights reserved.Connected to an idle …

学习adaboost(三,第二次迭代,c#实现)

我们改进了第一次迭代:第二次迭代如下:因为三个弱分类器都是犯了3次错误,我们故意选了y>6.5,标签1,else,标签-1;第一个弱分类器已经选了,再选一次没意义,不会有任何进展&#xff…

搞钱!如何拿下奖金534万的全国人工智能大赛?

嗨咯,大家好,我是K同学啊! 介于最近训练营中经常有同学问我,有哪些比较好的知识变现渠道,这几天整理出了一个个人认为还不错的关于深度学习方面的大赛(就奖金比较多而已)分享给大家。 攻略 | …

prisma 结合 mongodb 查询地理空间坐标,实现 “附近的人”功能

前言:我们创建一个集合,添加测试数据,并执行 mongodb 的地理空间查询,返回需要的数据。 1、通过schema.prisma, 创建 store 集合 2、通过 prisma/client ,插入 几条测试数据 // 构造测试数据createList: async () >…

CMIP6数据处理方法与典型案例分析

气候变化关系到农业、生态系统、社会经济和人类生存与发展,是当今世界关注的重点问题之一。IPCC(Intergovernmental Panel on Climate Change)第6次评估报告指出,自 20 世纪 50 年代以来,从全球平均气温和海温升高、大…

Seata TCC 模式下解决幂等、悬挂、空回滚问题 | Spring Cloud56

一、前言 通过以下系列章节: docker-compose 实现Seata Server高可用部署 | Spring Cloud 51 Seata AT 模式理论学习、事务隔离及部分源码解析 | Spring Cloud 52 Spring Boot集成Seata利用AT模式分布式事务示例 | Spring Cloud 53 Seata XA 模式理论学习、使用…

antd-vue - - - - - date-picker组件在非本地不好使?无法切换日期?

date-picker组件在非本地不好使?无法切换日期? 1.问题描述2.问题原因 & 解决办法 离离原上谱,真的是离了大谱 记录一个深深的踩坑记录!!! 选择日期,肯定要选择ui组件的date-picker&#xf…

tensorflow基础知识

计算图的理解 ref: https://zhuanlan.zhihu.com/p/344846077 计算图模型由节点(nodes)和线(edges)组成,节点表示操作符/算子Operator,线表示计算间的依赖。实线表示有数据传递的依赖,传递的数…

【LeetCode】HOT 100(17)

题单介绍: 精选 100 道力扣(LeetCode)上最热门的题目,适合初识算法与数据结构的新手和想要在短时间内高效提升的人,熟练掌握这 100 道题,你就已经具备了在代码世界通行的基本能力。 目录 题单介绍&#…

three.js中通过gsap动画库实现物体的动画

一、什么是gsap GSAP(GreenSock Animation Platform)是一个JavaScript动画库,由GreenSock公司开发,用于在Web应用程序中创建高性能动画。 使用GSAP可以通过一些简单的动画操作来实现复杂的动画效果,例如TweenLite、T…

临期商品app小程序软件开发

临期商品APP小程序是一种专门销售或推广临近保质期商品的应用程序,以下是可能有助于临期商品APP小程序软件开发的功能: 商品展示:允许用户查看和浏览不同种类的临期商品,包括产品图片、描述、价格等信息。 用户登录和注册…

笔记:WebRTC 网络技术理论与实战(二)

WebRTC技术笔记 笔记:WebRTC 网络技术理论与实战(一) 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 :291148484163.com 本文地址:https://blog.csdn.n…

【Flutter——复选框实例代码超详细讲解!】

Flutter——复选框实例代码超详细讲解! 文章目录 Flutter——复选框实例代码超详细讲解!代码实现效果代码实例代码结构总结 代码实现效果 代码实例 import package:flutter/material.dart; // 导入 Flutter 的核心库void main() {runApp(const MyApp())…

linux-2.6.22.6内核poll总结

1.为什么需要poll,其原因是当进行某些操作时,该操作会一直消耗cpu,浪费资源,所以引入poll可以让该进程在指定时间内如果没有结果产生(可以是某个操作或者获取数据)则进行休眠,这样就会释放cpu。…

【MySQL】数据库基础 ②

✍LIKE 子句 说明: 使用 SELECT 来查询数据, 同时我们可以在 SELECT 语句中使用 WHERE 子句来获取指定的记录。 WHERE 子句中可以使用等号 来设定获取数据的条件,如 "字段(text_title) 值()"。 但是有时候我们需要获取 text_…