まず、ここでヒットしている例外を分離しましょう:
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
このブロックではの構成は完全に無視されます。これは望ましいことではないように思われ、実際にはバグまたは予期しないリグレッションである可能性があります。
ローカルポートを確立すると、すぐに接続が試行されます。
// 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バイナリのいずれかで、バージョンに関連するかどうかに関係なく、他の問題が発生しています。