• selenium-wire兼容selenium和requests


    1|0背景

    在工作中UI自动化中可能会需要用到API来做一些数据准备或清理的事情,那UI操作是略低效的,但API操作相对高效。

    而实战课就有这样一个案例,不过那个案例是UI操作和API分开的。

    极少会遇到这样的场景,我selenium操作网页,比如登录,应该底层也是有响应数据的,比如token之类的,那我是否可以通过UI操作获取到的token直接去发送后续的业务请求,而不是再在API层从头来一把(也是可以的)。

    2|0主角

    这个库名叫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等

    3|0实例

    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': 'sqqdcl@163.com', 'pwd': '', 'cardId': '2423423', 'sex': '女', 'role': '2'}, 'token': 'eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiLnv6DoirEiLCJzdWIiOiLnv6DoirEiLCJpYXQiOjE2OTM1NjAwOTF9.VDbx07ALrnAoohrYHZJBHcLRsTkUzCGe5VD4u6I7Qvc'}

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


    __EOF__

    本文作者老吴的博客
    本文链接https://www.cnblogs.com/wuxianfeng023/p/17674124.html
    关于博主:评论和私信会在第一时间回复。或者直接私信我。
    版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
    声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
  • 相关阅读:
    一个依赖搞定Spring Boot 配置文件脱敏
    SpringMVC的数据绑定
    【实战技能】培训和指导:深入浅出原则
    LoRa技术实现智能城市的转型
    扫盲低代码——构建的基本原理
    设有一个由正整数组成的无序单链表,编写完成一以下功能的算法
    #{}和${}的区别
    IDEA启动Web项目总是提示端口占用
    基于Websocket的局域网聊天系统
    Python基础算法解析:支持向量机(SVM)
  • 原文地址:https://www.cnblogs.com/wuxianfeng023/p/17674124.html