我使用的是使用框架(Cucumber)实现的Selenium WebDriver,我面临着在对元素执行操作之前等待加载元素的问题。
最初,我想使用隐式等待,但如果没有立即加载元素,它将等待超时。通常情况下,它使我的测试比我想要的更长。
然后,我想使用显式等待使每个案例的等待时间尽可能短。 问题是,WebDriverWait.until中的ExpectedConditions上的大多数都在寻找By定位器所定位的元素(ClassName,CssSelector,Id,LinkText,Name,PartialLinkText,Tagname或XPath)。 我在一个用于点击webelement的常规函数中使用WebDriverWait.until。 我正在测试的网站上的webelements是由dojo生成的,没有静态id。它们并不总是有其他类型的定位器,或者它们不是静态的。 然后,开发人员向webelement添加了一个名为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的第一个webelement作为FluentWebElement。
问题是如果未立即加载webelement,则findDataAutomationId会失败,这会使WebDriverWait.until变得毫无意义。您是否看到了在不重构网站的情况下解决By Locators的另一种方法?
答案 0 :(得分:2)
您可以使用 findDataAutomationId 方法检索webelement,而不是直接找到webeelement,然后点击它,如下所示:
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();
}
答案 1 :(得分:0)
使用" presenceOfElementLocated"方法而不是" elementToBeClickable"。这个改变可能会帮助你
答案 2 :(得分:0)
你在解决方案之下。在apply()为true或等待超时
之前,它不会返回WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(new Function<WebDriver, Object>() {
@Nullable
public Object apply(@Nullable WebDriver input) {
//add any condition or check your data-automation-id is visible/clickable
return true;
}
});
}