【问题标题】:When To Use Implicit wait and where to Use何时使用隐式等待以及在何处使用
【发布时间】:2014-12-23 10:41:21
【问题描述】:

我对 Selenium Webdriver 提供的隐式等待方法有些困惑。

  1. 何时使用隐式等待

    a- 用于页面加载(使用 driver.get 时)或用于 Ajax 弹出式加载 比如说我在编辑框中输入了一些内容,并且正在发生一些查找或 Ajax 调用。

  2. 在哪里使用隐式等待

    我应该在 Ajax 调用或页面加载发生的所有方法之后使用,还是只使用一次就足够了(我只是从 Selenium RC 中获取我们可以使用 Selenium.SetSpeed 方法的参考)。

谢谢, 阿伦

【问题讨论】:

    标签: selenium selenium-webdriver


    【解决方案1】:
    1. 显式等待是您定义的代码,用于等待特定条件发生,然后再继续执行代码。最坏的情况是Thread.sleep(),它将条件设置为要等待的确切时间段。提供了一些方便的方法来帮助您编写只等待所需时间的代码。 WebDriverWait 结合ExpectedCondition 是可以实现的一种方式。示例如下:

      WebDriverWait wait = new WebDriverWait(driver, 10);
      WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("someid")));
      

    但是,根据不同的语言实现会有所不同。更多关于ExpectedCondition的信息请参见here

    1. 隐式等待是告诉 WebDriver 在尝试查找一个或多个元素(如果它们不是立即可用的)时轮询 DOM 一段时间。默认设置为 0。一旦设置,就会为 WebDriver 对象实例的生命周期设置隐式等待。下面是一个隐式等待的实现:

       driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
      

    这两个定义都来自seleniumhq 和最完美的定义。

    toolsQA 中有一个很好的解释如何以及何时使用它们。另外还有一个值得一看的隐式、显式和流利等待之间的比较。

    【讨论】:

    【解决方案2】:
    • 隐式等待显式等待与我们在程序中使用的驱动程序实例相关。首先关于显式 等待我们可以使用显式等待特定条件/Web元素 发生/单击,其生命周期取决于创建的等待对象。

    例子:

             WebDriverWait  explicit_wait_Example = new WebDriverWait(driver, 10);
             explicit_wait_Example.until(ExpectedConditions.elementToBeClickable(By_Locator)).click();
    

    上面是使用显式等待的示例,直到这是使用这种等待的最有效和最有效的方法之一。

    • 其次,当谈到隐式等待时,这种等待伴随着生命 驱动程序实例。只需声明一次,您就可以在调用驱动程序实例的任何地方使用它。
    • 关于你提到的问题,无论是在Ajax调用之后还是页面之后 加载,所以我建议检查您创建了多少个驱动程序类实例。因为一旦您声明隐式等待一个驱动程序实例,您就不必为该特定驱动程序实例再次声明。
    • 当您确定时间时,程序中会使用隐式等待 由网页上的所有网页元素加载/可见并用于 某些 Web 元素,您认为时间是其中的一个变化因素 它正在加载,然后您可以使用显式等待。

    【讨论】:

      【解决方案3】:

      对于 ajax 调用,我更喜欢显式等待。但是如果你能弄清楚你的 ajax 调用的最小时间戳是多少,你可以在隐式等待中提供。

      对驱动程序永久强制执行隐式等待。所以你不需要一次又一次地声明。它会影响驱动程序等待特定时间,直到它抛出NoSuchElementException。但是,如果您更多地使用 xpath,那么最好在隐式等待中提供更大的超时时间。

      要添加的另一件事,implicitlyWait 仅影响 findElement 和 findElements 函数。其他功能不受影响。

      【讨论】:

        猜你喜欢
        • 2012-05-11
        • 2018-01-22
        • 2016-01-02
        • 2012-06-17
        • 2018-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多