有時會出現元素定位失敗的情況,以百度首頁為例,定位輸入框,報錯如下:
selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: [id='wd']
報錯提示沒有該元素,無法定位!
此處列舉幾個常見的,元素無法定位的情況,簡單級。
1.屬性名稱與屬性填寫錯誤
因為操作時,為了提高效率或者說偷懶,經常將已寫好同類命令的代碼,復制粘貼,用於新的命令,有時就忘了修改,比如上一個元素定位是用 id ,這一次定位是用 name('wd'),復制粘貼后,find_element_by_id('wd'),於是定位失敗。
2.點擊速度過快,頁面還沒加載出來就點擊頁面上元素
打開一個新的頁面時,可能頁面還沒加載出來,此時已經進行下一步操作,元素定位,於是報錯。
此時需要設置等待時間
import time
time.sleep(2) #強制固定等待2秒
3.動態 id 無法定位元素
比如淘寶web端登錄,賬號輸入框,id就是動態的,每次打開都不同。
此時可以使用 css 定位或 xpath 定位
4.元素在 iframe 里導致元素定位失敗
當元素在 frame 里,此時打開網頁直接使用 id/name/xpath 是無法定位元素的。
以qq郵箱web端登錄的賬號輸入框為例,查看元素顯示是這樣的……
……
<iframe id="login_frame" name="login_frame" ……>
……
<input type="text" class="inputstyle" id="u" name="u" value="" tabindex="1">
因為這個輸入框在 iframe id="login_frame" 這個frame 里,此時直接 ele = browser.find_element_by_name('u') 會顯示定位失敗。
需要先定位frame,再定位里面的元素。
browser.switch_to.frame('login_frame')
browser.find_element_by_name('u')
切記,在 frame 操作完成后,要切換出去
driver.switch_to.default_content()
5.不在同一個 frame 里
有時,一個頁面內有多個 frame,於是,比如左邊有一欄left_frame,右邊還有一欄right_frame,當你在某個frame里,就無法直接定位其他frame里的元素。
比如,打開頁面后,需要定位左欄的元素:
browser.switch_to.frame('left_frame') #切換進入左欄
browser.find_element_by_name('u') #此時只能定位左欄的元素
但是之后又需要定位右欄的元素:
driver.switch_to.default_content() #回到默認的content,此時只能定位頁面上非frame內的元素
driver.switch_to.frame('right_frame') #切換進入右欄
browser.find_element_by_name('u') #此時只能定位右欄的元素
最后回到默認content,就可以回到頁面默認內容,繼續操作了:
driver.switch_to.default_content()