首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OperaDriver在等待opera启动程序时超时

OperaDriver在等待opera启动程序时超时
EN

Stack Overflow用户
提问于 2012-04-04 21:47:13
回答 1查看 2.3K关注 0票数 4

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

代码语言:javascript
复制
  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似乎无法连接。

我看到的例外是:

代码语言:javascript
复制
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,但似乎忽略了容量设置,因为它每次都会尝试连接一个随机端口。我的防火墙也暂时关闭了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-11 06:37:21

首先,let's isolate the exception being hit here

代码语言:javascript
复制
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);
    }
  }

我们从这段代码中学到了一些东西:

  1. private final int launcherPort =PortProber.findFreePort();设置我们的launcherPort,这个变量唯一地用来建立连接。

实际上,在这个代码块中完全忽略了您的opera.port配置。这似乎不太可取,可能确实是一个错误或意外的regression.

  • Once。当我们建立本地端口时,会立即进行连接尝试:

// Setup listener server

ServerSocket listenerServer = new ServerSocket(launcherPort); listenerServer.setSoTimeout((int) OperaIntervals.LAUNCHER_TIMEOUT.getValue());

// Try to connect

launcherProtocol = new OperaLauncherProtocol(listenerServer.accept());

因此,我们有一个与本地服务器紧密耦合的绑定。为了支持系统上的空闲端口,该端口将被忽略,但同时,它应该始终能够使用该端口。

如果您的防火墙确实没有阻止连接(正如您已经讨论过的),让我们假设您希望通过编程连接Opera,而不是手动打开连接。

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

主机Opera应连接到的

opera.host (字符串)。除非你手动启动,否则你不需要这个。

(额外强调我的。)

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

要操作的端口应连接到的

opera.port (整数)。0=随机,-1 = Opera默认(用于Opera > 12)

(额外强调我的。)

简而言之:尝试运行您的应用程序as illustrated here

代码语言:javascript
复制
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二进制文件,不管是与版本相关的还是其他的。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10012430

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档