当前位置: 首页 > 面试题库 >

Selenium隐式等待是否总是占据整个等待时间,还是可以更快地完成?

公良浩邈
2023-03-14
问题内容

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

该页面暗示它要等待整整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);

此外,是否有人可以提供有关默认“轮询”发生频率的信息?


问题答案:

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

正如我在这里提到的,这些是非常特定于驱动程序实现的。所有与驱动程序相关的调用都通过execute方法进行。

我正在介绍该execute方法的要点(您可以在此处找到完整的源代码):

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,该类具有自己的处理方式。

因此,轮询取决于驱动程序的实现。

如果要指定轮询时间,则可能应该开始使用ExplicitWaits。



 类似资料:
  • 创建驱动程序时,我已将隐式等待设置为10秒。当我希望使用显式等待时,是否必须将隐式等待设置为0? 以下是一个示例: 我必须做webDriver.manage()。超时()。秒);还是没有必要?

  • 问题内容: 我有一个Python程序,该程序通过 PySerial 模块从串行端口读取数据。我需要牢记的两个条件是:我不知道会有多少数据到达,并且我也不知道何时需要数据。 基于此,我提出了以下代码段: 因此,此代码将永远循环以从串行端口获取数据。我们最多可以存储500个字符,然后通过设置一个标志来警告主循环。如果没有数据,我们将回到睡眠状态并等待。 该代码正在运行,但是我不喜欢5s超时。我需要它是

  • 我带着一个关于硒的问题来到这里。在我的测试中,我需要删除web应用程序中的一些项目,然后我想验证项目列表是否为空。我知道这看起来很琐碎,但我有一些小问题。这就是我要检查我的项目列表是否为空的方式: 简单和工作,但...慢,因为含蓄等待。 由于事实上当我删除项目,然后是0和Selenium总是等待10秒前findElements()返回0大小。 为了避免这10秒钟的等待,我有一个变通方法,在断言之前

  • 问题内容: 我写了一个永远不会停止的测试应用程序。它发出(是一个对象),但是我从不打电话通知。为什么此代码结束?尽管主线程在上同步,但生成的线程仍在运行,因此不会锁定该对象。 结果是主线程等待5秒钟,在此期间工作人员提供其输出。然后,在5秒钟后,程序退出。不等。如果主线程在5秒钟内没有进入睡眠状态(对此行进行了注释),则实际上将等到工作人员完成操作。当然,这里是一种使用方法,但是,出乎意料的是,它

  • 它是100%保证的线程,首先得到wait_for_completion_timeout会唤醒第一次调用完成?也许我错了,但是我看了下面的场景:线程A调用wait_for_completion_timeout并进入睡眠。当完成被调用时,它醒来并完成执行在函数do_wait_for_common。现在假设另一个线程B调用wait_for_completion_timeout. x- 然后继续睡觉。所以

  • 问题内容: 我正在编写一个自动化测试程序,该程序将测试某些Web程序,这些程序有时加载某些AJAX调用的速度很慢。例如,用户将单击“查询”,这将在15到90秒的任何时间产生HTML“加载”叠加。搜索完成后,它将使用结果更新同一页面上的表。 所以很明显我可以像这样单独增加等待时间: 但是有没有办法修改(在我的情况下增加)时间,因此Watir-Webdriver 总是 等待90秒,如下所示: 请注意以