7
WebDriverWait wait = new WebDriverWait(driver, 60)

WebElement element = driver.findElement(By.xpath("//div[contains(text(),'Loading...')]"));
System.out.println("Test");
wait.until(ExpectedConditions.not(ExpectedConditions.presenceOfElementLocated(By.xpath("//div[contains(text(),'Loading...')]"))));
System.out.println("Test");

试图等待页面加载完成。第一个“测试”打印在控制台中,在执行 wait.until 语句时打印下面的异常。即使加载屏幕消失后,wait.until 仍在等待。已经尝试过元素的陈旧性也不起作用,得到相同的超时异常。加载完成后,该元素在 DOM 中不再可用

4

5 回答 5

11

当您想等待元素不存在时,而不是presenceOfElementLocated使用presenceOfAllElementsLocatedBy

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

它将一直等到页面上没有适合定位器的元素。

于 2015-06-05T10:05:41.840 回答
4

您不是在等待元素在第一个语句中可见,即

WebElement element = driver.findElement(By.xpath("//div[contains(text(),'Loading...')]"));

我认为这是导致NoSuchElementException...
您可以尝试以下操作:

new WebDriverWait(driver,60).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[contains(text(),'Loading...')]")));

new WebDriverWait(driver,60).until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("//div[contains(text(),'Loading...')]")));

上面的代码将首先等待元素的可见性,然后是它的不可见性。

于 2013-11-12T13:55:45.887 回答
0

你可以试试这个:

new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until(d => d.FindElement(By.Id("searchTextBox0")).Displayed)
于 2017-08-17T13:18:19.843 回答
0

如果您将多次使用它,请创建一个方法。例如,如果您将在其他地方等待其他元素。

public void waitForElementToBeVisible(String xpath) throws Throwable {
    try {
        WebDriverWait wait = new WebDriverWait(driver, 15);
        wait.until(ExpectedConditions.or(
                ExpectedConditions.visibilityOfElementLocated(By.xpath(xpath))
        ));
    }
    catch(Exception e) {
        System.out.println("Timeout exceeded");
        driver.close();
    }
}

然后,您可以多次调用此方法。打电话给你被困住的人会是

waitForElementToBeVisible("//div[contains(text(),'Loading...')]");
于 2017-08-17T14:36:12.753 回答
0

如果您只需要等待页面加载,您可以执行 Javascript 函数来检查页面加载是否完成:

String val = "";
do {
    val = (String)((JavascriptExecutor)driver).executeScript("return document.readyState");
    // DO WHATEVER
} while (!"complete".equals(val));

使用时,findElement()您必须在尝试定位元素之前使用隐式等待。否则,NoSuchElementException如果页面上没有加载组件,可能会抛出:

driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); // Blocks NoSuchElementExceptions for 5 seconds when findElement() is called (set for the duration of driver's life.
WebElement element = driver.findElement(By.xpath("//div[contains(text(),'Loading...')]"));

应该明智地使用该策略,因为它很可能会影响测试的性能。或者,您应该使用WebDriverWait(显式等待):

WebDriverWait wait = new WebDriverWait(driver, 60);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[contains(text(),'Loading...')]"))); // Presence of component checks the existence of the element in the DOM which it will always be true
System.out.println("Testing visibility passed...");
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("//div[contains(text(),'Loading...')]"))); // Presence of component checks the existence of the element in the DOM which it will always be true
System.out.println("Testing invisibility passed...");

请注意,在最后一个策略中,visibilityOfElementLocated返回 aWebElementvisibilityOfElementLocated返回 a Boolean。因此,您不能使用.andThen(Function).

于 2019-03-22T16:17:52.773 回答