等待页面在Selenium中完全加载

时间:2017-02-14 15:38:18

标签: java selenium

我正在使用selenium和Java。我想在页面上执行任何操作之前等待页面完全加载。

我尝试过以下方法,但无法按预期工作。

public void waitForElementToBeVisible(final WebElement element) {

    WebDriverWait wait = new WebDriverWait(WebDriverFactory.getWebDriver(), WEBDRIVER_PAUSE_TIME);

    wait.until(ExpectedConditions.visibilityOf(element));

6 个答案:

答案 0 :(得分:2)

WebDriverWait继承了等待until

等方法

类似

webDriverWait.until(ExpectedConditions.visibilityOfElementLocated( elementLocator)

应该有效。您可以使用ExpectedConditions,这会使事情变得更简单。您还可以使用方法visibilityOfAllElements

答案 1 :(得分:0)

此方法将一直等到元素可见。 首先,这个方法将检查元素是否在html中可用以及是否显示..它将等到元素显示..

public void E_WaitUntilElementDisplay() throws Exception
{
    int i=1;
    boolean eleche,eleche1 = false; 
    while(i<=1)
    {
            try{
                eleche = driver.findElements(by.xpath("path")).size()!=0;
            }catch(InvalidSelectorException ISExcep)
            {
                eleche = false;
            }
            if(eleche == true)
            {

                while(i<=1)
                {
                    try{
                        eleche1=driver.findElement(By.xpath("Path")).isDisplayed();
                    }catch(org.openqa.selenium.NoSuchElementException NSEE){
                        eleche1=false;
                    }
                    if(eleche1 == true)
                    {
                        i=2;
                        System.out.println("\nElement Displayed.");
                    }
                    else
                    {
                        i=1;
                        Thread.sleep(1500);
                        System.out.println("\nWaiting for element, to display.");
                    }
                }
            }
            else
            {
                i=1;
                Thread.sleep(1500);
                System.out.println("\nWaiting for element, to display.");
            }
    }
}

答案 2 :(得分:0)


作为另一种选择,您可以尝试以下方式:

if(element.isDisplayed() && element.isEnabled()){
   //your code here 
}

或者如果你知道你想等多久:

thread.sleep(3000); //where 3000 is time expression in milliseconds, in this case 3 secs

答案 3 :(得分:0)

您可以在Java中使用此功能来验证页面是否已完全加载。验证有两个方面。一种使用javascript document.readystate并在javascript上施加等待时间。

/* Function to wait for the page to load. otherwise it will fail the test*/
public void waitForPageToLoad() {
    ExpectedCondition<Boolean> javascriptDone = new ExpectedCondition<Boolean>() {
        public Boolean apply(WebDriver d) {
            try {
                return ((JavascriptExecutor) getDriver()).executeScript("return document.readyState").equals("complete");
            } catch (Exception e) {
                return Boolean.FALSE;
            }
        }
    };
    WebDriverWait wait = new WebDriverWait(getDriver(), waitTimeOut);
    wait.until(javascriptDone);
}

答案 4 :(得分:0)

这对我有用:

wait.until(ExpectedConditions.not(
ExpectedConditions.presenceOfElementLocated(
By.xpath("//div[contains(text(),'Loading...')]"))));

答案 5 :(得分:0)

这是专门针对 Angular 7 或 8 的终极解决方案。

您可以将等待时间划分为分区并递归使用,而不是使用睡眠或隐式等待方法等待更长的时间。

以下逻辑将等待页面呈现最少 300 秒和最多 900 秒。

/**
 * This method will check page loading
 *
 */
public void waitForLoadingToComplete() {
    waitLoadingTime(3); // Enter the number of attempts you want to try
}

 private void waitLoadingTime(int i) {
        try {
  // wait for the loader to appear after particular action/click/navigation
            this.staticWait(300); 
  // check for the loader and wait till loader gets disappear
            waitForElementToBeNotPresent(By.cssSelector("Loader Element CSS"));                                                             
        } catch (org.openqa.selenium.TimeoutException e) {
            if (i != 0)
                waitLoadingTime(i - 1);
        }
    }

/**
 * This method is for the static wait
 *
 * @param millis
 */
public void staticWait(final long millis) {
    try {
        TimeUnit.MILLISECONDS.sleep(millis);
    } catch (final InterruptedException e) {
        System.err.println("Error in staticWait." + e);
    }
}

public void waitForElementToBeNotPresent(final By element) {
    long s = System.currentTimeMillis();
    new WebDriverWait(this.getDriver(), 30)
            .until(ExpectedConditions.not(ExpectedConditions.presenceOfAllElementsLocatedBy(element)));
    System.err.println("Waiting for Element to be not present completed. " + (System.currentTimeMillis() - s));
}