前言
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 库当中,会有哪些请求?
需要解决的问题
- selenium 有哪些请求?
- 每一个请求的请求 url、请求类型如何获取?
- 每一个请求的请求数据又如何获取?
selenium - JSON wire protocol - 获取请求 url 和类型
要想解决以上 3 个问题,我们需要了解 selenium 的部分原理。
在 selenium 与驱动进行 http 通信的协议全称叫做:JSON wire protocol.
我们在使用 selenium 库驱动浏览器的时候,我们的操作有一部分大概是以下这样的:
- 打开 Chrome 浏览器;
- 访问某一个网址;
- 查找该网址中的某一个元素;
- 操作 3)中查找到的元素。
在 selenium 库看来,以上每一步操作都是一个 http 请求,也叫做命令(Command)。
chromedriver 在收到这个请求之后,再去驱动对 Chrome 浏览器执行对应的动作。
所以,在 selenium 库当中,存储了所有命令(Command)名称、命令对应的 http 请求类型、命令对应的请求 url。
首先,来看看 Command 的名称(选取几个大家熟知的操作):