有时候页面元素的ID是动态变化的,这种变化的ID,无法通过By.ID来定位,也无法通过BY.XPATH的绝对路径来定位
比如此li标签的id,中间的数字部分就是变化的,刷新页面后,id中间部分的数字就会变化
刷新页面前ID:
刷新页面后ID:
这种动态ID可以使用部分属性值匹配来定位
xpath中提供了四个非常好的方法来为我们定位部分属性值:
1、contains(a, b) 如果a中含有字符串b,则返回true,否则返回false
示例代码
#判断ID中包含'-0-0'
WebDriverWait(driver, 10).until(
EC.visibility_of_element_located(
(By.XPATH, "//li[contains(@id, '-0-0')]"))).click()
2、starts-with(a, b) 如果a是以字符串b开头,返回true,否则返回false
示例代码
#判断ID以'cascader-menu-'开头
WebDriverWait(driver, 10).until(
EC.visibility_of_element_located(
(By.XPATH, "//li[starts-with(@id, 'cascader-menu-')]"))).click()
也可以组合使用
#判断id以'cascader-menu-'开头,并且id中包含'-0-0'
WebDriverWait(driver, 10).until(
EC.visibility_of_element_located(
(By.XPATH, "//li[starts-with(@id, 'cascader-menu-') and contains(@id, '-0-0')]"))).click()
3、ends-with(a, b) 如果a是以字符串b结尾,返回true,否则返回false(不推荐此方法)
示例代码
此方法未运行成功,百度了一下原因:ends-with方法是xpath 2.0的语法,而浏览器只支持xpth 1.0,所以不能成功运行
可以用第4点的substring 和 string-length 组合使用替代此方法,substring 和 string-length 组合使用,同样可以检查ID是否以 某字符串 结尾
#判断ID以'-0-0'结尾
WebDriverWait(driver, 10).until(
EC.visibility_of_element_located(
(By.XPATH, "//li[ends-with(@id, '-0-0')]"))).click()
4、substring 和 string-length 组合用来检查ID是否以 某字符串 结尾
示例代码
#判断id以'-0-2'结尾
WebDriverWait(driver, 10).until(
EC.visibility_of_element_located(
(By.XPATH, "//li[substring(@id, string-length(@id) - string-length('-0-2') + 1) = '-0-2']"))).click()