so cal cheesehead
so cal cheesehead

Reputation: 2573

Selenium - How to execute a command while WebDriverWait wait.until is running

Is it possible to execute a command while waiting for an element to appear? In particular I'm waiting for an element to appear but it's not going to appear unless I refresh the page. Here's my code

wait = new WebDriverWait(driver, 30);
element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("xpath_here")));
state = element.getText();

The element I'm waiting for is never going to appear unless I hit the app's refresh button. How can I refresh during the 30 second timeout that I set?

Upvotes: 0

Views: 1799

Answers (2)

Alex Okrushko
Alex Okrushko

Reputation: 7372

You can do something like this:

    System.out.println("before wait");
    WebElement el = (new WebDriverWait(driver, 30))
      .until(new ExpectedCondition<WebElement>(){
        //try the following cycle for 30 seconds
        @Override
        public WebElement apply(WebDriver driver) {
            //refresh the page
            driver.navigate().refresh();

            System.out.println("Refreshed");
            //look for element for 5 seconds
            WebElement sameElement = null;
            try{
                sameElement = (new WebDriverWait(driver, 5))
                      .until(new ExpectedCondition<WebElement>(){
                    @Override
                    public WebElement apply(WebDriver driver) {
                        System.out.println("Looking for the element");
                        return driver.findElement(By.id("theElementYouAreLookingFor"));
                    }});    
            } catch (TimeoutException e){
                // if NULL is returns the cycle starts again
                return sameElement;
            } 
            return sameElement;
    }});        
    System.out.println("Done");

It will try to get the element for 30 seconds, refreshing the page every 5 seconds.

Upvotes: 1

djangofan
djangofan

Reputation: 29669

I would add more lines to that code: basically, if state.isEmpty() then use a Webdriver "Action" class to move the mouse to the refresh button (you app would need a refresh button inside of it for this to work) then run the wait one more time to verify it appears.

Upvotes: 0

Related Questions