Selenium WebDriver支持驱动众多的浏览器,包括PhantomJS、HtmlUnitDriver等无界面浏览器,他们速度快,但在兼容性上还是有点问题,有时会遇到页面JS执行错误,在一些应用场合,页面内容提取也不够简洁方便。
对于常用的桌面浏览器,兼容性很好,但在执行性能上较无界面浏览器要差一些。一是由于需要开启实体的浏览器加载页面的所有资源并进行页面渲染,这将大量消耗CPU及内存资源,在做多线程并发时尤为明显;二是由于通过浏览器的API进行页面内容的查找提取(Selenium RC是通过JS注入的方式实现的),性能受浏览器制约。那么在使用桌面浏览器进行网页的自动化测试、内容抓取时,提供一些提高性能的方法和建议:
取消不必要的消耗资源的配置,尽可能少的打开关闭操作浏览器窗口,及时关闭不必要的窗口,并始终保持浏览器窗口的最小化。
webDriver对浏览器窗体可以实现指定屏幕坐标位置、窗体尺寸、最大化,但无法最小化浏览器窗口:
1 webDriver.manage().window().setPosition(new Point(0, 0));//指定窗口坐标 2 webDriver.manage().window().setSize(new Dimension(1280,800));//指定窗口大小 3 webDriver.manage().window().maximize();//最大化窗口
如果使用的是Google Chrome,可通过添加command line flag实现:
1 options.addArguments("--window-position=0,0");//指定窗口坐标 2 options.addArguments("--window-size=1280,800");//指定窗口大小 3 options.addArguments("-start-maximized");//最大化窗口 4 options.addArguments("--start-fullscreen");//全屏
同样,该方式也不提供将窗口最小化的方法。(如果需要调整窗口,建议通过command line flag实现,在打开浏览器时一步到位了,webDriver.manage是在打开浏览器窗口后再执行调整的)
最小化浏览器窗口需要另行编程实现。一种通过AutoIt脚本的快速实现方法:
1 $aWinList = WinList("[REGEXPTITLE:(?i)(.*Google Chrome.*)]") 2 For $i = 1 To $aWinList[0][0] 3 If BitAND(WinGetState($aWinList[$i][1]), 2) Then 4 WinSetState($aWinList[$i][1], "", @SW_MINIMIZE) 5 WinSetState($aWinList[$i][1], "", @SW_HIDE) 6 EndIf 7 Next
监控并关闭弹窗,Google Chrome默认就开启了屏蔽,但不可靠,可以通过“--disable-popup-blocking”关闭屏蔽功能。
删除占用资源的遗留临时文件、进程等,代码略。
最小化浏览器窗口可以降低浏览器对CPU的占用,特别是在大型的含有大量动画元素的页面上。
一些使用了lazy load或异步加载内容的页面,为了可靠获取页面元素,可以在页面加载完成后通过action.clickAndHold()、js.executeScript()的途径,执行触发动作。
通过循环进行元素查找,要尽可能快的返回查找结果,减少对webElement的所有操作。遍历findElements()返回的webElements,使用foreach总是从最高节点开始查找,在逾期内部子节点更可能命中时,应该改为反向遍历。
优先使用cssSelector并尽可能缩小查找范围,使用xpath速度会较慢。(Google Chrome v49实测也没慢多少 !-_-)
如何获取Request和Response信息?
待续!
原创文章,转载请标明出处。