Selenium 3 + BrowserMobProxy 2.1.4 模拟浏览器访问 (含趟坑)

摘要:
BrowserMobProxy相当于代理层。它可以与Selenium一起使用,在Selenium控制浏览器访问之前,在代理层拦截并进行一些记录和修改。标头实际上是一些重要的元信息,用于在模拟测试期间模拟不同的访问和测试安全性。从一些github问题来看,Selenium开发人员似乎拒绝考虑添加头部修改功能。应该向用户支付费用,因为自动化测试组件不允许用户修改标头,并允许每个人使用BrowserMobProxy进行模拟。Selenium服务器:通常,它只用于远程测试。本文主要使用Java代码作为示例,python的用法类似。

背景

Selenium 是一个Web自动化测试的组件,可基于WebDriver去控制弹出浏览器去做一系列Web点击或行为测试(当然也可以去做一些邪恶的事。。),减少重复人工网页测试的开销。BrowserMobProxy相当于一层代理,它配合Selenium使用可以在Selenium控制浏览器访问之前在代理层拦截做出一些记录(har)、修改等。

一般来说,直接使用Selenium就足够了,但是Selenium有个很致命的问题是不支持修改request的参数,比如很重要的headers。headers其实是一些模拟测试时用来模拟不同的访问和测试安全的重要元信息,从一些github issues看Selenium开发方似乎拒绝考虑加入headers修改功能,以自动化测试组件不应该让用户修改headers的理由应付用户,并让大家使用BrowserMobProxy去模拟。如果webdriver也是可控的,这完全是可以做到的,可能会需要协调不同浏览器的webdriver开发者会有点麻烦;所以也不知道是开发方懒,还是和browsermobproxy的开发方有什么关系。。而弹出浏览器并能提供足够的控制功能的框架目前暂没见到其他能与selenium媲美的。(PhantomJS是在服务端提供了个解析,但并不会事实弹出浏览器模仿真正的浏览器行为,也就是说一些前端涉及鼠标、悬停等事件的脚本并不能支持)

介绍一下Selenium3.x里几个概念:

  • WebDriver:可以理解为连接不同浏览器的驱动程序,比如chrome和firefox的webdriver是不同的,如果selenium相关包没有引入你的浏览器,就要考虑去寻找了。内置支持的浏览器参见github。像IE这种需要windows相关组件支持可参考官网配置步骤。
  • Selenium IDE:其实就是个可视化的测试案例创建管理的组件,一般我们用selenium可能是写代码,但部分没那么复杂的测试功能可以通过该IDE去配置,也降低了QC的门槛。使用代码去模拟测试的可忽略IDE的存在。
  • Selenium Server:一般只会在远程测试的时候需要。比如公司有台测试机,你想要在上面测试但又不能在上面直接开发,你就可以在测试机起SeleniumServer,本地测试代码通过RemoteWebDriver的形式去连接它。大多数情况下本地测试可以忽略这个server的存在。

BrowserMobProxy会提供一个ProxyServer用于做转发代理拦截,这个server可以是standalone部署支持远程,也可以embed进代码中。由于BrowserMob是Java开发的,因此JVM的可以支持真正的embedded,python等非JVM系的只能配置其执行路径通过子进程的方式来伪装embedded,这就是AutomatedTester/browsermob-proxy-py项目中需要配置 /path/to/browsermobproxy 的原因。

使用

Selenium WebDriver的具体使用请参考网上的教程示例和官方文档,此处不赘述。

BrowserMobProxy官方文档里有段 use with selenium 的代码示例其实就是 embedded browsermob  + local selenium :

 // start the proxy
    BrowserMobProxy proxy = new BrowserMobProxyServer();
    proxy.start(0);

    // set custom headers
    proxy.addHeaders(headers);

    // get the Selenium proxy object
    Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy);

    // configure it as a desired capability
    DesiredCapabilities capabilities = new DesiredCapabilities();
    capabilities.setCapability(CapabilityType.PROXY, seleniumProxy);

    // start the browser up
    WebDriver driver = new FirefoxDriver(capabilities);

    // open yahoo.com
    driver.get("http://yahoo.com");

需留意的是,Firefox的webdriver有坑,貌似Firefox>=52.0版本的需要用最新的Selenium和最新的Webdriver(3.3.0+)。本文主要以Java的代码为示例,python用法也类似(需先 pip install browsermob-proxy)。

remote browsermob + local selenium

        executeCMD(String.format("curl -X POST -d 'port=%d' http://localhost:8080/proxy", 55555));
        executeCMD(String.format("curl -X POST -H "Content-disposition:json/application" - H "Content-type:json/application" -d '%s' http://localhost:8080/proxy/" + (port1) + "/headers", headersJson));

        // get the Selenium proxy object
String PROXY = "localhost:8080"; Proxy seleniumProxy = ClientUtil.createSeleniumProxy(new InetSocketAddress("localhost", 8080)); seleniumProxy.setHttpProxy(PROXY).setSslProxy(PROXY); // configure it as a desired capability DesiredCapabilities capabilities = DesiredCapabilities.chrome(); capabilities.setCapability(CapabilityType.PROXY, seleniumProxy); // start the browser up WebDriver driver = new ChromeDriver(capabilities);

即browsermob在外部起,本地只能通过restful与其通信,包括先注册端口和设置headers等,seleniumProxy也得配置到对应的socket去。部署browsermob也很简单,http://bmp.lightbody.net/ 下载部署版本或从github下载项目tag版本命令行执行 mvn clean package -U 源码安装。源码安装的话在browsermob-dist/target/ 下可以找到bin结尾的目录,里面就是可执行文件(*nix和windows bat都有),copy到你需要的目录即可。

embedded browsermob + remote selenium server

BrowserMobProxy proxyServer = new BrowserMobProxyServer();
proxyServer.addHeaders(headers);
proxyServer.start(port);
String PROXY = "localhost:" + port;
Proxy seleniumProxy = ClientUtil.createSeleniumProxy(new InetSocketAddress("localhost", port));
seleniumProxy.setHttpProxy(PROXY).setSslProxy(PROXY);

 // configure it as a desired capability
DesiredCapabilities capabilities = DesiredCapabilities.chrome();
capabilities.setCapability(CapabilityType.PROXY, seleniumProxy);

// 默认selenium server起在4444端口,可在capabilities中配置端口
WebDriver driver = new RemoteWebDriver(new URL("http://localhost:4444"), capabilities);

同样需去Selenium官网下载standalone-server的jar包,下下来后java -jar xxx.jar 即可运行,相关参数配置见文档。须注意的是,3.x的selenium server需要jdk8支持,2.x只需要jdk1.7支持。

其实如同以上例子,可根据需求自由组合browsermob和selenium的使用。browsermob 2.x的ProxyServer换成了BrowserMobProxyServer,但其实接口大同小异,它的filter概念有点类似之前的interceptor概念,拦截修改了request后返回null就可以了(不需要按照方法声明中的返回值真的构造一个response),官网有filter的例子。

maven依赖:

<dependency>
      <groupId>net.lightbody.bmp</groupId>
      <artifactId>browsermob-core</artifactId>
      <version>${browsermob.version}</version>
      <exclusions>
        <exclusion>
          <artifactId>guava</artifactId>
          <groupId>com.google.guava</groupId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>net.lightbody.bmp</groupId>
      <artifactId>browsermob-legacy</artifactId>
      <version>${browsermob.version}</version>
      <exclusions>
        <exclusion>
          <artifactId>guava</artifactId>
          <groupId>com.google.guava</groupId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>org.seleniumhq.selenium</groupId>
      <artifactId>selenium-java</artifactId>
      <version>${selenium.version}</version>
    </dependency>

guava会有冲突,需exclude。selenium版本3.3.0, browsermob 2.1.4 。

修改headers支持

其实以上示例中的addHeaders函数就可以修改headers了,亲测可用。但是需注意,你在浏览器看到的request headers不代表最终的headers,你最好用个 php页面 把server端真正的request打印出来才能看到效果。相关解释。可以自己做个试验证实,比如把Host或者一些重要字段随便填写,去访问baidu等,你会发现访问不了,改回去headers就可以了。

  

免责声明:文章转载自《Selenium 3 + BrowserMobProxy 2.1.4 模拟浏览器访问 (含趟坑)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇记一次所有DELETE 请求全部404报错问题(put和get等其他请求均正常)C#后台实现在Grid标签中动态新增CheckBox标签(WPF中)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Selenium WebDriver问题Internet Explorer保护模式设置问题

在用WebDriver中打开Internet Explorer访问百度的是,报下面错误: org.openqa.selenium.remote.SessionNotFoundException: Unexpected error launching Internet Explorer. Protected Mode settings are not the...

Selenium3+python3自动化(四十一)--Chrome浏览器静默模式启动(headless)

前言 Chrome浏览器可以实现静默模式,在电脑上不显示页面,也能实现自动化测试。 小编环境: python 3.7 selenium 3.141.0 Chrome浏览器 84.0.4147.135 chromedriver    84.0.4147.30 headless 1.启动浏览器的时候不想看到浏览器运行,那就加载浏览器的静默模式,让它在后台偷偷运...

Python爬虫学习教程:天猫商品数据爬虫

天猫商品数据爬虫使用教程 下载chrome浏览器 查看chrome浏览器的版本号,下载对应版本号的chromedriver驱动 pip安装下列包 pip install selenium pip install pyquery 登录微博,并通过微博绑定淘宝账号密码 在main中填写chromedriver的绝对路径 在main中填写微博账号密码 1...

爬虫之selenium

selenium基本操作 概念:基于浏览器自动化的模块 appnium:基于手机自动化的模块的应用 环境的安装 pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple 跟爬虫之间的关联? 可以实现模拟登陆 便捷的捕获动态加载数据(可见即可得) 基本操作 导包:...

selenium 基础(一)

selenium安装 pip install selenium selenium操作浏览器原理 早期selenium 1.0 用的selenium RC, 后来selenum2集合了selenium1.0 + webdriver,selenium RC被webdriver替换。通过webdriver,测试脚本(例如python)可以方便的通过API操作浏览...

Selenium:元素等待的4种方法

1.使用Thread.sleep(),这是最笨的方法,但有时候也能用到而且很实用。 2.隐示等待,隐性等待是指当要查找元素,而这个元素没有马上出现时,告诉WebDriver查询Dom一定时间。默认值是0,但是设置之后,这个时间将在WebDriver对象实例整个生命周期都起作用。 WebDriverdr=newFirefoxDriver(); dr.man...