今天再給大家分享1個定位不到元素的緣由——動態id。
沒有打開新頁面、沒有alert、沒有frame、加了等待時間,但是還是定位不到元素?很有多是你要定位的元素的屬性是動態的,即每次打開頁面,這個元素的id或class等元素屬性是動態生成的。代碼履行時,元素的屬性已與之前不同,用之前的屬性值去定位自然是定位不到的,會拋出NoSuchElementException。
那末,怎樣判斷元素屬性是不是是動態?很簡單,1般看到元素屬性里有拼接1串數字的,就很有多是動態的。想要分辨,刷新1下閱讀器再看該元素,屬性值中的數字串改變了,即是動態屬性了。
以下:
<div id="btn-attention_2030295">...</div>
怎樣定位這類型的元素呢?
如果有其他固定屬性,最早斟酌確當然是根據元素的其他屬性來定位,定位方式那末多,何必在這1棵樹上吊死。。
根據其附近的父節點、子節點、兄弟節點定位,關于這方面,博主之前的1篇文章可作為參考:Python selenium —— 父子、兄弟、相鄰節點定位方式詳解
這個很簡單,找到該元素在主文檔或某級父節點中的index,然后根據index可輕松定位,不過這類方式可能不夠穩定,如果可以,還是用其他的方法定位更加適合。
xpath中提供了3個非常好的方法來為我們定位部份屬性值:
driver.find_element_by_xpath("http://div[contains(@id, 'btn-attention')]")
driver.find_element_by_xpath("http://div[starts-with(@id, 'btn-attention')]")
driver.find_element_by_xpath("http://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
這里要多嘴1句,各種閱讀器對xpath的支持情況不1樣,像IE就差點,所以有時候會出現xpath在1個閱讀器能定位到但在另外一個閱讀器定位不到的問題,不要驚訝。。
附上1個此類型問題:
Xpath “ends-with” does not work
更多關于python selenium的文章,請關注我的CSDN專欄:Python Selenium自動化測試詳解