selenium - OperaDriver 等待 Opera 启动器超时

标签 selenium opera selenium-webdriver operadriver

我正在尝试将 OperaDriver for Java(0.11 版)集成到我的测试套件中。这是代码片段:

  DesiredCapabilities operaCapabilities = DesiredCapabilities.opera();
  operaCapabilities.setCapability("opera.host", "127.0.0.1");
  operaCapabilities.setCapability("opera.port", 7001);
  operaCapabilities.setCapability("opera.profile", "");

  webDriver = new OperaDriver(operaCapabilities);

上面的代码片段无法返回带有 SocketTimeoutException Timeout waiting for launcher to connect on port 29392 的 webdriver 引用.我可以看到浏览器(opera 版本 11.62)在加载快速拨号选项卡的情况下启动,并且启动器也在执行,但不知何故 OperaDriver 似乎无法连接。

我看到的异常(exception)是:
com.opera.core.systems.runner.OperaRunnerException: Timeout waiting for launcher to connect on port 29392
at com.opera.core.systems.runner.launcher.OperaLauncherRunner.<init>(OperaLauncherRunner.java:159)
at com.opera.core.systems.OperaDriver.<init>(OperaDriver.java:322)
at com.opera.core.systems.OperaDriver.<init>(OperaDriver.java:224)
at com.test.TestMain.main(TestMain.java:31)

Caused by: java.net.SocketTimeoutException: Accept timed out
    at java.net.PlainSocketImpl.socketAccept(Native Method)
    at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:408)
    at java.net.ServerSocket.implAccept(ServerSocket.java:462)
    at java.net.ServerSocket.accept(ServerSocket.java:430)
    at com.opera.core.systems.runner.launcher.OperaLauncherRunner.<init>

(OperaLauncherRunner.java:140)
        ... 3 more

我已经为“opera.port”和 7001 尝试过 -1,但功能设置似乎被忽略了,因为它每次都尝试连接一个随机端口。我也暂时关闭了防火墙。

最佳答案

一、let's isolate the exception being hit here :

private final int launcherPort = PortProber.findFreePort();

...

public OperaLauncherRunner(OperaSettings s) {
    super(s);

    // Locate the bundled launcher from OperaLaunchers project and copy it to its default location
    // on users system if it's not there or outdated
    bundledLauncher =
        OperaLaunchers.class.getClassLoader().getResource("launchers/" + launcherNameForOS());

    if (bundledLauncher == null) {
      throw new OperaRunnerException("Not able to locate bundled launcher: " + bundledLauncher);
    }

    if (settings.getLauncher() == launcherDefaultLocation() &&
        (!settings.getLauncher().exists() || isLauncherOutdated(settings.getLauncher()))) {
      extractLauncher(bundledLauncher, settings.getLauncher());
    }

    makeLauncherExecutable(settings.getLauncher());

    // Find an available Opera if present
    if (settings.getBinary() == null) {
      settings.setBinary(new File(OperaPaths.operaPath()));
    }

    // Create list of arguments for launcher binary
    ImmutableList<String> arguments = buildArguments();
    logger.config("launcher arguments: " + arguments);

    try {
      launcherRunner = new OperaLauncherBinary(settings.getLauncher().getPath(),
                                               arguments.toArray(new String[]{}));
    } catch (IOException e) {
      throw new OperaRunnerException("Unable to start launcher: " + e.getMessage());
    }

    logger.fine("Waiting for launcher connection on port " + launcherPort);

    try {
      // Setup listener server
      ServerSocket listenerServer = new ServerSocket(launcherPort);
      listenerServer.setSoTimeout((int) OperaIntervals.LAUNCHER_TIMEOUT.getValue());

      // Try to connect
      launcherProtocol = new OperaLauncherProtocol(listenerServer.accept());

      // We did it!
      logger.fine("Connected with launcher on port " + launcherPort);
      listenerServer.close();

      // Do the handshake!
      LauncherHandshakeRequest.Builder request = LauncherHandshakeRequest.newBuilder();
      ResponseEncapsulation res = launcherProtocol.sendRequest(
          MessageType.MSG_HELLO, request.build().toByteArray());

      // Are we happy?
      if (res.isSuccess()) {
        logger.finer("Got launcher handshake: " + res.getResponse().toString());
      } else {
        throw new OperaRunnerException(
            "Did not get launcher handshake: " + res.getResponse().toString());
      }
    } catch (SocketTimeoutException e) {
      throw new OperaRunnerException("Timeout waiting for launcher to connect on port " +
                                     launcherPort, e);
    } catch (IOException e) {
      throw new OperaRunnerException("Unable to listen to launcher port " + launcherPort, e);
    }
  }

我们从这段代码中学到了一些东西:
  • private final int launcherPort = PortProber.findFreePort() ;设置我们的launcherPort ,并且此变量唯一用于建立连接。

    确实,您对 opera.port 的配置在此 block 中完全忽略。这似乎不太理想,它可能确实是一个错误或意外的回归。
  • 一旦我们建立了本地端口,就会立即进行连接尝试:
    // Setup listener serverServerSocket listenerServer = new ServerSocket(launcherPort);listenerServer.setSoTimeout((int) OperaIntervals.LAUNCHER_TIMEOUT.getValue());// Try to connectlauncherProtocol = new OperaLauncherProtocol(listenerServer.accept());

  • 所以,我们有一个与本地服务器紧密耦合的绑定(bind)。该端口被忽略,取而代之的是您系统上的空闲端口,但同时,它应该始终能够使用该端口。

    如果您的防火墙确实没有阻止连接(正如您所讨论的),假设您希望 Opera 以编程方式连接,而不是手动打开连接。

    根据some documentation , opera.host带有以下警告:

    opera.host (String) The host Opera should connect to. Unless you're starting Opera manually you won't need this.



    (另外强调我的。)

    不用说,警告与我有关。同样,尽管它明显不适用:

    opera.port (Integer) The port to Opera should connect to. 0 = Random, -1 = Opera default (for use with Opera > 12).



    (另外强调我的。)

    简而言之:尝试运行您的应用程序 as illustrated here :
    DesiredCapabilities capabilities = new DesiredCapabilities.opera();
    capabilities.setCapability("opera.binary", "/path/to/your/opera");
    capabilities.setCapability("opera.log.level", "CONFIG");
    WebDriver driver = new OperaDriver(capabilities);
    

    如果这不起作用,则说明您的项目或当前的 Opera 二进制文件有其他问题,无论是版本相关还是其他问题。

    关于selenium - OperaDriver 等待 Opera 启动器超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10012430/

    相关文章:

    java - 使用 GeckoDriver 运行 Java Selenium WebDriver 时 Firefox 无法连接

    java - 使用最新的 chromedriver 2.28 出现错误 - 断开连接 : received Inspector. 分离事件

    Java Selenium Chromedriver.exe 不存在 IllegalStateException

    javascript - 什么是仅单击链接(如果存在)的 javascript?

    javascript - 如何检测非功能性指针事件?

    python - 如何在Python中使用Selenium执行右键单击?

    python - 我怎样才能从浏览器中删除通知和警报? Selenium python 2.7.7

    java - Selenium ,Java,waitForCondition

    css - 歌剧:位置:固定和背景图像

    c# - 解码 Opera 缓存内容