這是我經常被問到的一個問題,也是我很討厭回答的問題,因為要想回答這個問題需要知道上下文。什么樣式的元素,有哪些屬性,是否有表單嵌套,都嘗試了哪些定位方法。。。而且沒幾個提問者能事先詳細的說明這些。哪兒像提bug一樣描述重現步驟,而且每一步都截圖,生怕開發重現不了。反正,向我提問者沒見過這樣的,大多就報着試試態度,你愛回不回,碰碰運氣說不定就回我了。
當然,我寫這一篇文章的目的肯定不是為了吐槽,我是打算拿這個鏈接丟給他看,所以,這里會總結常見幾種情況,以及解決辦法。如果本文能不解決你的問題,你問我也沒用。
1、是否有表單嵌套。
像這樣順着定位的元素往上找,如果找到了<iframe>
標簽說明你定位的元素是在表單里面的,你需要先切換到這個表單,再定位元素。
2、是否打開了新窗口。
像這樣的,就是兩個窗口,從登錄窗口點擊“注冊”打開的新窗口。不切換到注冊窗口怎么操作?
本來多窗口不是眼瞎都能看出來,但是,前兩天一個同學的情況,登錄界面,點擊了登錄之后舊的登錄窗口關閉,新的登錄之后的窗口打開。這就有點迷惑人了。不過,你依然可以通過多窗口的處理來解決這個問題。
3、元素不可見或不滿足條件。
有些元素並不是不存在,而是不可見;或者你的操作步驟缺少前提步驟。
像這樣,我要想操作“搜索設置”不需要先鼠標懸停在“設置”上么?鼠標懸停“設置”鏈接上就是前提條件。
請把鼠標從“設置”上面移開,是不是發現display為none,它所在的整個
4、定位方式不唯一,或根本就找不到任何元素。
我都試了好幾種定位方式了,怎么看這個元素就是這個屬性,沒錯啊!這應該是你最常遇到了情況。這個時候怎么辦呢?很簡單。檢驗你的定位方式到底有沒有找到元素。
不管用什么定位方法,請用find_elements_by_xxx() 來定位一組元素。如果統計結果是0,說明你的定位方法找不到任何元素,你問我也幫不了你。如果大於1,說明你這種定位方法不是唯一的。
其實,不唯一還好辦,我們可以進一步篩選。
把元素的所有屬性都打印出來,看看第幾個才是你想要的。
然后,你就可以愉快的選擇你想要定位的元素了,像這樣。
最后,贈送一個快速定位元素技巧。
啟動Chrome瀏覽器,打開“開發者工具”,切換到console標簽,通過 document.querySelector() 方法使用CSS語法定位元素。
你可以快速的驗證CSS是否可以定位到元素,如果可用就復制到Selenium當中,不用每次通過運行Selenium腳本來驗證,效率上快上很多。
什么?你不懂CSS定位?或者你看不懂我在講什么。 你可能缺一本《Selenium 自動化測試實戰 --基於python語言》