【问题标题】:"Implicit wait" waiting for element to clickable, displayed or visible“隐式等待”等待元素可点击、显示或可见
【发布时间】:2015-09-17 13:21:49
【问题描述】:

Selenium WebDriverimplicitexplicitwait的区别有问题。

What is difference between Implicit wait Vs. Explicit wait in selenium webdriver?

When to use explicit wait vs implicit wait in Selenium Webdriver?

同样在 SeleniumHq 上:

隐式等待

隐式等待是告诉 WebDriver 在尝试查找一个或多个元素时轮询 DOM 一段时间,如果 它们不是立即可用的。默认设置为 0。一次 set,为 WebDriver 对象的生命周期设置隐式等待 实例。

但不清楚这是什么等待,我的意思是会等到isDispalyedisVisibleisClickable

【问题讨论】:

    标签: java selenium-webdriver


    【解决方案1】:

    我相信隐式等待不关心任何这些属性(isDisplayed、isVisible 或 isClickable)。它只是等待您设置的时间,并定期检查您尝试选择的元素是否在您的 DOM 中可用。如果没有找到它会启动一个超时错误。

    【讨论】:

    • 可用是什么意思?你可以看到它,点击它或悬停??
    • 可用是指您可以在 DOM 中找到该元素。我指的是代码。在屏幕上不可见的事实并不意味着该元素不存在于您的 DOM 中。
    • 你的意思是使用.findElement(By.___)。我认为你应该引用一个例子来证明你的答案。只是说不会帮助这里的任何人。
    • 我的意思是,例如,如果您搜索一个按钮,则定义该按钮的 HTML 代码必须存在于您的 DOM 中。然后你就可以使用findElement找到它。
    • 网站的注销选项,只有当您将鼠标悬停在个人资料图像上时才能单击该选项。现在此注销始终存在于 DOM 中,但在悬停之前它被隐藏并且在悬停之后它是可点击的,即findElement 在悬停之前失败。所以我认为只说“可用”是没有帮助的。
    【解决方案2】:

    我相信 narko 是对的,这里有一些我认为可以证明的代码。

    By hiddenLocator = By.id("csi");
    FirefoxDriver driver = new FirefoxDriver();
    driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
    driver.get("http://www.google.com");
    WebElement hiddenEle = driver.findElement(hiddenLocator);
    WebDriverWait wait = new WebDriverWait(driver, 30);
    wait.until(ExpectedConditions.presenceOfElementLocated(hiddenLocator));
    System.out.println("done");
    

    我去 google.com 发现了一个隐藏的元素

    <textarea name="csi" id="csi" style="display:none"></textarea>
    

    我将隐式等待设置为 30 秒,设置 WebDriverWait 为 30 秒,然后等待元素出现。来自the presenceOfElementLocated() source

    检查元素是否存在于页面的 DOM 上的期望。这并不一定意味着该元素是可见的。

    如果隐式等待是在等待除了 DOM 中元素的存在以外的任何内容,它会等待 30 秒...但在浏览器中加载页面后它就完成了。

    我进行了一些研究,以更好地了解这些不同功能的作用以及它们之间的真正不同之处。这是我发现的...

    WebElement 有三个方法与这个问题相关:isDisplayed()、isEnabled() 和 isSelected()。来自文档...

    isDisplayed() 这个元素是否显示?这种方法避免了 必须解析元素的“样式”属性的问题。

    isEnabled() 元素当前是否启用?这将 通常对除禁用输入元素之外的所有内容返回 true。

    isSelected() 判断该元素是否被选中。

    ExpectedConditions 也通过几种方法在这里发挥作用。我将简单地看一下elementToBeClickable()。来自文档...

    elementToBeClickable 检查元素的期望是可见的 并启用,以便您可以单击它。

    如果你看the source,描述是准确的。如果您想了解更多信息,可以查看其他方法的来源等,但我认为这足以回答您的问题。

    【讨论】:

      猜你喜欢
      • 2022-11-28
      • 2020-03-29
      • 2015-10-11
      • 1970-01-01
      • 2016-12-29
      • 2020-02-23
      • 2019-10-17
      • 2020-05-20
      • 1970-01-01
      相关资源
      最近更新 更多