首页 > 其他分享 >Selenium与requests共存的一个库 selenium-wire

Selenium与requests共存的一个库 selenium-wire

时间:2023-09-01 18:00:58浏览次数:60  
标签:wire Selenium driver request import requests response selenium

背景

在工作中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']
        )

从代码看,几点区别

  1. 导入这里from seleniumwire import webdriver,后续就跟原来的selenium类似了
  2. driver.requests是个关键的对象,这个对象的属性很多
    1. 首先它是个列表List[Request]
    2. 属性包括请求部分的:body、url、headers、params、abort()、cert、date、host、id、method等
    3. 响应是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)

说明几点

  1. 账号密码,vip学员自行获取

  2. 这个网站有个坑,输入密码要特殊处理,所以我用的js操作

  3. 结果部分我就去取了登录接口的path(已知的)

  4. 然后用json转了下body(bytes对象)

  5. 结果

    {'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'}
    
    

我就分析到这里了,后续的自行搞定啦,关键是这个库不好找,我也是做个备忘

标签:wire,Selenium,driver,request,import,requests,response,selenium
From: https://www.cnblogs.com/wuxianfeng023/p/17672596.html

相关文章

  • [-004-]-Python3+Unittest+Selenium Web UI自动化测试之部署Jenkins后脚本无界面执行
    一、场景:jenkins构建selenium自动化用例的时候,会有jenkins自带服务后台运行自动化脚本,可无界面运行IE、Chrome、Firefox。 二、解决办法:managejenkis-节点-添加节点 三、填写信息如下:    四、此时看到新建robot节点,但未启动五、点击节点robot,详情界面显示了......
  • python selenium报错ValueError: Timeout value connect was <...>, but it must be an
    最近学习爬虫,安装selenium,很简单地执行代码,但是一直报错。importtimeimportopenpyxlfromseleniumimportwebdriverfromselenium.webdriver.common.keysimportKeysfromselenium.webdriver.common.byimportByfromselenium.webdriver.chrome.serviceimportService......
  • selenium的三种等待方式:强制等待、显示等待、隐式等待
    1.强制等待不管页面是否加载成功,强制等待,之后继续操作。示例:importtimefromseleniumimportwebdriverdriver=webdriver.Chrome()driver.get('https://www.cnblogs.com/')time.sleep(5)#强制等待5秒后,继续下面操作...2.显示等待设置等待条件,如果条件满足就继续......
  • selenium元素定位方法
     在最新版本的selenium中,已经不支持之前的元素定位方法,如find_element_by_id、find_element_by_xpath等。需将语法更改为:driver.find_element(By.ID,"username")等。特此记录。fromseleniumimportwebdriverfromselenium.webdriver.common.byimportBydriver=webdrive......
  • Spring 中 @Autowired与@Resource的区别
    1、@Autowired与@Resource都是做bean的注入时使用,都可以用来装配bean,都可以写在字段上,或写在setter方法上。  2、@Autowired默认按类型装配(这个注解属于spring),默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false。如:@Autowired(required=fals......
  • selenium - 鼠标悬停点击
    前言:常见一些网页都是带有类似下图,当鼠标悬停在隐藏文本内容上时,显示所有内容。例如:我要点击“搜索设置”,先得把鼠标放在‘设置上’ F12-在页面中搜索‘高级搜索’,找到“搜索设置”文本,鼠标放到‘设置’上,display的值变为block;鼠标不放上去之前是none,即不可见元素。  ......
  • python+selenium+pytest-(5)_yaml文件
    导包importyamlelement.yamllogin:safe:'#element'link:'#element'user:['#element','user1','user2','user3']password:['#element','pw']auth_code:'element......
  • @Resource与@Autowired注解的区别
    前言1、什么是byName和byType简单来说,byName就是根据变量名去匹配bean的id属性,而byType则是根据变量类型去匹配bean的class属性。实例说明:<beanid="userService"class="com.test.UserServiceImpl"></bean>@AutowiredprivateUserServiceuserService;此处byName就是拿变量名us......
  • wireshark抓包常识与常用命令
    本文章分wireshark抓包常识,常用命令,实际使用中自己用到的一些命令。常识ComparisonoperatorsThecomparisonoperatorscanbeexpressedeitherthroughEnglish-likeabbreviationsorthroughC-likesymbols:eq,==Equalne,!=NotEqualgt,>GreaterThan......
  • Python+Requests示例记录【2023-08-27】
    importrequestsimportjsonpayload={"userNo":"用户","password":"密码"}response=requests.post(url,json=payload)print(response)print('---------------------------')print(response.status_code)print('......