如果您刚开始使用硒,这是一个合法的问题。我总是建议看一下官方文档。
隐式等待是告诉 WebDriver 在尝试查找一个或多个元素(如果它们不是立即可用)时轮询 DOM 一段时间。默认设置为 0。一旦设置,就会为 WebDriver 对象实例的生命周期设置隐式等待。
例子:
WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://somedomain/url_that_delays_loading");
WebElement myDynamicElement = driver.findElement(By.id("myDynamicElement"));
在这种情况下,如果当您尝试定位ID 为myDynamicElement的 Web 元素时,DOM 中不存在它,则表示要重试直到 10 秒。轮询时间取决于您使用的 webdriver。你必须知道的是它会在 10 秒内尝试查找元素。当然,如果元素位于这个时间结束之前,代码会继续。否则,抛出异常。
显式等待是您定义的代码,用于在继续执行代码之前等待某个条件发生。最坏的情况是 Thread.sleep(),它将条件设置为要等待的确切时间段。提供了一些方便的方法来帮助您编写只等待所需时间的代码。WebDriverWait 与 ExpectedCondition 结合使用是实现此目的的一种方式。
例子:
WebDriver driver = new FirefoxDriver();
driver.get("http://somedomain/url_that_delays_loading");
WebElement myDynamicElement = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(By.id("myDynamicElement")));
这会在抛出 TimeoutException 之前等待最多 10 秒,或者如果它发现元素将在 0 - 10 秒内返回它。默认情况下,WebDriverWait 每 500 毫秒调用一次 ExpectedCondition,直到它成功返回。ExpectedCondition 函数类型的成功返回值是布尔值 true 或非空对象。
而且,最后,写着:这个例子在功能上也等同于第一个隐式等待例子。
因此,如果您使用presentOfElementLocated作为预期条件(对于您尝试定位的每个元素),则与使用隐式等待完全相同。但条件不只是这个。从ExpectedConditions可以看出,您可以指定其他条件(例如:elementToBeClickable、stalenessOf 等)。
所以,回到你的问题:
和
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
你说要等待,每当你尝试定位一个元素时,存在(记住,它就像 presentOfElementLocated)直到 30 秒。
和
driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
您将需要加载网页的时间设置为 30 秒。
和:
WebDriverWait wait = new WebDriverWait(driver, 30);
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(id)));
boolean status = element.isDisplayed();
您是说要等待 id:"id" 的 web 元素的visibilityOfElementLocated,直到 30 秒。
最后:
为什么要给后面的wait分配一个WebElement,WebElement元素接收到什么?这是正确的实施吗?
WebElement 元素接收什么?如果不是 id:"id" 的 webelement,还有什么?当然,如果它是可见的。否则会抛出异常。