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

背景

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);

    
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是使用selenium模拟浏览器爬取京东商品评价的代码: ```python from selenium import webdriver from selenium.webdriver.common.keys import Keys from time import sleep # 创建一个浏览器对象 browser = webdriver.Chrome() # 访问京东首页 browser.get('https://www.jd.com/') # 查找搜索框并输入要搜索的商品名称 search_box = browser.find_element_by_id('key') search_box.send_keys('手机') search_box.send_keys(Keys.ENTER) # 等待搜索结果页面加载完成 sleep(3) # 找到商品列表中第一个商品的链接并点击进入商品详情页 product_link = browser.find_element_by_css_selector('.gl-item:nth-child(1) .p-name a') product_link.click() # 切换到新打开的标签页 browser.switch_to.window(browser.window_handles[-1]) # 进入商品评价页面 browser.find_element_by_css_selector('#detail .comment-count').click() # 模拟滚动加载评价数据 while True: browser.execute_script('window.scrollTo(0, document.body.scrollHeight)') sleep(3) try: # 找到“查看更多”的按钮并点击 more_button = browser.find_element_by_css_selector('.comment-item .comment-operate .btn-append') more_button.click() sleep(3) except: # 没有“查看更多”按钮,说明评价数据已全部加载完成 break # 找到所有评价的元素 comments = browser.find_elements_by_css_selector('.comment-item') # 遍历所有评价并输出评价内容 for comment in comments: content = comment.find_element_by_css_selector('.comment-con').text.strip() print(content) # 关闭浏览器 browser.quit() ``` 上面的代码中,我们首先使用`selenium`创建一个`Chrome`浏览器对象,并访问京东首页。然后,我们在搜索框中输入要搜索的商品名称,按下`Enter`键进行搜索。搜索结果页面加载完成后,我们找到商品列表中第一个商品的链接,并点击进入商品详情页。切换到新打开的标签页后,我们进入商品评价页面,然后模拟滚动加载评价数据,并在评价数据全部加载完成后,找到所有评价的元素,遍历所有评价并输出评价内容。最后,关闭浏览器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值