UI自動化測試的十大問題彙總

UI自動化是自動化測試中不可分割的一部分,是黑盒測試的一種重要手段。在UI自動化測試過程中,我們不可避免會遇到各種各樣的問題,現將自己在測試過程中遇到的問題進行彙總,希望可以爲大家提供幫助。 

 

一、啓動瀏覽器報錯

  報錯信息:Exception in thread "main" org.openqa.selenium.WebDriverException: unknown error: call function result missing 'value'

  出現以上報錯信息,是由於瀏覽器版本與driver版本不匹配,各版本driver下載地址爲:https://npm.taobao.org/mirrors/chromedriver;在進行UI測試之前,一定要先檢查自己瀏覽器的版本,然後找到對應版本的driver,這樣才能正常啓動瀏覽器進行測試。

 

二、無匹配元素/元素不可見

  例如,報錯信息爲:ValueError: Element locator 'id=msgCount' did not match any elements.

  首先,確認是否設置了合理的等待時間,在web的UI測試過程中,我們需要等待元素加載完成之後,纔可以定位到對應的元素;其次,如果設置等待時間仍然無法解決問題,再檢查定位方式是否準確,並切換不同的方式進行元素定位,常用的元素定位方法包括id、name、className、partialLinkText()、linkText、xpath、cssSelector();一般情況下,出現無法定位或者找不到元素的情況,都是由於沒有設置合理的等待時間。

 

三、設置等待時間

  爲了提高測試腳本的穩定性和實用性,設置合理的等待時間是必不可少的,我們需要根據不同的場景,選擇合適的等待方式,以提高測試效率;常用的等待方式包括強制等待、隱式等待和顯式等待三種。

  強制等待:time.sleep(x),在查找元素前強制線程停止x秒,由於這種等待方式是必須等夠x秒之後,才執行對應的操作,因此可能會影響測試效率,一般不建議使用;

  隱式等待:隱式等待是對網頁加載的等待;在整個測試用例編寫過程中,只需強調一次,之後每次出現網頁加載都執行一次等待,自動判斷等待時間;在啓動瀏覽器後,加一個driver.implicitly_wait(5)即可;其中,參數5表示,頁面在0-5s內加載出來即可,是一個時間範圍;

  顯式等待:顯式等待是對元素的等待;在每次進行元素查找之前都需要強調一次:

WebDriverWait(driver,20,0.5).until(expected_conditions.alert_is_present())

  其中,20s表示最大等待時間,0.5s表示輪詢時間間隔;檢查到元素即停止等待,執行下一個操作;

 

四、上傳文件

  Web的UI自動化測試過程中,我們不可避免要處理文件上傳,最簡單的方式是通過sendkeys來處理,這種方式簡單、清晰、高效,是處理文件上傳的首選,代碼如下:

driver.find_element(By.ID,'upload').send_keys('D:/upload.txt');

  但是這種方式只適用於元素標籤爲input類型的上傳,webdriver的API無法處理上傳文件時系統的對話框;此時,我們可以採用AutoIT v3進行處理,AutoIT腳本編譯成可執行文件exe後,放到本地的某一個目錄下供程序調用,調用方法如下:

Runtime rn=Runtime.getRuntime();

Rn.exec(“upload.exe”)

  AutoIT是一個類似腳本語言的軟件,利用此軟件我們可以方便的實現模擬鍵盤、鼠標、窗口等操作,實現自動化。關於使用AutoIT實現文件上傳的方法,網絡上有很多解釋,有需要的同學可以百度查看,此處不再展開描述。AutoIT下載地址爲:https://www.autoitscript.com/site/autoit/downloads/

 

五、切換瀏覽器窗口

  在進行UI自動化測試過程中,我們通過鏈接打開一個新的頁面時,需要進行窗口切換,才能在新頁面進行操作,代碼如下:

  其中,driver.getWindowHandle();獲取當前窗口句柄(系統分配的唯一標識,跟身份證一樣)

  driver.getWindowHandles();獲取當前瀏覽器所有窗口的句柄集

  此外,獲取當前瀏覽所有窗口的句柄集,相當於一個列表,也可以通過如下代碼來切換到最新打開的頁面:

new_handle=driver.getWindowHandles()[-1];

driver.swicth_To().window(new_handle);

六、定位Webdriver定位class屬性中有空格的值

 

 

  例如:定位" class="bg s_btn",一共有三種處理方式:

self.browser.find_element_by_class_name("s_btn").submit()   #第一種解決辦法:class值取其中之一

self.browser.find_element_by_class_name("bg").submit()   #第二種解決辦法:class值取其中之一

self.browser.find_element_by_css_selector(".bg.s_btn").submit()  #第三種解決辦法:使用css.selector,每個class值前面加.

  其中,在使用前兩種方法的時候,需要確認我們選取的元素不會在該頁面上存在重複,因此建議使用css.selector方式進行定位,以保證元素查找的唯一性。

 

七、處理頁面彈出框Alert

  Alert是JavaScript控件,無法通過元素定位的方式進行處理,Webdriver提供了以下方式來對控件進行處理:

driver.switch_to.alert.accept()   # 通過accept,關閉彈出框

driver.switch_to.alert.dismiss()  # 通過dismiss,關閉彈出框

driver.switch_to.alert.text   #獲取彈出框文字

 

八、日曆控件

  日曆控件是一種特殊的網頁元素,由於其操作的複雜性,我們無法通過模擬手工操作來進行一步步的選擇。檢查頁面元素可以發現,日曆控件屬於input類型,但是由於其readonly屬性,無法使用send_keys直接輸入;因此,我們可以通過調用JavaScript腳本(打開Chrome瀏覽器-右鍵點擊檢查-進入console,即可進行JavaScript代碼調試

  ),先刪除其readonly屬性,再使用sendkeys方式進行輸入,代碼如下:

driver.execute_script('document.getElementById("date").removeAttribute("readonly")')

 

 

九、處理圖片驗證碼 

  在進行登錄註冊等操作時,我們經常需要處理一些驗證碼;除了通過萬能碼進行登錄之外,我們還可以調用百度提供的開放接口進行驗證碼處理,接口說明文檔如下:

  http://ai.baidu.com/docs#/OCR-API/top

 

十、iframe或frame處理

  在元素定位過程中,如果出現了<frame>或者<iframe>標籤,說明該頁面中嵌套了一個新的頁面,該頁面內的元素無法直接定位。因此,在定位新頁面元素之前,我們需要先執行driver.switch_to.frame()方法,切換到該frame下面,再對該frame下的元素進行定位和操作;如果想操作該frame以外的元素,可以通過driver.switch_to.parent_frame()方法切換到上一級frame。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章