selenium-wire兼容selenium和requests
背景
在工作中UI自动化中可能会需要用到API来做一些数据准备或清理的事情,那UI操作是略低效的,但API操作相对高效。
而实战课就有这样一个案例,不过那个案例是UI操作和API分开的。
极少会遇到这样的场景,我selenium操作网页,比如登录,应该底层也是有响应数据的,比如token之类的,那我是否可以通过UI操作获取到的token直接去发送后续的业务请求,而不是再在API层从头来一把(也是可以的)。
主角
这个库名叫selenium-wire ,pypi上其实蛮多类似的库的,比如selenium-requests,requests-selenium啥的,多是唬人的。
Github: https://github.com/wkeeling/selenium-wire
安装就不说了,直接看示例
from seleniumwire import webdriver # Import from seleniumwire
# Create a new instance of the Chrome driver
driver = webdriver.Chrome()
# Go to the Google home page
driver.get('https://www.google.com')
# Access requests via the `requests` attribute
for request in driver.requests:
if request.response:
print(
request.url,
request.response.status_code,
request.response.headers['Content-Type']
)
从代码看,几点区别
- 导入这里
from seleniumwire import webdriver,后续就跟原来的selenium类似了 - driver.requests是个关键的对象,这个对象的属性很多
- 首先它是个列表
List[Request] - 属性包括请求部分的:body、url、headers、params、abort()、cert、date、host、id、method等
- 响应是request.response:body、headers、cert、date、reason、status_code,注意并没有text、json等
- 首先它是个列表
实例
from seleniumwire import webdriver
from time import sleep
import json
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('http://124.223.31.21:9097/#/')
driver.find_element('id', 'formLabelAlign.username').send_keys('账号')
js = "document.querySelector('[placeholder=请输入密码]').value='密码'"
driver.execute_script(js)
driver.find_element('css selector', '.submit>button').click()
sleep(2)
for request in driver.requests:
if request.url.endswith('/api/loginS'):
result = json.loads(request.response.body)
print(result)
说明几点
账号密码,vip学员自行获取
这个网站有个坑,输入密码要特殊处理,所以我用的js操作
结果部分我就去取了登录接口的path(已知的)
然后用json转了下body(bytes对象)
结果
{'flag': '松勤教育', 'code': 200, 'message': '登录成功', 'data': {'studentId': 20155007, 'studentName': '翠花', 'grade': '2015', 'major': '网络工程', 'clazz': '1', 'institute': '软件工程学院', 'tel': '13900000000', 'email': 'sqqdcl@163.com', 'pwd': '', 'cardId': '2423423', 'sex': '女', 'role': '2'}, 'token': 'eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiLnv6DoirEiLCJzdWIiOiLnv6DoirEiLCJpYXQiOjE2OTM1NjAwOTF9.VDbx07ALrnAoohrYHZJBHcLRsTkUzCGe5VD4u6I7Qvc'}
我就分析到这里了,后续的自行搞定啦,关键是这个库不好找,我也是做个备忘
selenium-wire兼容selenium和requests的更多相关文章
- 火狐兼容selenium版本解决
火狐和selenium不是很好兼容,下面提供一些我所知道的可以兼容的版本: 1. 火狐52+selenium 3.3 +geckodriver v0.15.0 2.火狐59+selenium 3.11 ...
- Selenium UI自动化测试 Selenium Automatic Testing
https://www.cnblogs.com/sunada2005/archive/2013/12/22/3486314.html UI Automatic Testing 1. 什么样的项目适合自 ...
- Selenium IDE和Selenium RC的安装
1 安装FireBug和FirePath 1.在火狐浏览器中,点击”添加附件”按钮,弹出”附加组件管理器”页面 2.在弹出页面中,输入“fireBug”,点击“搜索”按钮,弹出fireBu ...
- Selenium Tutorial (2) - Selenium IDE In Depth
Installing Firefox and Firebug Installing and Opening Selenium IDE Starting with test cases and test ...
- web自动化测试python+selenium学习总结----selenium安装、浏览器驱动下载
一.安装selenium 命令安装selenium库 :pip install -U selenium 查看selenium是否安装成功:pip list PS:有时会有异常,安装失败,可以尝试去s ...
- Selenium Web 自动化 - Selenium(Java)环境搭建
Selenium Web 自动化 - Selenium(Java)环境搭建 2016-07-29 1 下载JDK JDK下载地址:http://www.oracle.com/technetwork/j ...
- Selenium Web 自动化 - Selenium常用API
Selenium Web 自动化 - Selenium常用API 2016-08-01 目录 1 对浏览器操作 1.1 用webdriver打开一个浏览器 1.2 最大化浏览器&关闭浏览器 ...
- Selenium WebDriver VS Selenium RC
WebDriver到底是什么? WebDriver是一个Web的自动化测试框架,它支持你执行你的测试用例在不同的浏览器上面,并不像Selenium一样只支持Firefox. WebDriv ...
- Django学习系列2:django环境中安装selenium并查看selenium版本号
在Django环境中安装selenium (django) root@ranxf-TEST:/studydisk/Python_web_TDD/superlists# conda install se ...
- Selenium 上手:Selenium扫盲区
Selenium 自述Selenium 是由Jason Huggins软件工程师编写的一个开源的浏览器自动化测试框架.主要用于测试自动化Web UI应用程序. Selenium 工作原理通过编程语言( ...
随机推荐
- 万字长文详述ClickHouse在京喜达实时数据的探索与实践
1 前言 京喜达技术部在社区团购场景下采用JDQ+Flink+Elasticsearch架构来打造实时数据报表.随着业务的发展 Elasticsearch开始暴露出一些弊端,不适合大批量的数据查询,高 ...
- JDK动态代理和CGLIB代理有什么区别
JDK动态代理和CGLIB代理都是实现Spring框架中AOP的代理方式,它们的实现原理和应用场景有所不同, 具体区别如下: 1. 实现原理: JDK动态代理是基于Java反射机制实现的,它要求目标类 ...
- 基于 Dash Bio 的生物信息学数据可视化
Dash 是用于搭建响应式 Web 应用的 Python 开源库.Dash Bio 是面向生物信息学,且与 Dash 兼容的组件,它可以将生物信息学领域中常见的数据整合到 Dash 应用程序,以实现响 ...
- Python 日期和时间函数使用指南
在本教程中,我们将介绍 python 的 datetime 模块以及如何使用它来处理日期.时间,以及日期时间的格式化处理.它包含各种实用示例,可帮助您通过 python 函数更加快捷高效进行日期和时间 ...
- 信息收集_网络扫描_nmap
信息收集_网络扫描nmap 目标说明 -iL <inputname> (从列表或文件输入) -iR <hostnum> (随机选择生成目标数量) --exclude <h ...
- 【技术积累】Python中的PyTorch库【一】
PyTorch库介绍 PyTorch是一个基于Python的科学计算库,用于构建深度学习神经网络.它主要由两个部分组成:一个是PyTorch Tensor库,提供了类似于NumPy的数组操作,但是支持 ...
- 解码器 | 基于 Transformers 的编码器-解码器模型
基于 transformer 的编码器-解码器模型是 表征学习 和 模型架构 这两个领域多年研究成果的结晶.本文简要介绍了神经编码器-解码器模型的历史,更多背景知识,建议读者阅读由 Sebastion ...
- 2023-06-19:讲一讲Redis分布式锁的实现?
2023-06-19:讲一讲Redis分布式锁的实现? 答案2023-06-19: Redis分布式锁最简单的实现 要实现分布式锁,确实需要使用具备互斥性的Redis操作.其中一种常用的方式是使用SE ...
- C#/.Net的多播委托到底是啥?彻底剖析下
前言 委托在.Net里面被托管代码封装了之后,看起来似乎有些复杂.但是实际上委托即是函数指针,而多播委托,即是函数指针链.本篇来只涉及底层的逻辑,慎入. 概括 1.示例代码 public delega ...
- mysql concat函数的用法
mysql中的这个函数非常强大,可以对查出的参数进行拼接,其实这个方法在java中也有api可以进行调用. 那么什么时候进行使用呢?例如,你老大叫你做一个数据库的数据采集,需要整理成文档,那么这个时候 ...