1.元素id動态變化
以如下圖檔舉例
當我們要定位到該元素時,如果采用id屬性定位,那麼很有可能定位不到。
原因:當我們重新整理一遍網頁時,會發現id值發生變化,表明它是個動态id,每次自動化時會因為值不同無法定位到該元素
解決方法:采用其他屬性定位,如案例中即可采用data-placeholder的值定位
2.定位的元素嵌套在iframe當中
以如下圖檔舉例
以剛剛圖檔舉例,當我們選擇用data-placeholder定位時,發現還是定位不到,我們将檢查元素界面往前翻
原因:發現該元素嵌套在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()