我目前有以下设置,但我不确定我的等待(隐式和 pageLoadTimeout)是否正常工作。 这是正确的实现吗?通过将它放在@Before("@setup") 中,它是否适用于每个场景或步骤定义运行?每次我调用@Given、@When..等时,司机会相应地等待吗?
@Before("@setup")
public void setUp() {
driver.manage().deleteAllCookies();
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
}
为什么要给下面的wait分配一个WebElement, WebElement 元素接收什么?这是正确的实现吗? -
WebDriverWait wait = new WebDriverWait(driver, 30);
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(id)));
boolean status = element.isDisplayed();
最佳答案
隐式等待()
implicitlyWait()
是告诉 WebDriver 实例,即 driver 在尝试查找一个或多个元素(如果它们不是立即可用的)时轮询 HTML DOM 一段时间.默认等待配置设置为 0。设置后,隐式等待 将设置为 WebDriver 对象实例的生命周期。
您的代码试用非常完美,如下所示:
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
这里你会在Using implicit wait in selenium中找到详细的讨论
pageLoadTimeout()
pageLoadTimeout()
设置在抛出错误之前等待页面加载完成的时间跨度。
您的代码试用非常完美,如下所示:
driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
在这里你可以找到pageLoadTimeout in Selenium not working中的详细讨论
Note : Try to avoid configuring
pageLoadTimeout()
until and unless the Test Specification explicitly mentions about the same.
为什么要 WebDriverWait?
现代浏览器使用 JavaScript 、 AJAX 和 React Native ,其中网页中的元素是动态加载的。因此,在继续执行下一行代码 Explicit Waits 之前等待特定条件得到满足,即 WebDriverWait 是继续前进的方式。
Note : As per the official documentation of Explicit and Implicit Waits Do not mix implicit and explicit waits. Doing so can cause unpredictable wait times.
您的代码试验非常适合等待元素的可见性,如下所示:
WebDriverWait wait = new WebDriverWait(driver, 30);
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(id)));
这里可以找到Replace implicit wait with explicit wait (selenium webdriver & java)的详细讨论
您的具体问题
为什么需要将 WebElement 分配给以下等待:WebDriverWait 与 ExpectedConditions 结合不仅返回 WebElement,而且还取决于 ExpectedConditions 也可以返回void、Boolean、List。
WebElement 元素接收什么?:根据您使用 ExpectedConditions 作为
visibilityOfElementLocated()
的代码块,WebElement 将一旦元素在网页的 DOM Tree 上存在并且可见,就会返回。 可见性是指元素不仅显示而且高度和宽度都大于0。这是正确的实现吗?:您的实现近乎完美,但最后一行代码,即
boolean status = element.isDisplayed();
是多余的因为visibilityOfElementLocated()
在元素可见(即元素不仅显示而且还具有高度和宽度大于0)。
关于java - 如何通过 Selenium 正确配置隐式/显式等待和 pageLoadTimeout?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50518467/