Selenium Webdriver“Expectedconditions.not”未按预期工作

时间:2013-11-12 13:38:53

标签: java selenium webdriver selenium-webdriver wait

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仍在等待。 已经尝试过该元素的Staleness并且不起作用,获得相同的超时异常。 加载完成后,元素在DOM中不再可用

5 个答案:

答案 0 :(得分:8)

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

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

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

答案 1 :(得分: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...')]")));

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

答案 2 :(得分:0)

new WebDriverWait(driver,TimeSpan.FromSeconds(10))。until(d => d.FindElement(By.Id(" searchTextBox0"))。显示)

答案 3 :(得分:0)

如果您要多次使用此功能,请创建一个方法。例如。如果你在其他地方等待其他元素。

waitForElementToBeVisible("//div[contains(text(),'Loading...')]");

然后您可以多次调用此方法。打电话给那个你坚持的人就是

SIGINT

答案 4 :(得分: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返回一个WebElement,而visibilityOfElementLocated返回一个Boolean。因此,不能使用.andThen(Function)链接条件。