java - 如何通过 Selenium 正确配置隐式/显式等待和 pageLoadTimeout?

标签 java selenium page-load-time webdriverwait implicitwait

我目前有以下设置,但我不确定我的等待(隐式和 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?

现代浏览器使用 JavaScriptAJAXReact 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 分配给以下等待:WebDriverWaitExpectedConditions 结合不仅返回 WebElement,而且还取决于 ExpectedConditions 也可以返回voidBooleanList

  • WebElement 元素接收什么?:根据您使用 ExpectedConditions 作为 visibilityOfElementLocated() 的代码块,WebElement 将一旦元素在网页的 DOM Tree存在并且可见,就会返回。 可见性是指元素不仅显示而且高度和宽度都大于0

  • 这是正确的实现吗?:您的实现近乎完美,但最后一行代码,即 boolean status = element.isDisplayed(); 是多余的因为 visibilityOfElementLocated() 在元素可见(即元素不仅显示而且还具有高度和宽度大于0)。

关于java - 如何通过 Selenium 正确配置隐式/显式等待和 pageLoadTimeout?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50518467/

相关文章:

java - 尝试删除后临时文件保留在 linux 中

java - 在java或scala中将bson嵌套到平面bson

java - 在 weblogic 上登录 web 服务

java - Cucumber spring WebDriver 在 @After 方法中退出的设计问题

java - Selenium 未按照配置下载文件

PHP - 从 MySQL 数据库循环结果时页面加载缓慢

java - 如何使用hibernate查询语言查找两个时间戳之间的差异

rest - Behat selenium 测试信任自签名 SSL 证书

javascript - 如果将所有网页资源都编译成一个 HTML 文件,加载速度会更快吗?

google-chrome - 驱动chrome来测量页面加载时间