java - 如何在没有 By 定位器的情况下使用 WebDriverWait.until?

标签 java selenium xpath selenium-webdriver wait

我正在使用通过框架 (Cucumber) 实现的 Selenium WebDriver,我遇到了一个问题,即在对元素执行操作之前等待元素加载。

最初,我想使用隐式等待,但如果一个元素没有立即加载,它就会等待超时。通常情况下,它使我的测试时间比我想要的要长。

然后,我想使用 Explicit wait 使每种情况的等待时间尽可能短。 问题是 WebDriverWait.until 中的大多数 ExpectedConditions 正在寻找位于 By 的元素。定位器(它们是 ClassName、CssSelector、Id、LinkText、Name、PartialLinkText、Tagname 或 XPath)。 我在用于单击网络元素的一般函数中使用 WebDriverWait.until。 我正在测试的网站上的 Webelements 是由 dojo 生成的,没有静态 ID。它们并不总是有其他类型的定位器,或者它们不是静态的。 然后,开发人员向网络元素添加了一个名为 data-automation-id 的附加属性。我想在显式等待中使用此属性,但找不到实现它的方法。

我尝试使用以下代码来使用 xpath:

public void clickOnDataAutomationId(String dataautomationid) {
    WebDriverWait wait = new WebDriverWait(driver, 10);
    WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//" + findDataAutomationId(dataautomationid).getAttribute("tagName") + "[contains(@data-automation-id, '" + dataautomationid + "')]")));
    findDataAutomationId(dataautomationid).click();
}

findDataAutomationId() 是一个函数,返回第一个包含 data-automation-id 作为 FluentWebElement 的网络元素。

问题是,如果未立即加载 Web 元素,则 findDataAutomationId 会失败,这使得 WebDriverWait.until 变得毫无意义。您是否看到另一种无需重构网站即可解决“按定位器”问题的方法?

最佳答案

无需使用findDataAutomationId方法检索webelement,您可以直接找到webelement,然后点击它,如下所示:

public void clickOnDataAutomationId(String dataautomationid) {
   WebDriverWait wait = new WebDriverWait(driver, 10);
   WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[contains(@data-automation-id, '" + dataautomationid + "')]")));
   element.click();
} 

或者,如果data-automation-id是一个完整的文本而不是一个部分,那么你可以使用下面的代码:

public void clickOnDataAutomationId(String dataautomationid) {
   WebDriverWait wait = new WebDriverWait(driver, 10);
   WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@data-automation-id, '" + dataautomationid + "')]")));
   element.click();
}

关于java - 如何在没有 By 定位器的情况下使用 WebDriverWait.until?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27845405/

相关文章:

java - 求含有未知元素的矩阵中某一列的平均值

java - 如何在 Java 中组合两个列表

java - TestNG 使用@Factory 和@DataProvider

Python 脚本未运行且未给出错误

html - 提取此元标记的 xpath 正则表达式是什么?

java - 如何用其他内容替换此 "if"语句?

java - 如何在 Android 中渲染 PDF

java - selenium 找不到出现在我的浏览器中的 iframe

PHP 和 XPath 循环

syntax - 如何使用XPath表达式选择所有叶节点?