python selenium自動化(三)Chrome Webdriver的兼容

當一個自動化測試被實如今一個瀏覽器以後,咱們會但願咱們的測試可以覆蓋到儘可能多的別的瀏覽器。經過跨平臺的測試來保證咱們的程序在多個瀏覽器下都能正常工做。web

 

在安裝了selenium以後,firefox webdriver和IE webdriver就已是ready to use的了,可是若是想要在Chrome下進行測試的話須要再安裝Chrome webdriver。Chrome webdriver是由Chromium項目本身維護的,所以在實現上也和Firefox driver以及IE driver有一些不一樣之處。這就致使了在將在Firefox上能夠正常運行的測試代碼運用到chrome時會產生一些兼容性的問題。ajax

 

1. WebDriverWait的可靠性chrome

上一篇博客提到過,當頁面上有使用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換成這個備選元素來回避這個異常。spa

另外,這三個異常都與Chrome的運行速度以及WebDriverWait的可靠性有必定關係。所以,咱們能夠稍顯「粗暴」的讓webdriver休眠一段時間來slow down測試代碼的執行速度,強制driver等待一個固定的時間來讓元素加載完成。firefox

import time
#some test code 
time.sleep(2) 
#continue test code

time.sleep(2)會使driver休眠兩秒,而後再繼續執行後面的測試代碼code

 

3.不在當前視圖範圍內的元素的操做blog

當咱們使用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)","")  #向下滾動到頁面底部  
相關文章
相關標籤/搜索