如何在XPath中处理动态更改的ID?例如:

//div[@id='post-body-3647323225296998740']/div[1]/form[1]/input[1]


在此xpath ID中,每次重新加载页面时"3647323225296998740"都会更改。

硒中有什么方法可以处理这种情况?

评论

如何处理动态更改的ID?例如,ID为“ ss2j7z0k3x5r4y6g1rSROMLLUG65N65Z75U72R61G6eG6dP73Y”

实际上,页面上显示的动态ID是您应该查询的代码味道。特别要解决的问题是“是否泄漏有关系统内部的信息?”通常应避免使用动态ID。此外,如果自动化测试不是项目的功能要求,则应根据适当的定位器策略提供适当的ID。

#1 楼

在这种情况下,我们有很多选项-

选项1:查找其他每次不变的属性,例如名称,类等。在该div节点中。因此,如果此div节点具有class属性那么我们可以将xpath写为波纹管。

//div[@class='post-body entry-content']/div[1]/form[1]/input[1] 


选项2:我们可以在不需要在xpath中提供任何属性名称的情况下使用绝对xpath(完整xpath)。

/html/body/div[3]/div[2]/div[2]/div[2]/div[2]/div[2]/div[2]/div/div[4]/div[1]/div/div/div/div[1]/div/div/div/div[1]/div[2]/div[1]/form[1]/input[1] 


选项3:我们可以使用starts-with函数。在此xpath的ID属性中,“ post-body-”部分每次都保持不变。

 //div[starts-with(@id,'post-body-')]/div[1]/form[1]/input[1] 


选项4:我们可以使用contains函数。与波纹管一样,可以使用包含功能。

 div[contains(@id,'post-body-')]/div[1]/form[1]/input[1]


评论


恕我直言,不建议使用选项2,因为它太脆了

– olyv
16年11月28日在6:16

是的,最长的时间是我们避免使用绝对x路径,但是有时相对xpath在定位元素时不起作用,在这种情况下,我们必须使用绝对xpath:在这种情况下,我们必须设计从起始节点到下降元素节点的绝对路径。

–巴拉特鬃毛
16年12月22日在9:05

另外,不要忘记您可以检查id的多个部分:constant1-12232-constant2:“ // * [包含(@ id,'constant1')和contains(@ id,'constant2)]”

– tjb
19年5月3日,9:13

#2 楼

在XPath中使用contains()starts-with()函数:

解决方案:

contains()

//div[contains(@id,'post-body')]/div[1]/form[1]/input[1]


starts-with()

//div[starts-with(@id,'post-body')]/div[1]/form[1]/input[1]


#3 楼

使用其他元素和属性进行部分匹配和组合匹配

通常,在这些数据库支持的情况下,以及在Web元素选择器中更改ID的情况下,您的选择是查找以下一项或多项: >
更高级别的选择器,例如form名称,例如//form/input[@type='submit']

非唯一选择器的组合,它们在一起是唯一的,例如//form[@class='new_user']/input[@type='submit']

数据属性,例如form[@data-form='new-user']//input

使用starts-withcontainspost-body-的部分匹配,例如//div[starts-with(@id,'post-body-')]/div[1]/form[1]/input[1]



#4 楼

如果id对于特定的xpath动态变化,那么我们可以使用以下xpath函数:
xpath Syntax: //html tag[contains(text()/@attribute, 'Expected Value')]

Preceding-Siblings:语法与
Xpath Syntax : //html tag/following-siblings::html tag ex: //img[@src = 'image2.jpg']/following-siblings::input[@type = 'button']
后代函数用于通过跳过所有
标识大子节点
following-Siblings

评论


我认为“兄弟姐妹”在这种情况下不会起作用。

–巴拉特鬃毛
16年5月4日在6:05

#5 楼

在这种情况下,您可以使用regex,而不是使用XPath,而可以在CSS Selector中使用一些通配符来定位它们。请参考此链接。

input[id^='post-body-'][id$='id pattern']

请参阅此链接,以了解如何使用通配符使用CSS选择器。