如何处理绝对xpath的更改?

时间:2019-10-31 04:12:59

标签: selenium selenium-webdriver xpath webdriver xpath-1.0

HTML:

<div class="component-multi-row-slide-title"> Cloth </div>

xpath

/html/body/div/main/div/div/div[2]/div/div/div/div[1]/div/div***[4]***/div/div[2] the div[4] 

保持变化。如果有新项目进入网络,开发人员将更改div编号。

我想单击“服装”。添加新类别后,xpath会不断变化。

6 个答案:

答案 0 :(得分:1)

首先使用绝对xpath具有某些缺点,因为添加新元素时,先前标识的元素的 xpath 会不断变化。因此,解决方案是使用相对Xpath

根据您提供的HTML,要单击文本为布料的元素,可以使用以下Locator Strategy

  • XPath 答:

    //div[@class='component-multi-row-slide-title' and contains(., 'Cloth')]
    
  • XPath B:

    //div[@class='component-multi-row-slide-title' and normalize-space()='Cloth']
    

答案 1 :(得分:0)

绝对Xpath:它包含从根元素到期望元素的完整路径。

相对Xpath:这更像是从引用所需元素开始并从特定位置开始。

您始终使用相对路径来测试元素。其背后的原因是,如果您在网站上进行任何体系结构更改,则更改不会影响元素的测试或选择。

因此,使用如下相对xpath

WebElement cloth = driver.findElement(By.xpath("//div[normalize-space()='Cloth']"));
cloth.click();

让我知道这是否无济于事

答案 2 :(得分:0)

我建议使用自定义的xpath。如下所示:

driver.findElement(By.xpath("//div[contains(text(), 'Cloth')]").click

driver.findElement(By.xpath("//div[contains(text(), 'Fashion Acessories')]").click

肯定会起作用。随时让我知道有关xpath的问题。

谢谢

答案 3 :(得分:0)

在这种情况下,您需要使用相对xpath。

您可以使用以下选项中的任何xpath。前两个将按文本查找元素,第三个将按类查找选项。

1>>driver.findElement(By.xpath("//div[contains(text(),'Cloth')]")).click();

2>>driver.findElement(By.xpath("//*[contains(text(),'Cloth')]")).click();

3>>driver.findElement(By.xpath("//div[@class='component-multi-row-slide-title']")).click();

让我知道其他元素是否也存在相同的类名。

答案 4 :(得分:0)

仅供参考:XPath用于使用HTML DOM结构查找网页上任何元素的位置。

绝对XPath的缺点是,如果在元素的路径中进行了任何更改,则XPath将会失败。

因此,在这种情况下,可以使用相对Xpaths

// div [contains(text(),'Cloth')]或// * [contains(text(),'Cloth')]

// div [contains(text(),'Fashion Acessories')]或// * [contains(text(),'Fashion 附件')]

使用方法: driver.findElement(By.xpath(“ // div [contains(text(),'Cloth')]”)));

答案 5 :(得分:-1)

您编写以下代码

driver.findElement(By.xpath("//div[normalize-space()='Cloth']").click

上面的代码将直接识别元素,并且当开发人员更改页面元素时,它本质上不会变脆。