//div[@id='post-body-3647323225296998740']/div[1]/form[1]/input[1]
在此xpath ID中,每次重新加载页面时
"3647323225296998740"
都会更改。 硒中有什么方法可以处理这种情况?
#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-with
或contains
与post-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选择器。
评论
如何处理动态更改的ID?例如,ID为“ ss2j7z0k3x5r4y6g1rSROMLLUG65N65Z75U72R61G6eG6dP73Y”实际上,页面上显示的动态ID是您应该查询的代码味道。特别要解决的问题是“是否泄漏有关系统内部的信息?”通常应避免使用动态ID。此外,如果自动化测试不是项目的功能要求,则应根据适当的定位器策略提供适当的ID。