代码之家  ›  专栏  ›  技术社区  ›  Ishita Shah Y_Sh

如何通过xpath从包含多个部分相似链接文本的HTML中识别元素?

  •  -1
  • Ishita Shah Y_Sh  · 技术社区  · 6 年前

    要按定义的名称定位元素,

    我通过以下方式使用 contains 语法,但未实现目标元素

    String deviceName = "AutoTest";
    driver.findElement(By.xpath("//a[@class='noDecoration addPointer'][contains(text(),'"+deviceName+"')]"));
    

    正如我们所看到的,第一个数据包含变量中给定的值。每次它取第一个找到相同值的元素。但是,我想定位具有定义值的元素。如何追踪?

    HTML:

    <div class="deviceName truncate">
        <a class="noDecoration addPointer" ng-if="itemDeviceType" ng-href="" href="">AutoTest</a>
    </div>
    

    Wants to Locate

    3 回复  |  直到 6 年前
        1
  •  0
  •   undetected Selenium    6 年前

    根据 HTML 您已共享它似乎是 有棱角的 元素来定位你必须归纳的元素 WebDriverWait 。现在,如果要以类似的方式多次识别元素,可以创建 function() 将接受 String e、 g。 自动测试 要定位所需的元素,请执行以下操作:

    public void locateElement(String deviceType)
    {
        WebElement elem = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@class='deviceName truncate']/a[@class='noDecoration addPointer'][normalize-space()='" + deviceType + "']")));
        //you can do anything with the element
    }
    

    现在,您可以使用所需的 一串 无论何时何地需要的参数如下:

    locateElement("AutoTest")
    locateElement("AutoTest003")
    locateElement("AutoTest032")
    
        2
  •  0
  •   anonygoose    6 年前

    我认为Xpath并没有达到您所期望的效果。如果要通过多个谓词定位元素,则格式如下:

    driver.findElement(By.xpath("//a[@class='noDecoration addPointer' and contains(text(),'"+deviceName+"')]"));
    

    正如其他答案所建议的那样,你可能需要将这与等待结合起来。

        3
  •  0
  •   Aditya Gaurav    6 年前

    您正在使用 包含 在定位器中。这就是它发生的原因。只需删除contains并传递设备的确切名称。

    By.xpath("//a[@class='noDecoration addPointer'][@text()='"+deviceName+"')]
    

    如果使用它,将选择具有传递的设备名称的所有定位标记。在您的情况下,所有设备名称都包含“自动测试”。这就是为什么您得到的是第一个元素,而不是预期的元素。