使用WebDriver遇到的那些坑
使用WebDriver遇到的那些坑
2013-06-25 22:44 by 黃博文, 273 閱讀, 2 評論, 收藏, 編輯
在做web項目的自動化端到端測試時主要使用的是Selenium WebDriver來驅動瀏覽器。Selenium WebDriver的優點是支持的語言多,支持的瀏覽器多。主流的瀏覽器Chrome、Firefox、IE等都支持,手機上的瀏覽器Android、IPhone等也支持,甚至還支持PhantomJS(由於PhantomJS跑測試時並不需要渲染元素,所以執行速度快)。
但是我在使用Selenium WebDriver時,遇到了很多坑。這些問題,有的是因為Selenium WebDriver與瀏覽器不同版本之間兼容性的問題,有的是Selenium WebDriver本身的bug,當然也不乏自己對Selenium WebDriver某些功能理解不透徹。我花時間總結了一下,分享給大家,希望大家以后遇到問題可以避過這些坑,少走彎路。另外也總結了一些使用WebDriver的比較好的實踐,也一並分享給大家。
- WebDriver每次啟動一個Firefox的實例時,會生成一個匿名的profile,並不會使用當前Firefox的profile。這點一定要注意。比如如果訪問被測試的web服務需要通過代理,你想直接設置Firefox的代理是行不通的,因為WebDriver啟動的Firefox實例並不會使用你這個profile,正確的做法是通過FirefoxProfile來設置。
1 2 3 4 5 6 7 8 9 10 11 |
|
通過FirefoProfile也可以設置Firefox其它各種配置。如果要默認給Firefox安裝插件的話,可以將插件放置到Firefox安裝目錄下的默認的plugin文件夾中,這樣即使是使用一個全新的profile也可以應用此plugin。
- 使用WebDriver點擊界面上Button元素時,如果當前Button元素被界面上其他元素遮住了,或沒出現在界面中(比如Button在頁面底部,但是屏幕只能顯示頁面上半部分),使用默認的WebElement.Click()可能會觸發不了Click事件。
修正方案是找到該頁面元素后直接發送一條Click的JavaScript指令。
1
|
|
- 當進行了一些操作發生頁面跳轉時,最好加一個Wait方法等待page load完成再進行后續操作。方法是在某個時間段內判斷document.readyState是不是complete。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
- 如果頁面有Ajax操作,需要寫一個Wait方法等待Ajax操作完成。方式與上一條中的基本相同。比如一個Ajax操作是用於向DropDownList中填充數據,則寫一個方法判斷該DropDownList中元素是否多余0個。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
以此類推,我們可以判斷某個元素是否呈現、某個class是否append成功等一系列方法來判斷ajax是否執行完成。
- 如果網站使用了JQuery的動畫效果,我們在運行測試的時候其實可以disable JQuery的animation,一方面可以加快測試的速度,另一方面可以加強測試的穩定性(如果啟用了Animation,使用WebDriver驅動瀏覽器時可能會出現一些無法預料的異常)。
1
|
|
- 由於WebDriver要驅動瀏覽器,所以測試運行的時間比較長,我們可以並行跑測試以節省時間。如果你使用的是maven構建工具,可以配置surefire plugin時,在configruation節點加入以下配置。
1 2 3 |
|
- 當測試fail的時候,如果當前使用的WebDriver實現了TakesScreenshot接口,我們就可以調用相應的方法截下當前瀏覽器呈現的web頁面,這樣有利於快速定位出錯的原因。
1 2 3 4 5 6 |
|
-
如果頁面彈出了瀏覽器自帶的警告框(使用JavaScript的Alert方法),Selenium WebDriver在點選次警告框時會偶發性失敗。具體原因還未查明。解決方案是盡量不使用Alert方法的警告框,而是自己實現模式窗口(比如Jquery UI的模式窗口)來實現警告框效果。這樣即保證了測試的穩定性,另外我們自己可以控制警告框的樣式,給用戶帶來更好的體驗。
-
經常更新Selenium的版本。注意經常上Selenium的官網看是否發布了新的版本,新的版本都修復了那些bug,如果包含你遇到的bug,就可以升級到目前的版本。
LINUX下CPU Load Average的一點研究
背景:
公司的某個系統工作在基於Linux的Cent OS下,一個host下同時連接了許多client, 最近某台Host總是顯示CPU Load Average過高,我們單純的以為是CPU的占用過高,其實沒這么簡單,於是老板讓我趁這個機會研究一下CPU Load Average,最近剛好想開學習LINUX的文章,就把這個當成一個起點吧。
Load Average(平均負載)基本概念:
- Load 指的是運行隊列(run-queue)的長度:L = 等待進程的數目 + 運行進程的數目
- Load Average指的是在一段時間內CPU正在處理以及等待CPU處理的進程數之和的統計信息,也就是CPU使用隊列的長度的統計信息。
- Load Average反映了CPU的使用情況和申請情況.
Load Average(平均負載)和CPU占用率的區別:
- Load Average所包含的信息不是CPU的使用率狀況
- 多任務環境下,系統分配時間片以后,是否使用完全使用時間片取決於進程,因此完全可能出現低CPU利用率而高Load Average的情況
Load Average的計算:
- 在多處理器系統中,負載閥值是基於內核的數量決定的。以 100% 負載計算,1.00 表示單個處理器,而 2.00 則說明有兩個雙處理器,那么 4.00 就說明主機具有四個處理器。超過這個閥值就表示系統過載了
- Load Average的實時計算公式:
- load(t) = load(t-1) e^(-5/60) + n (1 - e^(-5/60)),迭代計算,其中n為run-queue的長度
Linux下通過top或者uptime命令可以查看系統的Load Average,它顯示的是系統在1分鍾,5分鍾,15分鍾之內的Load Average值:
- 1分鍾的平均值通常表示峰值,應該着眼於5分鍾或者15分鍾的平均數值
- 遠程連接到一台LINUX上通過top命令查詢系統的平均負載:
- 遠程連接到一台LINUX上通過uptime命令查詢系統的平均負載:
本文參考文章:
- http://www.blogjava.net/cenwenchu/archive/2008/06/30/211712.html
- http://blog.csdn.net/naivebaby/article/details/1386577
- http://wenku.baidu.com/view/9cc0ed4ce518964bcf847c21.html
參考文章里的三篇文章寫得都非常好,如果你想了解更多一點,請一定深入拜讀
分類: Linux/Unix