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

时间:2015-01-08 16:52:39

标签: java selenium xpath selenium-webdriver wait

我使用的是使用框架(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的另一种方法?

3 个答案:

答案 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; 
                }
            });
    }