Selenium: How to make the web driver to wait for page to refresh before executing another test

后端 未结 3 645
孤独总比滥情好
孤独总比滥情好 2020-12-13 00:50

I am writing Test Cases using Selenium web Driver in TestNG and I have a scenario where I am running multiple tests sequentially (refer below)

@Test(priority         


        
相关标签:
3条回答
  • 2020-12-13 01:04

    If you are waiting for element to present then

    In selenium rc we used to do this using selenium.WaitForCondition("selenium.isElementPresent(\"fContent\")", "desiredTimeoutInMilisec")

    In web driver U can achieve the same thing using this

    WebDriverWait myWait = new WebDriverWait(webDriver, 45);
    ExpectedCondition<Boolean> conditionToCheck = new ExpectedCondition<Boolean>()
    {
        @Override
        public Boolean apply(WebDriver input) {
            return (input.findElements(By.id("fContent")).size() > 0);
        }
    };
    myWait.until(conditionToCheck);
    

    This way you can wait for your element to be present before executing your test2.

    UPDATED :

    If you are waiting for page to load then in web driver you can use this code:

    public void waitForPageLoaded(WebDriver driver)
    {
        ExpectedCondition<Boolean> expectation = new
    ExpectedCondition<Boolean>() 
        {
            public Boolean apply(WebDriver driver)
            {
                return ((JavascriptExecutor)driver).executeScript("return document.readyState").equals("complete");
            }
        };
        Wait<WebDriver> wait = new WebDriverWait(driver,30);
        try
        {
            wait.until(expectation);
        }
        catch(Throwable error)
        {
            assertFalse("Timeout waiting for Page Load Request to complete.",true);
        }
    }
    
    0 讨论(0)
  • 2020-12-13 01:08

    If you could trigger a URL change this would work:

    WebDriverWait wait = new WebDriverWait(yourDriver, TimeSpan.FromSeconds(5));
    wait.Until(ExpectedConditions.UrlContains("/url-fragment"));
    
    0 讨论(0)
  • 2020-12-13 01:20

    Here is better and tested version of WaitForPageLoad implementation in C#.Net

    public void WaitForPageLoad(int maxWaitTimeInSeconds) {
        string state = string.Empty;
        try {
            WebDriverWait wait = new WebDriverWait(_driver, TimeSpan.FromSeconds(maxWaitTimeInSeconds));
    
            //Checks every 500 ms whether predicate returns true if returns exit otherwise keep trying till it returns ture
            wait.Until(d = > {
    
                try {
                    state = ((IJavaScriptExecutor) _driver).ExecuteScript(@"return document.readyState").ToString();
                } catch (InvalidOperationException) {
                    //Ignore
                } catch (NoSuchWindowException) {
                    //when popup is closed, switch to last windows
                    _driver.SwitchTo().Window(_driver.WindowHandles.Last());
                }
                //In IE7 there are chances we may get state as loaded instead of complete
                return (state.Equals("complete", StringComparison.InvariantCultureIgnoreCase) || state.Equals("loaded", StringComparison.InvariantCultureIgnoreCase));
    
            });
        } catch (TimeoutException) {
            //sometimes Page remains in Interactive mode and never becomes Complete, then we can still try to access the controls
            if (!state.Equals("interactive", StringComparison.InvariantCultureIgnoreCase))
                throw;
        } catch (NullReferenceException) {
            //sometimes Page remains in Interactive mode and never becomes Complete, then we can still try to access the controls
            if (!state.Equals("interactive", StringComparison.InvariantCultureIgnoreCase))
                throw;
        } catch (WebDriverException) {
            if (_driver.WindowHandles.Count == 1) {
                _driver.SwitchTo().Window(_driver.WindowHandles[0]);
            }
            state = ((IJavaScriptExecutor) _driver).ExecuteScript(@"return document.readyState").ToString();
            if (!(state.Equals("complete", StringComparison.InvariantCultureIgnoreCase) || state.Equals("loaded", StringComparison.InvariantCultureIgnoreCase)))
                throw;
        }
    }
    
    0 讨论(0)
提交回复
热议问题