當一個自動化測試被實現在一個瀏覽器之后,我們會希望我們的測試能夠覆蓋到盡量多的別的瀏覽器。通過跨平臺的測試來保證我們的程序在多個瀏覽器下都能正常工作。
?
在安裝了selenium之后,firefox webdriver和IE webdriver就已經是ready to use的了,但是如果想要在Chrome下進行測試的話需要再安裝Chrome webdriver。Chrome webdriver是由Chromium項目自己維護的,因此在實現上也和Firefox driver以及IE driver有一些不同之處。這就導致了在將在Firefox上可以正常運行的測試代碼運用到chrome時會產生一些兼容性的問題。
?
1. WebDriverWait的可靠性
上一篇博客提到過,當頁面上有使用ajax異步加載的元素的時候,為了確保對元素進行操作的時候該元素已經處在一個可用的狀態下了,我們可以使用WebDriverWait來使driver等待至目標元素滿足給出的條件時才繼續下面的操作。但是在Chrome中,這個方法似乎不是總是適用。
?
2.一些奇怪的異常
總的來說,測試代碼在Chrome下的運行是非常快的,至少人眼就可以感覺出來比Firefox下的運行速度要快一點,當然這是在不報異常的情況下。而實際情況是,在Firefox下可以正常運行的代碼,在Chrome下卻會出現問題,并且拋出一些奇怪的異常:
selenium.common.exceptions.WebDriverException: Message: u'unknown error: Element is not clickable at point selenium.common.exceptions.InvalidElementStateException: Message: u'invalid element state selenium.common.exceptions.ElementNotVisibleException: Message: u'element not visible
第一個異常的拋出一般會發生在radio button的點擊事件上,但是一般異常拋出的同時,系統會告訴你當前的element不可以被點擊,但是另外的某個元素可以接受這個點擊事件。這時我們可以查看頁面上系統給出的備選元素是否也可以滿足我們的點擊需求,如果可以,我們可以簡單的把radio button換成這個備選元素來回避這個異常。
另外,這三個異常都與Chrome的運行速度以及WebDriverWait的可靠性有一定關系。因此,我們可以稍顯“粗暴”的讓webdriver休眠一段時間來slow down測試代碼的執行速度,強制driver等待一個固定的時間來讓元素加載完成。
import time #some test code time.sleep(2) #continue test code
time.sleep(2)會使driver休眠兩秒,然后再繼續執行后面的測試代碼
?
3.不在當前視圖范圍內的元素的操作
當我們使用Firefox webdriver來測試某個頁面的時候,如果我們選取了某個頁面元素來對其進行操作,但是這個元素不在當前瀏覽器顯示的視圖范圍內,Firefox webdriver的做法是自動的將視圖調整到該元素顯示的區域,然后對這個元素進行操作。也就是說driver自己完成了頁面的scroll down or up的操作。
但是在Chrome webdriver中,如果待操作元素不在視圖顯示范圍內,則會拋出Element is not clickable at point異常。或是如果設置了WebDriverWait并且它正常工作的話會拋出Timeout異常。
因此,在使用Chrome wbedriver的時候,我們要更加小心,對于需要滾動頁面才能顯示在視圖中的元素,我們需要添加代碼使頁面滾動至元素顯示的范圍,然后再對該元素進行操作。使頁面滾動的方法是:
driver.execute_script("window.scrollBy(0,200)","") #向下滾動200px driver.execute_script("window.scrollBy(0,document.body.scrollHeight)","") #向下滾動到頁面底部
?