如何最好地用Java中的SeleniumWebdriver用EXTJS生成的元素替换xpath选择器



好吧,我正在努力优化我的测试。这可能只是Selenium Webdriver的一个限制,但我从来没有得到一个可靠的答案,所以我直接问这个问题。出现这种情况的原因是,对于我的测试,我必须使用xpath选择器。最近,我不得不在所有测试中返回并更改所有选择器,因为在某个地方添加了div,或者我们升级到了重写框架的extJS6。从本质上讲,在下面的例子中,我不再使用

driver.findElement(By.xpath("html/body/div/div/div/table/tbody/tr[1]/td/span")).getText();

driver.findElement(By.xpath("html/body/div/div/div/table[1]/tbody/tr/td/span")).getText();

正如你所看到的,这些变化很小,但我不得不进行一百多次测试,其中一些测试要复杂得多。下面是我正在测试的代码的一个示例。

<html>
<body>
<div id="syn-scheduletree-body" class="class="x-panel-body x-grid-no-row-lines x-grid-body x-panel-body-default x-panel-body-default"">
<div class="x-tree-view x-fit-item x-tree-view-default x-unselectable x-scroller">
<div class="x-grid-item-container">
//Here is Example 1
<table id="treeview-1068-record-158">
<tbody>
<tr class="x-grid-tree-node-leaf  x-grid-row">
<td class="x-grid-tree-node-leaf  x-grid-row">
<span class="x-tree-node-text">
Example 1
</span>
</td>
</tr>
</tbody>
</table>
//Here is Example 2
<table id="treeview-1068-record-159">
<tbody>
<tr class="x-grid-tree-node-leaf  x-grid-row">
<td class="x-grid-tree-node-leaf  x-grid-row">
<span class="x-tree-node-text">
Example 2
</span>
</td>
</tr>
</tbody>
</table>
//Here is Example 3
<table id="treeview-1068-record-160">
<tbody>
<tr class="x-grid-tree-node-leaf  x-grid-row">
<td class="x-grid-tree-node-leaf  x-grid-row">
<span class="x-tree-node-text">
Example 3
</span>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</body>
</html>

在我的一个测试中,我必须完成并单击一个保存按钮,该按钮在表中的列表中创建了一个新实例。因此,我不能依赖任何硬编码的xpath,因为每次与新div一起生成的numebr都会不同。所以我包含了以下逻辑

String i = 1;
while (i < 100) {
String temp = driver.findElement(By.xpath("html/body/div/div/div/table[" + i + "]/tbody/tr/td/span")).getText();
if (temp.contains("Example 2")) {
break;
}
i++;
}

这结合了java逻辑来查找列表中的元素,并使用Stringi.存储该元素的位置

我的问题是有没有更好的方法。我有一位同事最近提到,如果我可以使用选择器在javascript中选择一些东西,这一切都会变得更容易,而且它比xpath需要更少的维护。我只是不知道该怎么做,从哪里开始,如果可能的话。如果需要,我可以提供更多信息。如果你有什么建议,请告诉我。这还不是一个发布的产品,所以我在短时间内看到了很多功能的更改和添加,由于xpath的性质,这促使我重写了大多数测试。

使用Seleniums-xpaths可以根据元素的文本找到元素,这应该会为您提供您想要的元素:

driver.findElement(By.xpath("html/body/div/div/div/table/tbody/tr/td/span[contains(text(), 'Example 2')]"));

@Senator1891我不能发表评论,所以我把它放在这里。

我如何应用你给我的代码来点击是否包含包含特定文本集的跨度?

在这种情况下,好的解决方案是xpath("//a[contains(., '" + report + "')]")

这个.将在<a>中的元素中找到文本,在您的情况下就是<span>

最新更新