Selenium如何定位動態id/class的元素?


 今天再給大家分享一個定位不到元素的原因——動態id。

沒有打開新頁面、沒有alert、沒有frame、加了等待時間,但是還是定位不到元素?很有可能是你要定位的元素的屬性是動態的,即每次打開頁面,這個元素的id或者class等元素屬性是動態生成的。代碼執行時,元素的屬性已經與之前不同,用之前的屬性值去定位自然是定位不到的,會拋出NoSuchElementException。

那么,怎么判斷元素屬性是否是動態?很簡單,一般看到元素屬性里有拼接一串數字的,就很有可能是動態的。想要分辨,刷新一下瀏覽器再看該元素,屬性值中的數字串改變了,即是動態屬性了。

如下:
<div id="btn-attention_2030295">...</div>
怎么定位這類型的元素呢?

根據其他屬性定位
如果有其他固定屬性,最先考慮的當然是根據元素的其他屬性來定位,定位方式那么多,何必在這一棵樹上吊死。。

根據相對關系定位
根據其附近的父節點、子節點、兄弟節點定位,關於這方面,微信之前有文章做介紹。

根據DOM順序index定位
這個很簡單,找到該元素在主文檔或某級父節點中的index,然后根據index可輕松定位,不過這種方式可能不夠穩定,如果可以,還是用其他的方法定位更加合適。

根據部分元素屬性定位
xpath中提供了三個非常好的方法來為我們定位部分屬性值:
復制代碼
driver.find_element_by_xpath ("//div[contains(@id, 'btn-attention')]") driver.find_element_by_xpath ("//div[starts-with(@id, 'btn-attention')]") driver.find_element_by_xpath ("//div[ends-with(@id, 'btn-attention')]") # 這個需要結尾是‘btn-attention’ contains(a, b) 如果a中含有字符串b,則返回true,否則返回false starts-with(a, b) 如果a是以字符串b開頭,返回true,否則返回false ends-with(a, b) 如果a是以字符串b結尾,返回true,否則返回false
復制代碼
這里要多嘴一句,各種瀏覽器對xpath的支持情況不一樣,像IE就差點,所以有時候會出現xpath在一個瀏覽器能定位到但在另一個瀏覽器定位不到的問題,不要驚訝。 
 
補充: 上述三種方法,contains測試可以,另外兩種語法測試不可用.
 
作者:丨Fighter.Lu丨 點滴記錄,開源共享。幫助更多有需要的人解決問題!博主博客地址:http://www.cnblogs.com/fighter007/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM