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

sni*_*ikt 2 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);


    }
Run Code Online (Sandbox Code Playgroud)

为什么需要给下面的wait分配一个WebElement,WebElement元素接收什么?这是正确的实现吗?——

 WebDriverWait wait = new WebDriverWait(driver, 30);
 WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(id)));
boolean status = element.isDisplayed();
Run Code Online (Sandbox Code Playgroud)

Deb*_*anB 5

隐式等待()

implicitlyWait()是告诉WebDriver实例,即驱动程序在尝试查找一个或多个元素(如果它们不能立即可用)时轮询HTML DOM一段时间。默认等待配置设置为0。一旦设置,隐式等待就设置为WebDriver对象实例的生命周期。

您的代码试用非常完美,如下所示:

driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
Run Code Online (Sandbox Code Playgroud)

在这里您将找到在 Selenium使用隐式等待中的详细讨论


页面加载超时()

pageLoadTimeout() 设置时间跨度以在引发错误之前等待页面加载完成。

您的代码试用非常完美,如下所示:

driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
Run Code Online (Sandbox Code Playgroud)

在这里,您可以在 Selenium中的pageLoadTimeout 中找到详细讨论不起作用

注意:尽量避免配置pageLoadTimeout(),除非测试规范明确提到相同的内容。


为什么是 WebDriverWait?

现代浏览器使用JavaScriptAJAXReact Native,其中网页中的元素是动态加载的。因此,在继续执行下一行代码之前等待特定条件得到满足,显式等待WebDriverWait是继续进行的方式。

注意:根据显式和隐式等待的官方文档,不要混合隐式和显式等待。这样做可能会导致不可预测的等待时间。

您的代码试验非常适合等待元素的可见性,如下所示:

WebDriverWait wait = new WebDriverWait(driver, 30);
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id(id)));
Run Code Online (Sandbox Code Playgroud)

在这里你可以找到用显式等待替换隐式等待(selenium webdriver & java)的详细讨论


您的具体问题

  • 为什么需要将 WebElement 分配给以下等待WebDriverWaitExpectedConditions结合不仅返回WebElement,而且根据ExpectedConditions也可以返回voidBooleanList

  • WebElement 元素接收什么?:根据您使用ExpectedConditions as 的代码块,一旦该元素出现在网页的DOM 树上并且可见visibilityOfElementLocated(),就会返回WebElement可见性意味着元素不仅被显示而且具有大于0的高度和宽度。

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

  • 好详细的回答。 (2认同)