1. 程式人生 > >Python selenium —— 動態id、class怎麼定位

Python selenium —— 動態id、class怎麼定位

今天再給大家分享一個定位不到元素的原因——動態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專欄: