Java XPath div在每次新构建后都会更改

Java XPath div在每次新构建后都会更改,java,selenium,selenium-webdriver,xpath,Java,Selenium,Selenium Webdriver,Xpath,我目前正在使用selenium java开发一个web应用程序。为了定位元素,我使用了相对XPath。我经常遇到一个问题,每当我得到一个新的构建时,我的xpath div值都在变化。 E.x: 构建1: //*[@id='container']/div/div/div/div/div[5]/div/ul/li[1]/div/ul/li[13]/button 构建2: //*[@id='container']/div/div/div/div/div[6]/div/ul/li[1]/div/ul/

我目前正在使用selenium java开发一个web应用程序。为了定位元素,我使用了相对XPath。我经常遇到一个问题,每当我得到一个新的构建时,我的xpath div值都在变化。 E.x:

构建1:

//*[@id='container']/div/div/div/div/div[5]/div/ul/li[1]/div/ul/li[13]/button
构建2:

//*[@id='container']/div/div/div/div/div[6]/div/ul/li[1]/div/ul/li[13]/button
我们如何使这个xpath适用于每个构建?甚至我们也将此xpath用于“for循环”

for (int i = 1; i <= 4; i++) {
    com.click("xpath","/html[1]/body[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[4]/div[1]/div[1]/div[1]/div[2]/div[1]/div[1]/div[1]/div[1]/div[2]/div[1]/div[1]/div[2]/ul[1]/li[1]/div[2]/div[1]/ul[1]/li["+ i + "]/div[1]/span[2]/div[1]");         
}
用于(int i=1;i使用以下内容

for (int i = 1; i <= 4; i++) {
driver.findElement(By.xpath("//button[@title='click to unlock the layout']")).click();

for(int i=1;i谓词中包含数字数据类型的XPath表达式只是一个缩写形式,用于与
position()
函数进行比较

您也可以使用此仅限XPath的表达式:

/html[1]/body[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[4]/div[1]/div[1]/div[1]/div[2]
  /div[1]/div[1]/div[1]/div[1]/div[2]/div[1]/div[1]/div[2]/ul[1]/li[1]/div[2]/div[1]/ul[1]
      /li[position() <= 4]/div[1]/span[2]/div[1]
/html[1]/body[1]/div[1]/div[1]/div[1]/div[1]/div[4]/div[1]/div[1]/div[1]/div[2]
/div[1]/div[1]/div[1]/div[1]/div[2]/div[1]/div[2]/ul[1]/li[1]/div[2]/div[1]/ul[1]

/li[position()为什么不使用标记内部的内容以及标记之间的文本,以便获得所需的Web元素呢。 这不是一个好方法,因为它将改变计划的结构,并将面临您现在面临的问题

  • 我希望您使用标签内的参数,如
    id、名称、类、占位符等
    例如:-xpath=“//输入[@name='email']”

  • 标签之间的文本,如
    xpath=“//a[contains(text(),'这是一个示例')”

这将解决大部分问题

试试看,它会帮你的


如果您有任何疑问,请联系我。

我认为应该有更好的方法来编写您正在使用的xpath。请从
[@id='container']开始共享按钮的html
element。如果您要求开发人员向button等难以处理的元素添加id属性,这很好,并且您可以使用id来定位相同的元素。您好@Alejandro,因为我的div值在每次新构建后都会发生变化,即使当我更改为position()时也是如此它可能不起作用。@krishna我不理解你的评论。这个表达式将与(int i=1;i是,但当我的构建发生更改时,我的xpath div值也在更改..因此,一旦我的构建发生更改,它将正常工作..Hi@arkadiyala这不起作用,因为“单击公司引用子选项”不是xpath中的文本。。
/html[1]/body[1]/div[1]/div[1]/div[1]/div[1]/div[1]/div[4]/div[1]/div[1]/div[1]/div[2]
  /div[1]/div[1]/div[1]/div[1]/div[2]/div[1]/div[1]/div[2]/ul[1]/li[1]/div[2]/div[1]/ul[1]
      /li[position() <= 4]/div[1]/span[2]/div[1]