想要通过定义的名称
来定位元素我按照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>
答案 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}}