1.無法定位到元素/定位元素超時(selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element/selenium.common.exceptions.TimeoutException)
在確定xpath無誤的情況下,找不到元素的原因我遇到的大部分是等待時間較短,元素未加載出來,可以嘗試用下面顯示等待的方式解決
2.顯示等待
如上所說的情況,在自動化實施程序中,嘗嘗會有在值執行某步操作或者某個命令之前,先看看要操作的元素是否處于顯示狀態、是否可操作等需求,也就是看看我們期望的場景是否存在,
這時候就可以使用顯示等待,會比較節約測驗腳本執行時間,程式會每隔一段時間(默認0.5默秒,也可自定義)執行一下自定義的判定條件,如果條件成立,就執行下一步,否則繼續等待,直到最長等待時間,然后拋出TimeoutException例外
例:
#最多等待10秒,直到要找的按鈕出現并點擊
from selenium.webdriver.support.wait import WebDriverWait
self.wait = WebDriverWait(self.driver, 10)
self.wait.until(lambda x: x.find_element(by="xpath",value='https://www.cnblogs.com//*[@id="app"]/section/main/div/div/div/div/div/div/div/div[2]/div[3]/div/a')).click()
3.iframe或frame處理
在元素定位程序中,如果出現了<frame>或者<iframe>標簽,說明該頁面中嵌套了一個新的頁面,該頁面內的元素無法直接定位,如:

因此,在定位新頁面元素之前,我們需要先執行driver.switch_to.frame()方法,切換到該frame下面,再對該frame下的元素進行定位和操作
1)定位到iframe
iframe=self.driver.find_element_by_xpath('//*[contains(@id,"x-URS-iframe")]')
2)切換到iframe
self.driver.switch_to.frame(iframe)
3)對iframe上的元素進行操作
self.driver.find_element_by_xpath('//*[@]').send_keys("huisefen")
self.driver.find_element_by_xpath('//[@]').send_keys("-")
4)退出iframe
如果想操作該frame以外的元素,可以通過driver.switch_to.parent_frame()方法切換到上一級frame,然后我們可以訪問該框架外部而不是該框架內部的元素,這樣就切換了控制;外部可以是網頁的其他框架或一部分,這樣我們就可以脫離當前框架,
self.driver.switch_to.parent_frame()
4.運行成功后未生成測驗報告
使用unittest后運行時會默認用unittest去運行腳本(如下圖)

這樣的話就無法執行到main中的生成報告那部分代碼,所以我們需要重新配置一下
(1)點擊如下圖位置Edit Configuration

(2)重新添加需要執行的檔案

(3)點擊apply-ok
(4)點擊Run運行腳本即可
如果仍未解決,可以將游標放在if name == "main":下,右擊,選擇“run +檔案名”的執行方式執行即可,

(5)還可以嘗試將Python tests部分洗掉后重新運行


5.setUp、tearDown執行多次的問題
setUp(連接資料庫、打開瀏覽器等)、tearDown(關閉資料庫,關閉瀏覽器等)這樣反復執行,會影響一個網站執行多個用例(多次打開和關閉瀏覽器,所有用例并沒有全部執行完),資料庫的話還會增加服務器資源的損耗,且浪費時間,
那么我們可以通過裝飾器實作

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/549639.html
標籤:其他
