背景
在工作中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': '[email protected]', 'pwd': '', 'cardId': '2423423', 'sex': '女', 'role': '2'}, 'token': 'eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiLnv6DoirEiLCJzdWIiOiLnv6DoirEiLCJpYXQiOjE2OTM1NjAwOTF9.VDbx07ALrnAoohrYHZJBHcLRsTkUzCGe5VD4u6I7Qvc'}
我就分析到这里了,后续的自行搞定啦,关键是这个库不好找,我也是做个备忘