背景
在自动化测试的时候,我们经常用python浏览器的开发者工具,分析页面元素,样式,这些属于element。同时也可以查看浏览器的性能,请求情况等(console),另外还可以查看控制台里面的报错信息。
自动化测试selenium webdriver工具能够定位DOM元素,与之交互,读取样式以进行验证等。但是Selenium只处理“结果”,它无法得知浏览器的网络控制台的信息。如果浏览器在渲染出页面之前,从某个站点加载大量资源信息,Selenium无法知道。
另外,现在很多站点都是异步加载,通过api的方式请求,然后返回json到前端,进行渲染。如果使用selenium,是看不到这部分数据的。
如果要想要获取到api的数据,就要按照api请求的方式进行访问。但是这个时候一般都需要计算签名,一堆复杂的js,非专业前端,直接劝退。但是这种情况通过浏览器的开发者工具是可以看到的,结合selenium,如果能将network下面的数据拿到,那就随便分析了。
解决这个问题的思路就是,通过自建proxy,将请求捕获,然后再代理上将数据截取出来。这个方案类似fiddler。这里代理使用Browsermob-Proxy。
Browsermob-Proxy 介绍
Browsermob-Proxy(以后,简称BMP)是一个开源的Java编写的基于LittleProxy的代理服务。Browsermob-Proxy的具体流程有点类似Flidder或Charles。即开启一个端口并作为一个标准代理存在,当HTTP客户端(浏览器等)设置了这个代理,则可以抓取所有的请求细节并获取返回内容
项目主页https://github.com/lightbody/browsermob-proxy/
直接到release部分下载最新的版本即可。最新的是2.1.4,下载下来,解压到项目工程路径。
因为BMP是java写的,所以允许需要提前配置好java(再命令行java或者javac命令没有报错即可)。
目录结构中关键的路径
- bin目录 提供linux和window下的运行程序,conf目录下配置了日志的级别,可以根据需要调整,比如将日志调整为debug级别
- 其他 主要的jar包和依赖,可以忽略
BMP提供了REST的方式去调用,创建proxy等,参考项目的README。
这里主要使用python来进行管理。
pip install browsermob-proxy
Browsermob-Proxy的使用
开启proxy
这里Server需要传入bmp bin目录下可执行文件的路径,windows传入browsermob-proxy.bat,linux直接传入browsermob-proxy。
start之后,创建一个proxy
from browsermobproxy import Server
# 启动代理
server = Server(./selenium_spider/browsermob-proxy-2.1.4/bin/browsermob-proxy.bat')
server.start() # 开启server
proxy = server.create_proxy() # 开启proxy client
配置selenium webdriver使用
这里引入Options,进行selenium webdriver的设置。具体设置以及含义如下:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
<