Selenium隐含等待总是占用整个等待时间还是可以更快完成?

时间:2015-01-08 01:52:11

标签: selenium selenium-webdriver

Selenium隐式等待总是占用整个等待时间还是能早点完成?如果我将隐式等待设置为10秒,是否可以在几秒钟内完成对.findElement的调用,或者总是需要整整10秒?

This page意味着它会等待整整10秒,这非常令人困惑,因为它不是javadoc所暗示的。

来自WebDriver.java的以下代码注释意味着它的轮询操作可以比隐式超时更快地完成。但是,评论中的最后一句话确实引起了这种信念的冲击并且让我对此并不十分肯定。如果它实际上是轮询,那么它将如何“对测试时间产生不利影响”,因为它不会进入整个隐式等待持续时间?

/**
 *  from WebDriver.java
 * Specifies the amount of time the driver should wait when searching for an element if
 * it is not immediately present.
 * <p/>
 * When searching for a single element, the driver should poll the page until the 
 * element has been found, or this timeout expires before throwing a 
 * {@link NoSuchElementException}. When searching for multiple elements, the driver 
 * should poll the page until at least one element has been found or this timeout has
 * expired.
 * <p/>
 * Increasing the implicit wait timeout should be used judiciously as it will have an 
 * adverse effect on test run time, especially when used with slower location 
 * strategies like XPath.
 * 
 * @param time The amount of time to wait.
 * @param unit The unit of measure for {@code time}.
 * @return A self reference.
 */
Timeouts implicitlyWait(long time, TimeUnit unit);

另外,如果有人能提供有关默认“轮询”发生频率的信息吗?

3 个答案:

答案 0 :(得分:4)

一旦能够找到元素就可以完成。如果不是,它会抛出错误并停止。轮询时间再次非常特定于驱动程序实现(不是Java绑定,而是驱动程序部分,例如:FireFox扩展,Safari扩展等)。

正如我所提到的here,这些非常特定于驱动程序实现。所有与驾驶员相关的呼叫均通过execute方法进行。

我对execute方法提出了要点(你可以找到完整的来源here):

protected Response execute(String driverCommand, Map<String, ?> parameters) {
    Command command = new Command(sessionId, driverCommand, parameters);
    Response response;

    long start = System.currentTimeMillis();
    String currentName = Thread.currentThread().getName();
    Thread.currentThread().setName(
        String.format("Forwarding %s on session %s to remote", driverCommand, sessionId));
    try {
      log(sessionId, command.getName(), command, When.BEFORE);
      response = executor.execute(command);
      log(sessionId, command.getName(), command, When.AFTER);

      if (response == null) {
        return null;
      }
      //other codes 
}

该行:

response = executor.execute(command);

讲述了整个故事。 executor的类型为CommandExecutor,因此所有调用都会转到特定的驱动程序类,如ChromeCommandExecutor,SafariDriverCommandExecutor,它们有自己的处理方式。

因此轮询是由驱动程序实现的。

如果要指定轮询时间,则应该开始使用Explicit Waits

答案 1 :(得分:0)

如上所述代码评论:

 * When searching for a single element, the driver should poll the page until the 
 * element has been found, or this timeout expires before throwing a 
 * {@link NoSuchElementException}.

它会等到该元素出现,或者超时发生。

例如,如果将Implicit wait设置为10秒,则.findElement将为该元素等待最多10秒。假设DOM中的元素在5秒内可用,那么它将退出“等待”并开始执行下一步。

希望这澄清。

答案 2 :(得分:0)

据我所知,隐式等待的轮询周期不是0.5秒。明确的等待就是这种情况。显式等待每500毫秒轮询一次DOM。隐式等待,如果在页面加载时未找到该元素,则等待指定的时间,然后在时间用完后再次检查。如果没有找到则会抛出错误