显式等待示例
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement myDynamicElement= wait.until(ExpectedConditions.elementToBeClickable(By.id("someid")));
隐含等待示例
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"));
假设myDynamicElement在第6秒可见, 所以在这两种情况下,驱动程序将等到第6秒并且控制将转移到连续的书面语句,我想了解在这种情况下隐式和显式等待是如何彼此不同的?他们如何在内部工作?
答案 0 :(得分:1)
Implicit Wait
是配置 WebDriver
实例以轮询 HTML DOM
的方式( DOM Tree
)在尝试查找元素或查找元素的组/集合(如果它们不是立即可用)时的已配置时间量。根据当前的 W3C
规范,默认时间配置为 0
。我们可以在脚本/程序中的任何位置配置 Implicit Wait
的时间,并根据我们的需要重新配置它。设置 Implicit Wait
后,它将在 WebDriver
实例的生命周期内生效。
您可以找到更多detailed discussion here
和documentation here。
Explicit Wait
是您为 WebDriver
实例定义,配置和实施的代码块,以等待某个条件得到满足之前继续下一行代码。 WebDriverWait以及 ExpectedCondition
的某些方法/子句是实现 Explicit Wait
的一种方式。
您可以找到更多detailed discussion here
和documentation here。
根据您的查询Let say myDynamicElement is visible at 6th second, So in both the cases driver will wait till 6th seconds and control will move to the consecutive written statement
。
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
Implicit Wait
会针对整个 HTML DOM
( DOM Tree
)进行投票10秒,无论 myDynamicElement
(或与您的定位器匹配的多个元素)是否在第4/6/8秒可见。因此,在这种情况下,您的脚本会延迟4秒。
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement myDynamicElement= wait.until(ExpectedConditions.elementToBeClickable(By.id("someid")));
Explicit Wait
会等待 {最长10秒,因为元素 someid
可以点击(显示和启用)。只要符合 WebElement
,就会返回 ExpectedConditions
。如果在配置的时间线的整个过程中未满足 ExpectedConditions
,您会看到正确的 Exception
。
答案 1 :(得分:0)
隐式等待用于在整个测试脚本或程序的每个连续测试步骤之间提供等待时间(例如30秒)。下一步仅在执行上一步
后30秒(或任何时间已过)时执行语法:
WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
显式等待用于暂停执行,直到满足特定条件或已定义的最大时间为止。在整个测试脚本或程序的每个连续测试步骤之间应用了隐式等待,而显式等待仅适用于特定实例。
语法:
WebDriver driver = new FirefoxDriver();
WebDriverWait wait = new WebDriverWait(driver,30);
wait.until(ExpectedConditions.elementToBeClickable("Locator"));