Selenium OperaDriver在等待opera启动器时超时

Selenium OperaDriver在等待opera启动器时超时,selenium,opera,selenium-webdriver,operadriver,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); operaC

我正在尝试将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);
上面的代码段无法返回webdriver引用,其中SocketTimeoutException
超时等待启动器连接到端口29392
。我可以看到浏览器(opera版本11.62)是在加载了speed dial tab的情况下启动的,启动程序也在执行,但opera版本似乎无法连接

我看到的例外是:

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
com.opera.core.systems.runner.OperaRunnerException:等待启动器在端口29392上连接超时
在com.opera.core.systems.runner.launcher.operaluncherrunner上。(operaluncherrunner.java:159)
位于com.opera.core.systems.OperaDriver(OperaDriver.java:322)
在com.opera.core.systems.OperaDriver上(OperaDriver.java:224)
位于com.test.TestMain.main(TestMain.java:31)
原因:java.net.SocketTimeoutException:接受超时
位于java.net.PlainSocketImpl.socketAccept(本机方法)
在java.net.PlainSocketImpl.accept(PlainSocketImpl.java:408)
位于java.net.ServerSocket.implacpt(ServerSocket.java:462)
位于java.net.ServerSocket.accept(ServerSocket.java:430)
位于com.opera.core.systems.runner.launcher.operaluncherrunner。
(OperaLauncherRunner.java:140)
... 3个以上
我尝试了“opera.port”的-1,也尝试了7001,但是功能设置似乎被忽略了,因为它每次都试图连接一个随机端口。我也暂时关闭了防火墙。

首先:


如果这不起作用,那么您的项目或当前的Opera二进制文件(无论是版本相关的还是其他的)就会出现其他问题。

谢谢Gomez。我的发现和你的相符。我认为默认端口7001对连接并不重要,如果一切正常,任何随机端口都应该足够了。在opera尝试连接之前(在随机端口分配之后),我尝试在内存中将opera端口编辑回7001,并看到了相同的结果。我猜它一定是11.62或operalauncher.exe(我必须单独下载)@AshwinPrabhu Cool。如果你需要更多的帮助来追踪这个问题,一定要告诉我。如果您需要进一步的故障排除方面的帮助,我很乐意在晚上的PST(7-12点)进行堆栈溢出聊天。这应该符合你早晨的工作时间。祝你好运@戈麦斯。我记录了一个错误,放弃了Opera。继续做其他重要的事情。@AshwinPrabhu那就行了!祝您在余下的工作中好运。:)@戈麦斯,谢谢。由于Opera桌面的使用率在2-3%左右,这并不重要。我已经用11.52/Build 110尝试过了,结果也一样。
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);
    }
  }
DesiredCapabilities capabilities = new DesiredCapabilities.opera();
capabilities.setCapability("opera.binary", "/path/to/your/opera");
capabilities.setCapability("opera.log.level", "CONFIG");
WebDriver driver = new OperaDriver(capabilities);