Wait for page load in Selenium

后端 未结 30 2469
攒了一身酷
攒了一身酷 2020-11-22 07:12

How do you make Selenium 2.0 wait for the page to load?

相关标签:
30条回答
  • 2020-11-22 08:14

    Man all these answers require too much code. This should be a simple thing as its pretty common.

    Why not just inject some simple javascript with the webdriver and check. This is the method I use in my webscraper class. The javascript is pretty basic even if you don't know js.

        def js_get_page_state(self):        
        """
        Javascript for getting document.readyState
        :return: Pages state.
    
        More Info: https://developer.mozilla.org/en-US/docs/Web/API/Document/readyState
        """
        ready_state = self.driver.execute_script('return document.readyState')
        if ready_state == 'loading':
            self.logger.info("Loading Page...")
        elif ready_state == 'interactive':
            self.logger.info("Page is interactive")
        elif ready_state == 'complete':
            self.logger.info("The page is fully loaded!")
        return ready_state
    
    0 讨论(0)
  • 2020-11-22 08:15

    If someone uses selenide:

    public static final Long SHORT_WAIT = 5000L; // 5 seconds
    $("some_css_selector").waitUntil(Condition.appear, SHORT_WAIT);
    

    More Conditions can be found here: http://selenide.org/javadoc/3.0/com/codeborne/selenide/Condition.html

    0 讨论(0)
  • 2020-11-22 08:16

    NodeJS Solution:

    In Nodejs you can get it via promises...

    If you write this code, you can be sure that the page is fully loaded when you get to the then...

    driver.get('www.sidanmor.com').then(()=> {
        // here the page is fully loaded!!!
        // do your stuff...
    }).catch(console.log.bind(console));
    

    If you write this code, you will navigate, and selenium will wait 3 seconds...

    driver.get('www.sidanmor.com');
    driver.sleep(3000);
    // you can't be sure that the page is fully loaded!!!
    // do your stuff... hope it will be OK...
    

    From Selenium documentation:

    this.get( url ) → Thenable

    Schedules a command to navigate to the given URL.

    Returns a promise that will be resolved when the document has finished loading.

    Selenium Documentation (Nodejs)

    0 讨论(0)
  • 2020-11-22 08:18

    You can also use the class: ExpectedConditions to explicitly wait for an element to show up on the webpage before you can take any action further actions

    You can use the ExpectedConditions class to determine if an element is visible:

    WebElement element = (new WebDriverWait(getDriver(), 10)).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("input#houseName")));
    

    See ExpectedConditions class Javadoc for list of all conditions you are able to check.

    0 讨论(0)
  • 2020-11-22 08:18

    SeleniumWaiter:

    import com.google.common.base.Function;
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.support.ui.WebDriverWait;
    
    public class SeleniumWaiter {
    
          private WebDriver driver;
    
          public SeleniumWaiter(WebDriver driver) {
               this.driver = driver;
          }
    
          public WebElement waitForMe(By locatorname, int timeout){
               WebDriverWait wait = new WebDriverWait(driver, timeout);
               return wait.until(SeleniumWaiter.presenceOfElementLocated(locatorname));
          }
    
          public static Function<WebDriver, WebElement> presenceOfElementLocated(final By locator) {
                // TODO Auto-generated method stub
                return new Function<WebDriver, WebElement>() {
                     @Override
                     public WebElement apply(WebDriver driver) {
                          return driver.findElement(locator);
                     }
                };
          }
     }
    

    And to you use it:

    _waiter = new SeleniumWaiter(_driver);
    
    try {
       _waiter.waitForMe(By.xpath("//..."), 10);
    } 
    catch (Exception e) {
       // Error
    }
    
    0 讨论(0)
  • 2020-11-22 08:18

    My simple way:

    long timeOut = 5000;
        long end = System.currentTimeMillis() + timeOut;
    
            while (System.currentTimeMillis() < end) {
    
                if (String.valueOf(
                        ((JavascriptExecutor) driver)
                                .executeScript("return document.readyState"))
                        .equals("complete")) {
                    break;
                }
            }
    
    0 讨论(0)
提交回复
热议问题