joy
joy

Reputation: 111

wait until function not working

I am clicking one element and I am using wait function to identify the next element. This is the wait function.

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

After identifying the element, I carry out other actions but when I click for the 1st element it will lead to next page so by the time page loads the wait function is applying for the current page and giving exception. Is there any solution for this? I tried

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

before wait but it's not working. It will only work if I use thread.sleep(1000) before wait but I dont want use thread.sleep().

Upvotes: 0

Views: 7265

Answers (5)

JeffC
JeffC

Reputation: 25744

I'm guessing the problem is with the fact that you are using

ExpectedConditions.presenceOfElementLocated(...)

Presence just means that the element is present in the DOM, not that it's visible, enabled, clickable, etc. I would suggest that you change to wait to match what you want to do with the element you are looking for. If you want to click it, wait for it to be clickable. If you want to get text from it, wait for it to be visible, etc.

Another issue may be that you are intending to wait for an element on page 2 but an element matches that locator on page 1. One solution is to find a unique element on page 2, wait for it to be visible, and then wait for your desired element. That way you ensure that you are on the correct page before waiting for the desired element on page 2.

Upvotes: 2

Gaurav Thantry
Gaurav Thantry

Reputation: 803

If the element that is to be clicked is in the next(new) page, you'll have to use the windows iterator. You could use this code:

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);

Upvotes: 0

Zakaria Shahed
Zakaria Shahed

Reputation: 2707

I also Have the same Problem But using this I solved

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

Upvotes: 0

iamsankalp89
iamsankalp89

Reputation: 4749

I think you want to click on element, so use elementToBeClickable

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

Upvotes: 0

Tony Bui
Tony Bui

Reputation: 815

I think there are 2 waits in this situation:

  • Wait for next page loaded
  • Wait for specified element loaded in the new page

Below is an option to wait for page loaded:

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

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

Then wait for next element visible:

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

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

or using other solutions:

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

with:

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

Upvotes: 0

Related Questions