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信息?
待續!
原創文章,轉載請標明出處。