当前位置: 首页 > news >正文

Requestium - 将Requests和Selenium合并在一起的自动化测试工具

Requests 是 Python 的第三方库,主要用于发送 http 请求,常用于接口自动化测试等。

Selenium 是一个用于 Web 应用程序的自动化测试工具。Selenium 测试直接运行在浏览器中,就像真正的用户在操作一样。

本篇介绍一款将 Requests 和 Selenium 结合在一起的自动化测试工具 - Requestium

简介

Requestium 是一个 Python 库,它将 Requests、Selenium 和 Parsel 的功能合并为一个用于自动化 web 操作的集成工具。

该库是为编写 web 自动化脚本而创建的,这些脚本主要使用请求编写,但能够在维护会话的同时,无缝切换到网站中 JavaScript 密集部分的 Selenium。

Requestium 为 Requests 和 Selenium 添加了独立的改进,并且每一个新功能都经过了延迟评估,因此即使编写只使用 Requests 或 Selenium 的脚本,它也很有用。

特点:

1、在维护当前 web 会话的同时,启用请求会话和 Selenium web 驱动程序之间的切换。

2、将 Parsel 的解析器集成到库中,使 xpath、css 和 regex 的编写更加简洁。

3、改进了 Selenium 对动态加载元素的处理。

4、使 Selenium 中的 cookie 处理更加灵活。

5、使 Selenium 中的点击元素更加可靠。

6、本机支持 Chromedriver,并添加自定义网络驱动程序。

安装:

pip install requestium

如果你使用 Requestium 的 Selenium 部分,例如 Chromedriver,那么你应该下载 Selenium Web 驱动程序。

快速上手

首先,像处理请求一样创建一个会话,如果使用 web 驱动程序,可以选择添加参数。
#!/usr/bin/env python

# -*- coding: utf-8 -*-
# 公众号:咖啡加剁椒from requestium import Session, Keysoptions = {'arguments': ['headless']}
s = Session(webdriver_path='./chromedriver', default_timeout=15, webdriver_options=options)

由于无头模式很常见,因此有一个快捷方式可以指定 headless=True。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 公众号:咖啡加剁椒from requestium import Session, Keyss = Session(webdriver_path='./chromedriver' headless=True)

你也可以在 Requestium 之外创建一个 Selenium 网络驱动程序,并使用它:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 公众号:咖啡加剁椒from selenium import webdriver
from requestium import Session, Keysfirefox_driver = webdriver.Firefox()s = Session(driver=firefox_driver)

你不需要解析响应,当调用 xpath,css 或 re 时,它会自动完成。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 公众号:咖啡加剁椒
title = s.get('http://samplesite.com').xpath('//title/text()').extract_first(default='Default Title')

与 Python 的标准 re 模块相比,正则表达式需要更少的代码。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 公众号:咖啡加剁椒
response = s.get('http://samplesite.com/sample_path')# Extracts the first match
identifier = response.re_first(r'ID_\d\w\d', default='ID_1A1')# Extracts all matches as a list
users = response.re(r'user_\d\d\d')

你可以切换到使用 Selenium Webdriver 来运行任何 js 代码。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 公众号:咖啡加剁椒s.transfer_session_cookies_to_driver()
s.driver.get('http://www.samplesite.com/sample/process')

最后,你可以切换回使用 Requests。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 公众号:咖啡加剁椒s.transfer_driver_cookies_to_session()
s.post('http://www.samplesite.com/sample2', data={'key1': 'value1'})

等待元素

ensure_element_by_ 方法等待元素在浏览器中加载,并在加载后立即返回。它以 Selenium的 find_element_by_ 方法命名(如果找不到元素,它们会立即引发异常)。

Requestium 可以等待一个元素处于以下任何状态:

存在(默认)

可点击

看得见的

不可见(可用于等待加载… GIF 消失等)

这些方法对于单页面 Web 应用程序非常有用,其中站点动态地更改其元素。我们通常最终完全用 ensure_element_by_ 调用替换我们的 find_element_by_ 调用,因为它们更灵活。使用这些方法获取的元素具有新的 ensure_click 方法,这使得点击不太容易失败。这有助于解决 Selenium 点击的许多问题。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 公众号:咖啡加剁椒s.driver.ensure_element_by_xpath("//li[@class='b1']", state='clickable', timeout=5).ensure_click()# === We also added these methods named in accordance to Selenium's api design ===
ensure_element_by_id
ensure_element_by_name
ensure_element_by_link_text
ensure_element_by_partial_link_text
ensure_element_by_tag_name
ensure_element_by_class_name
ensure_element_by_css_selector

添加 Cookie

ensure_add_cookie 方法使得添加 Cookie 更加稳健。Selenium 需要浏览器在能够添加 Cookie 之前处于 Cookie 的域中,此方法为此提供了几种解决方法。如果浏览器不在 Cookie 域中,它会先获取域然后再添加 Cookie。它还允许你在添加 Cookie 之前覆盖域,并避免执行此 GET。域可以被覆盖为 ’’,这将把 Cookie 的域设置为驱动程序当前所在的任何域。如果无法添加 cookie,它会尝试使用限制性较小的域(例如:home.site.com -> site.com)进行添加,然后在失败之前。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 公众号:咖啡加剁椒cookie = {"domain": "www.site.com","secure": false,"value": "sd2451dgd13","expiry": 1516824855.759154,"path": "/","httpOnly": true,"name": "sessionid"}
s.driver.ensure_add_cookie(cookie, override_domain='')

使用 Requestium 示例

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 公众号:咖啡加剁椒from requestium import Session, Keys# If you want requestium to type your username in the browser for you, write it in here:
reddit_user_name = ''s = Session('./chromedriver', default_timeout=15)
s.driver.get('http://reddit.com')
s.driver.find_element_by_xpath("//a[@href='https://www.reddit.com/login']").click()print('Waiting for elements to load...')
s.driver.ensure_element_by_class_name("desktop-onboarding-sign-up__form-toggler",state='visible').click()if reddit_user_name:s.driver.ensure_element_by_id('user_login').send_keys(reddit_user_name)s.driver.ensure_element_by_id('passwd_login').send_keys(Keys.BACKSPACE)
print('Please log-in in the chrome browser')s.driver.ensure_element_by_class_name("desktop-onboarding__title", timeout=60, state='invisible')
print('Thanks!')if not reddit_user_name:reddit_user_name = s.driver.xpath("//span[@class='user']//text()").extract_first()if reddit_user_name:s.transfer_driver_cookies_to_session()response = s.get("https://www.reddit.com/user/{}/".format(reddit_user_name))cmnt_karma = response.xpath("//span[@class='karma comment-karma']//text()").extract_first()reddit_golds_given = response.re_first(r"(\d+) gildings given out")print("Comment karma: {}".format(cmnt_karma))print("Reddit golds given: {}".format(reddit_golds_given))
else:print("Couldn't get user name")

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:【文末小卡片领取】

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

相关文章:

Requestium - 将Requests和Selenium合并在一起的自动化测试工具

Requests 是 Python 的第三方库,主要用于发送 http 请求,常用于接口自动化测试等。 Selenium 是一个用于 Web 应用程序的自动化测试工具。Selenium 测试直接运行在浏览器中,就像真正的用户在操作一样。 本篇介绍一款将 Requests 和 Seleniu…...

mysql和pg等数据库之间的数据迁移实战分享

mysql和pg等数据库之间的数据迁移是常见的问题:比如一开始使用Oracle,后来想使用mysql,而且需要把Oracle数据库的数据迁移到mysql里面;后期有想使用pg数据库,同时需要把Mysql数据库的数据迁移到pgl里面,等等…...

消息中间件都有哪些

RabbitMQ:这可是一个开源的消息代理软件,也叫消息中间件。它支持多种消息传递协议,可以轻松地在分布式系统中进行可靠的消息传递。 Kafka:Apache Kafka是一个分布式流处理平台,它主要用于处理实时数据流。Kafka的设计初…...

数据结构(3)内核链表

一、内核链表 内核链表是一种在操作系统内核中使用的数据结构,主要用于管理和组织内核对象。它是有头双向链表的一种实现。 内核链表的特点 双向链表: 内核链表的每个节点都包含指向前一个节点和后一个节点的指针,这使得在链表中进行插入和删除操作时更…...

Linux 硬件学习 s3c2440 arm920t蜂鸣器

1.查找手册时钟图,输入12m想要通过pll得到400m的信号 2.对比pll值,找到最近的为405,得到pll中mdiv为127,pdiv为2,sdiv为1 3.想要得到fclk400,hclk100,pclk50,对比分频比例&#xff0…...

提交保存,要做重复请求拦截,避免出现重复保存的问题

**问题:**前端ajax提交数据的时候,当频繁点击的时候,或者两个账号以相同数据创建的时候,会出现问题。 **处理办法:**前端拦截,防止重复提交数据,在上一次请求返回结果之后才允许提交第二次&…...

华为 HCIP-Datacom H12-821 题库 (3)

有需要题库的可以看主页置顶​​​​​​​ 1.运行 OSPF 协议的路由器在交互 DD 报文时,会使用以下哪一个参数选举主从关系? A、接口的 IP 地址 B、接口的 DR 优先级 C、Area ID D、Router ID 答案:D 解析: Router-ID 大的为主&a…...

spring-boot 事件

事件触发时机常用监听器描述ApplicationStartingEvent应用启动时LoggingApplicationListener:决定加载哪个日志系统ApplicationEnvironmentPreparedEvent创建Environment之后BootstrapApplicationListener:加载spring-cloud bootstrap配置文件&#xff1…...

合碳智能 × Milvus:探索化学合成新境界——逆合成路线设计

合碳智能(C12.ai)成立于2022年,致力于运用AI和具身智能技术,为药物研发实验室提供新一代智能化解决方案,推动实验室从自动化迈向智能化,突破传统实验模式与人员的依赖,解决效率和成本的瓶颈&…...

二分查找 | 二分模板 | 二分题目解析

1.二分查找 二分查找的一个前提就是要保证数组是有序的&#xff08;不准确&#xff09;&#xff01;利用二段性&#xff01; 1.朴素二分模板 朴素二分法的查找中间的值和目标值比较 while(left < right) // 注意是要&#xff1a; < {int mid left (right -left) / 2;…...

uni-app应用更新(Android端)

关于app更新&#xff0c;uni-app官方推荐的是 uni-upgrade-center&#xff0c;看了下比较繁琐&#xff0c;因此这里自己实现检查更新并下载安装的逻辑。 1.界面效果 界面中的弹框和 进度条采用了uView 提供的组件 2.检查更新并下载安装 一、版本信息配置在服务端&#xff0c…...

JavaEE(2):前后端项目之间的交互

现在&#xff0c;在网页中通过超链接&#xff0c;表单就可以向后端发送请求&#xff0c;后端也可以正常响应内容。 以前通过表单访问后端的请求方式称为同步请求 同步请求 当网页与后端交互时&#xff0c;前端不能再进行其他操作 服务器端响应回来的内容&#xff0c;会把整个浏…...

(已开源-CVPR 2024)YOLO-World: Real-Time Open-Vocabulary Object Detection

169期《YOLO-World Real-Time Open-Vocabulary Object Detection》 You Only Look Once (YOLO) 系列检测模型是目前最常用的检测模型之一。然而&#xff0c;它们通常是在预先定义好的目标类别上进行训练&#xff0c;很大程度上限制了它们在开放场景中的可用性。为了解决这一限制…...

Spring6梳理4——SpringIoC容器

以上笔记来源&#xff1a; 尚硅谷Spring零基础入门到进阶&#xff0c;一套搞定spring6全套视频教程&#xff08;源码级讲解&#xff09;https://www.bilibili.com/video/BV1kR4y1b7Qc 目录 4.1 前言 4.2 IoC容器 4.2.1 控制反转(IoC) 4.2.2 依赖注入 4.2.3 IoC容器在Spri…...

SpringBoot2:请求处理原理分析-FORM表单请求接口

一、RESTFUL简介 Rest风格支持&#xff08;使用HTTP请求方式&#xff0c;动词来表示对资源的操作&#xff09; 以前&#xff1a;/getUser 获取用户 /deleteUser 删除用户 /editUser 修改用户 /saveUser 保存用户 现在&#xff1a; /user GET-获取用户 DELETE-删除用户 PUT-修改…...

Monkey日志ANR、CRASH、空指针异常及其他异常数据分析

引言 在Android开发过程中&#xff0c;monkey测试是一种常用的随机测试手段&#xff0c;用于模拟用户的各种操作来发现应用中的稳定性问题。通过monkey测试生成的日志文件包含了丰富的信息&#xff0c;包括应用程序崩溃&#xff08;Crash&#xff09;、无响应&#xff08;ANR&…...

Vue 3结合Element Plus中,实现一个级联选择器(Cascader)来展示省市区

在Vue 3结合Element Plus中&#xff0c;实现一个级联选择器&#xff08;Cascader&#xff09;来展示省市区&#xff08;甚至到更细分的级别&#xff0c;如街道、小区等&#xff09;的联动选择是一个常见的需求。Element Plus的Cascader组件非常适合这样的场景&#xff0c;因为它…...

使用卫星仿真软件STK的一些应用和思考(星地链路、星间链路)

目录 任务描述利用STK建模星地协同系统3个GEO高轨卫星240/20/1 Walker-Star Constellation 低轨卫星星座地面站或者地面设备 链路建模与数据提取处理星地链路星间链路数据读取的几种方法最麻烦的方法使用Matlab与STK互联接口使用大规模使用Chain 总结 任务描述 在一个星地协同…...

pytorch对不同的可调参数,分配不同的学习率

在 PyTorch 中&#xff0c;你可以通过为优化器传递不同的学习率来针对不同的可调参数分配不同的学习率。这通常通过向优化器传递一个字典列表来实现&#xff0c;其中每个字典指定特定参数组的学习率。下面是一个示例代码&#xff0c;展示了如何实现这一点&#xff1a; import …...

零基础学习Python(八)—— time模块、request模块、数据分析和自动化办公相关模块、jieba模块、文件操作和os相关模块的简单介绍

1. time模块 time()&#xff1a;获取当前时间戳&#xff0c;是一个数字 localtime()&#xff1a;返回一个time.struct_time对象&#xff0c;里面有年月日时分秒&#xff0c;还有星期几&#xff08;0表示星期一&#xff09;和今年的第几天 import timeprint(time.time()) pri…...

Qwen3-Reranker-4B实战教程:Qwen3-Reranker-4B在智能法务合同审查中的条款关联重排

Qwen3-Reranker-4B实战教程&#xff1a;Qwen3-Reranker-4B在智能法务合同审查中的条款关联重排 1. 引言 你有没有遇到过这样的情况&#xff1f;一份几十页的合同摆在面前&#xff0c;你需要快速找到所有与“违约责任”相关的条款&#xff0c;但它们在文档里散落各处&#xff…...

Qwen3-32B .NET应用开发:智能文档处理系统

Qwen3-32B .NET应用开发&#xff1a;智能文档处理系统 1. 开篇&#xff1a;为什么需要智能文档处理 每天我们都要面对各种各样的文档&#xff1a;合同、报告、发票、表格...手动处理这些文档不仅耗时耗力&#xff0c;还容易出错。想象一下&#xff0c;如果能有一个系统自动读…...

鸿蒙_ArkUI组件同时支持双击和单击事件

我们常用的点击事件是onClick&#xff0c;想要实现双击需要用TapGesture手势实现&#xff0c;那么如果一个组件同时需要支持单击和双击&#xff0c;则需要使用GestureGroup&#xff0c;我们新建一个页面来测试一下&#xff1a;Entry Component struct TestDoubleClick {State m…...

如何快速搭建个人数字图书馆:Talebook私有书库终极指南

如何快速搭建个人数字图书馆&#xff1a;Talebook私有书库终极指南 【免费下载链接】talebook 一个简单好用的个人书库 项目地址: https://gitcode.com/gh_mirrors/ta/talebook 想要拥有一个属于自己的数字图书馆吗&#xff1f;Talebook是一个基于Calibre的简单好用的个…...

OpenClaw截图分析功能:Qwen3.5-9B多模态界面理解案例

OpenClaw截图分析功能&#xff1a;Qwen3.5-9B多模态界面理解案例 1. 为什么需要截图分析功能 在日常工作中&#xff0c;我经常遇到需要分析软件界面、排查异常或生成报告的场景。传统方式要么依赖人工截图标注&#xff0c;要么需要开发专门的自动化脚本&#xff0c;效率低下且…...

2026年成都最值得关注的整合营销推广推荐榜单

推荐1 &#xff1a;橙意机构 [整合营销推广服务]橙意机构简介橙意机构致力于打造一条集合多领域的创意产业生态链&#xff0c;以策略与咨询、创意内容创作、全媒体传播、创新技术开发为核心引擎&#xff0c;在互动营销、品牌整合、公关活动、广告策略及设计、影视制作、短视频运…...

SmartComm:零堆内存的嵌入式命令通信框架

1. SmartComm 嵌入式设备间通信库深度解析SmartComm 是一个专为资源受限嵌入式系统设计的轻量级、零堆内存依赖的设备间命令通信框架。它不依赖动态内存分配&#xff08;malloc/free&#xff09;&#xff0c;全部对象生命周期由栈管理&#xff0c;适用于 STM32F0/F1/F4、ESP32、…...

Java 线程、进程、CPU缓存、MESI

一、进程&线程 1、什么是进程&#xff08;process&#xff09; 进程是操作系统中运行的一个任务&#xff08;一个应用程序运行在一个进程中&#xff09;。 进程是一块包含了某些资源的内存区域&#xff0c;操作系统利用进程把它的工作划分为一些功能单元。 进程中包含的…...

Semantic Kernel 深度解析:微软的 Agent 开发框架

Semantic Kernel 深度解析:微软的 Agent 开发框架 摘要/引言 开门见山(Hook) 你有没有想过,像《钢铁侠》里贾维斯那样的通用智能助手,会不会在202X年就不再是科幻电影的专属?当我们打开手机的Siri、电脑的Cortana或者ChatGPT网页版,它们确实能回答问题、写邮件、甚至生…...

让开发流程更高效:为 Visual Studio 订阅用户解锁 Syncfusion杉

一、什么是requests&#xff1f; requests 是一个用于发送HTTP请求的 Python 库。 它可以帮助你&#xff1a; 轻松发送GET、POST、PUT、DELETE等请求 处理Cookie、会话等复杂性 自动解压缩内容 处理国际化域名和URL 二、应用场景 requests 广泛应用于以下实际场景&#xff1a; …...