天天看點

Python自動化測試專欄——元素定位不到常見問題及解決辦法

1.元素id動态變化

以如下圖檔舉例

Python自動化測試專欄——元素定位不到常見問題及解決辦法

當我們要定位到該元素時,如果采用id屬性定位,那麼很有可能定位不到。

原因:當我們重新整理一遍網頁時,會發現id值發生變化,表明它是個動态id,每次自動化時會因為值不同無法定位到該元素

解決方法:采用其他屬性定位,如案例中即可采用data-placeholder的值定位

2.定位的元素嵌套在iframe當中

以如下圖檔舉例

Python自動化測試專欄——元素定位不到常見問題及解決辦法

以剛剛圖檔舉例,當我們選擇用data-placeholder定位時,發現還是定位不到,我們将檢查元素界面往前翻

Python自動化測試專欄——元素定位不到常見問題及解決辦法

原因:發現該元素嵌套在iframe當中

解決方法:需要将架構定位到該iframe,代碼為:

driver = webdriver.Chrome()
driver.get("https://www.***.cn")

#有id的,用id定位,例如當id=iframe1
driver.switch_to.frame("iframe1")

#無id的,用index索引定位,例如當index=1
driver.switch_to.frame(1)
           

當操作完畢後,一般需要切換到上一層或預設frame

切換回預設frame:driver.switch_to.default_content()

切換到上層frame:driver.switchTo().parentFrame();

3.頁面元素未加載完

原因:當網絡問題或者頁面需要加載的内容過多,導緻規定時間内無法顯示出需要定位的元素時,無法定位到該元素

解決方法:

(1).設定顯式等待時間

import time
time.sleep(5) #強制休眠5秒
           

讓程式強制休眠來使頁面加載出來以達到元素能被定位,但出于執行效率的考慮,盡量少用

(2).設定智能隐式等待時間

driver.implicitly_wait(5)
           

當driver在規定時間5秒内會一直查找該元素,找到則繼續往下執行。沒找到則會一直查找,直到超過5秒并抛出異常

該方法存在整個對象執行個體的聲明周期中,隐式的等到會讓一個正常響應的應用的測試變慢,它将會在尋找每個元素的時候都進行等待,這樣會增加整個測試執行的時間,也不推薦使用

(3).設定智能顯式等待時間

WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)

           

driver為webdriver驅動timeout最長逾時時間,機關(秒)

poll_frequency循環查找元素每次間隔的時間,預設0.5秒 ignored_exceptions逾時後需要輸出的異常資訊

一般搭配lambda使用,示例:

WebDriverWait(driver,5).until(lambda driver:driver.find_element_by_id('query'))
           

5秒内等待元素(id=‘query’)出現,查找到則傳回查找的元素對象,查找不到則抛出異常。

4.元素被隐藏

原因:初始化執行個體時未設定浏覽器最大化導緻元素被隐藏

driver = webdriver.Chrome()
driver.maximize_window()
           

繼續閱讀