4

OperaDriver for Java(ver。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でWebドライバー参照を返すことができませんTimeout waiting for launcher to connect on port 29392。スピードダイヤルタブをロードした状態でブラウザ(Opera ver。11.62)が起動し、ランチャーも動作しているのがわかりますが、どういうわけかOperaDriverが接続できないようです。

私が見る例外は次のとおりです。

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を試しましたが、毎回ランダムなポートに接続しようとしているため、機能設定は無視されているようです。ファイアウォールも一時的にオフにしています。

4

1 に答える 1

8

まず、ここでヒットしている例外を分離しましょう

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このブロックではの構成は完全に無視されます。これは望ましいことではないように思われ、実際にはバグまたは予期しないリグレッションである可能性があります。

  2. ローカルポートを確立すると、すぐに接続が試行されます。

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

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

したがって、ローカルサーバーへの緊密に結合されたバインディングがあります。ポートは無視され、システム上の空きポートが優先されますが、同時に、常にそのポートを使用できる必要があります。

ファイアウォールが実際に接続を妨げていない場合(これまでに説明したように)、手動で接続を開くのではなく、Operaをプログラムで接続したいとします。

いくつかのドキュメントによるとopera.host、次の警告があります。

opera.host (文字列) Operaが接続する必要のあるホスト。Operaを手動で起動しない限り、これは必要ありません。

(追加の強調鉱山。)

言うまでもなく、警告は私に関係しています。同様に、その明らかな適用不可能性にもかかわらず:

opera.port (整数) Operaへのポートは接続する必要があります。0 =ランダム、-1 = Operaのデフォルト(Opera> 12で使用)

(追加の強調鉱山。)

要するに:ここに示されているようにアプリケーションを実行してみてください:

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バイナリのいずれかで、バージョンに関連するかどうかに関係なく、他の問題が発生しています。

于 2012-04-10T22:37:20.810 に答える