selenium自动化原理应用 - 利用 requests 模拟 selenium 驱动浏览器

这篇具有很好参考价值的文章主要介绍了selenium自动化原理应用 - 利用 requests 模拟 selenium 驱动浏览器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

selenium是一个web自动化测试的开源框架,它支持多语言:python/java/c#…

前面也有一篇文章说明了,selenium+浏览器的环境搭建。

selenium支持多语言,是因为selenium与浏览器驱动之间是通过http协议进行通信的。只关心通信的数据是否能够正确解读 ,并不关心这个数据是从哪个客户端来。无论来自python\java,还是jmeter,postman都没有问题。

本篇文章中,以requests做为客户端,跳过selenium,直接与谷歌浏览器驱动(chromedriver)进行http通信,驱动chrome浏览器去执行命令。

requests库

先解释一下requests库:一个python的第三方库,是目前最好用的http请求库。

直接封装了get请求、post请求。

只需要提供 请求url、请求方法、请求内容即可。

以下为request库使用的简单示例(request的详细使用可参看其它博主其它的博文):

import requests

s = requests.session()
response = s.get("http://www.baidu.com")  # 发起get请求
print(response.text)  # 获取响应结果的  响应数据
res = response.json()  # 将  响应数据  转换成python数据对象。

如果我要利用requests库,去向chromedriver发送请求。那么我必须得了解请求的类型、请求的数据、请求的内容是什么。

基于此,我们需要了解在selenium库当中,会有哪些请求?

需要解决的问题

  1. selenium有哪些请求?
  2. 每一个请求的请求url、请求类型如何获取?
  3. 每一个请求的请求数据又如何获取?

selenium - json wire protocol - 获取请求url和类型

要想解决以上3个问题,我们需要了解selenium的部分原理。

在selenium与驱动进行http通信的协议全称叫做:json wire protocol.

我们在使用selenium库驱动浏览器的时候,我们的操作有一部分大概是以下这样的:

  1. 打开chrome浏览器;
  2. 访问某一个网址;
  3. 查找该网址中的某一个元素;
  4. 操作3)中查找到的元素。

在selenium库看来,以上每一步操作都是一个http请求,也叫做命令(Command)。

chromedriver在收到这个请求之后,再去驱动对chrome浏览器执行对应的动作。

一般情况下selenium是和request库结合,WEB自动化测试,selenium自动化测试,selenium,自动化,测试工具

所以,在selenium库当中,存储了所有命令(Command)名称、命令对应的http请求类型、命令对应的请求url。

首先,来看看Command的名称(选取几个大家熟知的操作):

一般情况下selenium是和request库结合,WEB自动化测试,selenium自动化测试,selenium,自动化,测试工具

访问网站命令(GET)对应的请求类型和请求url为:

一般情况下selenium是和request库结合,WEB自动化测试,selenium自动化测试,selenium,自动化,测试工具

从上图可以看出,GET命令是post请求,请求地址只有一部分。

url中有3个问题:

1)请求的url并不完整。

url中,缺失中base地址。base地址为,chromedriver的ip+端口号。因为,命令是发给chromedriver去执行的。

2)url当中的$sessionId是什么?

在selenium当中,每开启一次与chromedriver的会话,都会生成一个会话ID。sessionId就是这个会话ID。在很多的命令请求当中,在请求地址中,通过sessionId都绑定了当前的会话。

换句话说,我们要用requests与chromedriver进行通信,那么我们首先,得生成会话ID,并得到这个ID值,才能够进一步的去访问网页,去发送更多的浏览器操作命令。

3)sessionId从何而来?如何获取?

在selenium当中,通过NEW_SESSION请求来开启会话,chromedriver在收到请求后,在响应数据中,返回本次会话的sessionId

一般情况下selenium是和request库结合,WEB自动化测试,selenium自动化测试,selenium,自动化,测试工具


请求的参数如下(启动什么类型的浏览器、有什么配置参数):

params = {'capabilities': {
            'firstMatch': [{}],
            'alwaysMatch': {'browserName': 'chrome',
                            'platformName': 'any',
                            'goog:chromeOptions': {'extensions': [], 'args': []}
                            }},
          'desiredCapabilities': {'browserName': 'chrome',
                                  'version': '',
                                  'platform': 'ANY',
                                  'goog:chromeOptions': {'extensions': [], 'args': []}}
          }


chromedriver在正常收到请求之后,响应的数据如下(主要为sessionId):

{
    "sessionId": "ed76b48661b6fe58b9be6f56716531b7",   # 本次会话的sessionId
    "status": 0,
    "value": {
        "acceptInsecureCerts": false,
        "acceptSslCerts": false,
        "applicationCacheEnabled": false,
        "browserConnectionEnabled": false,
        "browserName": "chrome",
        "chrome": {
            "chromedriverVersion": "74.0.3729.6 (255758eccf3d244491b8a1317aa76e1ce10d57e9-refs/branch-heads/3729@{#29})",
            "userDataDir": "/var/folders/gm/k4pj0kf50vz9f3gznsp4cn340000gn/T/.com.google.Chrome.OPZURo"
        },
        "cssSelectorsEnabled": true,
        "databaseEnabled": false,
        "goog:chromeOptions": {
            "debuggerAddress": "localhost:63649"
        },
        "handlesAlerts": true,
        "hasTouchScreen": false,
        "javascriptEnabled": true,
        "locationContextEnabled": true,
        "mobileEmulationEnabled": false,
        "nativeEvents": true,
        "networkConnectionEnabled": false,
        "pageLoadStrategy": "normal",
        "platform": "Mac OS X",
        "proxy": {},
        "rotatable": false,
        "setWindowRect": true,
        "strictFileInteractability": false,
        "takesHeapSnapshot": true,
        "takesScreenshot": true,
        "timeouts": {
            "implicit": 0,
            "pageLoad": 300000,
            "script": 30000
        },
        "unexpectedAlertBehaviour": "ignore",
        "version": "75.0.3770.100",
        "webStorageEnabled": true
    }
}

ps: 可访问此网站了解详情:https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol
 

selenium - 每一个命令函数 - 设置请求数据

以上我们获取到了每一个命令的请求地址和请求类型。那么请求数据从哪里获取 呢?

每一个命令的功能不一样,请求的数据也就不一样。在selenium当中,都是在命令对应的函数当中去设置请求数据的。

比如,访问网址操作命令,在selenium当中是get函数,那么我们去看get函数的源码:

一般情况下selenium是和request库结合,WEB自动化测试,selenium自动化测试,selenium,自动化,测试工具

在上图中的execute函数当中,第二个参数params对应的就是请求数据。所以get命令的请求体为:{"url":调用get函数传进来的url值}
再比如,查找元素命令,在selenium当中是find_element函数,那么我们去看find_element的源码:

一般情况下selenium是和request库结合,WEB自动化测试,selenium自动化测试,selenium,自动化,测试工具

所以find_elment命令的的请求体为:{"using":定位类型,"value":定位表达式}

利用requests - 开启浏览器会话、访问百度首页、搜索柠檬班

  1. 启动本地电脑 上的chromedriver程序。双击即可。默认的服务端口为9515

一般情况下selenium是和request库结合,WEB自动化测试,selenium自动化测试,selenium,自动化,测试工具

2. 通过requests库向chromedriver发起会话、并打开百度首页的代码如下:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# Name: use_request_send_http_chromedriver
# Author: liyuan
# Time: 15:52

# 1、base_url从哪里来的?如何确定?
# 2、命令的请求类型从哪里来的?请求地址从哪里来的?
# 3、请求参数从何获取。

import requests

# chromedriver服务的base地址。
base_url = "http://127.0.0.1:9515"   
# 创建会话
s = requests.Session() 


# **************************向chromedriver发送的命令1:建立会话**************************

# 创建与chromedriver会话的请求数据
params = {'capabilities': {
            'firstMatch': [{}],
            'alwaysMatch': {'browserName': 'chrome',
                            'platformName': 'any',
                            'goog:chromeOptions': {'extensions': [], 'args': []}
                            }},
          'desiredCapabilities': {'browserName': 'chrome',
                                  'version': '',
                                  'platform': 'ANY',
                                  'goog:chromeOptions': {'extensions': [], 'args': []}}
          }

# 创建与chromedriver的会话。注意请求数据格式是application/json
res = s.request("POST",base_url+'/session',json=params) 
# 获取sessionId值
sessionid = res.json()["sessionId"]  


# **************************向chromedriver发送的命令2:打开网址**************************

# 请求数据
datas = {'url': "http://www.baidu.com"}
# 请求地址拼接
url = base_url + "/session/{}/url".format(sessionid)
# 发送打开百度首页的请求,注意请求数据格式是application/json
res = s.request("post",url,json=datas)


# # **************************向chromedriver发送的命令3:找到搜索输入框**************************
# 请求数据
datas3 = {'using':"id","value":"kw"}
# 请求地址拼接
url3 = base_url + "/session/{}/element".format(sessionid)
# 发送打开百度首页的请求
res3 = s.request("post",url3,json=datas3)
# 返回结果类似:{"sessionId":"2dae661546b28cd481d84048310fb196","status":0,"value"{"ELEMENT":"0.899392980463724-1"}}
# 获取元素的id 
ele_id = res3.json()["value"]["ELEMENT"]


# *****************向chromedriver发送的命令4:在搜索框当中输入 柠檬班******************
# /session/$sessionId/element/$id/value
# 请求数据
datas4 = {'text': '码尚接口自动化测试', 'value': ['码', '尚', '接']}
# 请求地址拼接
url4 = base_url + "/session/{}/element/{}/value".format(sessionid,ele_id)
# 发送打开百度首页的请求
res4 = s.request("post",url4,json=datas4)

以上代码运行的结果如下:

 

实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

一般情况下selenium是和request库结合,WEB自动化测试,selenium自动化测试,selenium,自动化,测试工具

如果对你有帮助的话,点个赞收个藏,给作者一个鼓励。也方便你下次能够快速查找。

如有不懂还要咨询下方小卡片,博主也希望和志同道合的测试人员一起学习进步

在适当的年龄,选择适当的岗位,尽量去发挥好自己的优势。

我的自动化测试开发之路,一路走来都离不每个阶段的计划,因为自己喜欢规划和总结,

测试开发视频教程、学习笔记领取传送门!!!

一般情况下selenium是和request库结合,WEB自动化测试,selenium自动化测试,selenium,自动化,测试工具文章来源地址https://www.toymoban.com/news/detail-770286.html

到了这里,关于selenium自动化原理应用 - 利用 requests 模拟 selenium 驱动浏览器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

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

    2024软件测试面试刷题,这个小程序(永久刷题),靠它快速找到工作了!(刷题APP的天花板) Requests 是 Python 的第三方库,主要用于发送 http 请求,常用于接口自动化测试等。 Selenium 是一个用于 Web 应用程序的自动化测试工具。Selenium 测试直接运行在浏览器中,就像真正的用

    2024年01月23日
    浏览(36)
  • Python利用Selenium实现自动化验证登录

    Python里面使用Selenium是一个很重要的自动化测试模块,我们可以用它写一个验证登录脚本,有了这个可以用来保存cookie信息等,下面是一个简单的demo:

    2024年02月15日
    浏览(43)
  • python 利用多线程执行selenium(自动化)测试

    python 利用多线程执行selenium测试 在实际应用中,可能会遇到项目要求既要在Chrome浏览器中测试,又需要在Firefox浏览器中进行测试,那么此时就能体现出多线程测试的优势。多线程并行地运行自动化测试,提高了效率。 示例:在本地利用chrome浏览器和firefox浏览器对同一脚本进

    2024年01月18日
    浏览(47)
  • python利用selenium库(WEB自动化)完成智慧树自动刷题

     这里用的是Chrome浏览器,使用selenium库是需要先安装Chrome的驱动 分析: selenium库能实现网页自动操作,智慧树每次学习完一小节后都需要点击下一节视频。这里我检测了视频的总播放长度和当前播放的时间长度,每5秒钟检测一次它们是否相同,如果相同就点击下一节视频完

    2024年02月16日
    浏览(50)
  • 接口测试 03 -- 接口自动化思维 & Requests库应用

    接口测试自动化,简单来讲就是功能测试用例脚本化然后执行脚本,产生一份可视化测试报告。不管什么样的测试方式,都是为了验证功能与发现 BUG。那为什么要做接口测试自动化呢? 一句话概括就是为了节省人力成本。 具体来说,包括以下几点: ● 减轻自己工作量,把

    2024年01月23日
    浏览(62)
  • 自动化测试:Selenium原理及安装教程

    目录 一、客户端和驱动(环境)安装 1、安装客户端库 2、安装浏览器和驱动 二、简单示例(Python自动化开发) 省略浏览器驱动路径 三、常见问题 关闭 chromedriver 日志 浏览器首页显示防病毒重置设置 扩展知识 Selenium 是一套 Web网站 的程序自动化操作 解决方案。 通过它,我

    2024年02月09日
    浏览(50)
  • 【python应用】之selenium做自动化

    提示:本篇基于selenium做的一个的脚本,由于我的技术比较有限,所以比较适合初学者学习: 大家好,我是一名大二的学生,由于暑假学习了python,只学python这些语法是非常枯燥的,学习python的一些库才能做出一些有趣的项目,所以就在b站上学习爬虫,学习的过程中发现se

    2024年01月25日
    浏览(38)
  • Python的web自动化学习(一)Selenium库的工作原理

    Python的web自动化学习(一)Selenium库的工作原理 首发2023-07-31 11:01·云中随心而记 后续会根据持续学习来更新,大家一起学习 引言: Selenium是一个流行的自动化测试工具,用于模拟和控制浏览器行为,常用于Web应用程序的功能测试和验收测试。Selenium支持多种编程语言,包括

    2024年02月08日
    浏览(40)
  • 使用JavaScript+Selenium玩转Web应用自动化测试

    自动化测试 在软件开发过程中, 测试是功能验收的必要过程, 这个过程往往有测试人员参与, 提前编写测试用例, 然后再手动对测试用例进行测试, 测试用例都通过之后则可以认为该功能通过验收. 但是软件中多个功能之间往往存在关联或依赖关系, 某一个功能的新增或修改可能

    2024年01月18日
    浏览(47)
  • web自动化测试系列之selenium的运行原理和常用方法介绍(二)

    在上文中我们编写了一段简单的代码 ,可以驱动浏览器访问百度并搜索 。这里我们再把这段代码再拿来加以说明 。 如果你是初次接触它 ,你可能会想 ,这段代码是怎么驱动浏览器运行的了 ?要知道这个问题的答案 ,就必须搞清楚以下3个问题 。 它(selenium)的运行原

    2024年04月11日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包