Python selenium —— 動態id、class怎麼定位
阿新 • • 發佈:2018-12-30
今天再給大家分享一個定位不到元素的原因——動態id。
沒有開啟新頁面、沒有alert、沒有frame、加了等待時間,但是還是定位不到元素?很有可能是你要定位的元素的屬性是動態的,即每次開啟頁面,這個元素的id或者class等元素屬性是動態生成的。程式碼執行時,元素的屬性已經與之前不同,用之前的屬性值去定位自然是定位不到的,會丟擲NoSuchElementException。
那麼,怎麼判斷元素屬性是否是動態?很簡單,一般看到元素屬性裡有拼接一串數字的,就很有可能是動態的。想要分辨,重新整理一下瀏覽器再看該元素,屬性值中的數字串改變了,即是動態屬性了。
如下:
<div id="btn-attention_2030295" >...</div>
怎麼定位這型別的元素呢?
1. 根據其他屬性定位
如果有其他固定屬性,最先考慮的當然是根據元素的其他屬性來定位,定位方式那麼多,何必在這一棵樹上吊死。。
2. 根據相對關係定位
3. 根據DOM順序index定位
這個很簡單,找到該元素在主文件或某級父節點中的index,然後根據index可輕鬆定位,不過這種方式可能不夠穩定,如果可以,還是用其他的方法定位更加合適。
4. 根據部分元素屬性定位
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在一個瀏覽器能定位到但在另一個瀏覽器定位不到的問題,不要驚訝。。
附上一個此型別問題:
更多關於python selenium的文章,請關注我的CSDN專欄: