Python selenium的动态 id、class 怎么定位

猿友 2020-12-28 17:17:24 浏览数 (5005)
反馈

python 中会遇到定位不到元素的缘由-动态 id、class。

未打开新页面、没有 alert、没有 frame、添加等待时间,但还是定位不到元素?有很多是你要定位的元素属性是动态的。即每次打开页面,这个元素的 id 或 class 等元素属性是动态生成的。代码履行时,元素的属性已经和之前不同,用之前的属性值去定位当然是定位不到的,会抛出 NoSuchElementException。

那么,怎样判断元素是不是动态呢?很简单,一般看到元素属性里有拼接1串数字的,就有很多是动态的。想要分辨?刷新一下阅读器再看该元素,属性值中的数字串改变了,即是动态属性了。

如下:

<div id="btn-attention_2031232">...</div>

怎样定位这类型的元素呢?

1.根据其他属性定位

如果有其他固定属性,最早斟酌的当然是根据元素的其他属性来定位,定位方式那么多,没必要在一棵树上吊死。

2.根据相对关系定位

根据其附近的父节点、子节点、兄弟节点定位

3.根据 DOM 顺序 index 定位

这个很简单,找到该元素在主文档或某级父节点中的 index,然后根据 index 可轻松定位,不过这类方式不是很未定,如果可以用其他方式定位更适合

4.根据部分元素属性定位

xpath 中提供了3个非常好的方法来为我们定位部分属性值:

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’

contain(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 在一个浏览器能定位到但在另外一个浏览器定位不到的问题,不要惊讶。


0 人点赞