如何通过HTML中的xpath识别元素,并使用多个部分相似的链接文本?

时间:2018-04-25 10:21:21

标签: selenium selenium-webdriver xpath webdriver

想要通过定义的名称

来定位元素

我按照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 个答案:

答案 0 :(得分:0)

我不认为Xpath正在做你期望的事情。如果要按多个谓词定位元素,则格式为:

# Directories #
###############
/icecream/test.*
/icecream/_common_/*.txt
/icecream/cache/**
/icecream/include/compiled/**
/icecream/include/configure/**
/icecream/include/configure/important.php

# Confirmation files #
######################
google*.html
yandex*.html

您可能需要将此与等待结合起来,正如其他答案所示。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:-1)

根据 HTML ,你已经分享它似乎是一个 Angular 元素,所以要找到你必须诱导 WebDriverWait 的元素。现在,如果您要多次以类似的方式识别元素,可以创建一个function()来接受String,例如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 } 自动测试以按如下方式找到所需元素:

String

现在,无论何时何地,您都可以使用所需的locateElement("AutoTest") locateElement("AutoTest003") locateElement("AutoTest032") 参数调用此函数,如下所示:

{{1}}