等到功能不起作用

时间:2017-09-20 10:42:51

标签: selenium selenium-webdriver wait ui-automation

我点击了一个元素,我正在使用wait函数来识别下一个元素。这是等待功能。

wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("some xpath")));

在识别元素之后,我执行其他操作,但是当我单击第一个元素时它将转到下一页,因此在页面加载时wait函数正在申请当前页面并给出异常。这有什么解决方案吗?我试过了

Browser.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);

wait之前

但它无效。只有在thread.sleep(1000)之前使用wait但我不想使用thread.sleep().

5 个答案:

答案 0 :(得分:1)

我猜测问题在于你正在使用

->orWhere($qb->expr()->isNull('t.hardware'))

Presence只是意味着元素存在于DOM中,而不是它可见,启用,可点击等。我建议您更改为等待您想要对您要查找的元素进行匹配。如果要单击它,请等待它可单击。如果你想从中获取文本,等待它可见,等等。

另一个问题可能是您打算等待第2页上的元素,但元素与第1页上的定位符匹配。一种解决方案是在第2页上找到一个唯一元素,等待它可见,然后等待你想要的元素。这样,您就可以确保在等待第2页上的所需元素之前就在正确的页面上。

答案 1 :(得分:0)

我认为在这种情况下有2次等待:

  • 等待下一页加载
  • 等待新页面中加载的指定元素

以下是等待加载页面的选项:

public void waitForLoad() {
    ExpectedCondition<Boolean> condition = webDriver -> webDriver.getCurrentUrl().contains(getPageUrl());

    WebDriverWait wait = new WebDriverWait(driver, pageLoadTimeout);
    wait.until(condition);
}

然后等待下一个元素可见:

protected void waitFor(By by) {
    ExpectedCondition<Boolean> condition = webDriver -> !webDriver.findElements(by).isEmpty();

    WebDriverWait wait = new WebDriverWait(driver, pageLoadTimeout);
    wait.until(condition);
}

或使用其他解决方案:

public WebElement elementToBeClickable(By locator, int timeout) {
    try {
        return getWebDriverFluentWait(timeout)
                .until(ExpectedConditions.elementToBeClickable(locator));
    } catch (Exception e) {
        return null;
    }
}

使用:

private Wait<WebDriver> getWebDriverFluentWait(int timeout) {
    return new FluentWait<WebDriver>(driver)
            .withTimeout(timeout, TimeUnit.SECONDS)
            .pollingEvery(1, TimeUnit.SECONDS)
            .ignoring(NoSuchElementException.class);
}

答案 2 :(得分:0)

我想你想点击元素,所以使用elementToBeClickable

WebDriverWait wait=new WebDriverWait(driver, 30);
wait.until(ExpectedConditions.elementToBeClickable(locator))

答案 3 :(得分:0)

我也有同样的问题 但是使用这个我解决了

WebElement element = (new WebDriverWait(driver, 30)).until(ExpectedConditions.elementToBeClickable(By.xpath(".//*[@class='IM_overlay']")));    //it will wait 30 second for get this element
element .click();
//You can Do any operator here

答案 4 :(得分:0)

如果要单击的元素位于下一个(新)页面中,则必须使用Windows迭代器。 您可以使用此代码:

&#13;
&#13;
Set <Strings> ids = driver.getWindowHandles();
Iterator <String> it = ids.iterator();
String currentPage = it.next();
String newPage = it.next();
driver.switchTo().window(newPage);//this will switch to the new window. Use your 'wait' condition now and do all the operations
 //now to switch back to the previous(current) window, you could use the below code
driver.switchTo().window(currentPage);
&#13;
&#13;
&#13;