Zuerst 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);
}
}
Wir lernen ein paar Dinge aus diesem Code:
private final int launcherPort =
PortProber.findFreePort()
;
unsere launcherPort
setzt, und diese Variable verwendet wird eindeutig die Verbindungs zu etablieren.
Tatsächlich wird Ihre Konfiguration von opera.port
in diesem Block vollständig ignoriert. Das scheint weniger als wünschenswert, und es könnte tatsächlich ein Bug oder eine unerwartete Regression sein.
Sobald wir den lokalen Port einzurichten, wird ein Verbindungsversuch sofort gemacht:
// Setup listener server
ServerSocket listenerServer = new ServerSocket(launcherPort);
listenerServer.setSoTimeout((int) OperaIntervals.LAUNCHER_TIMEOUT.getValue());
// Try to connect
launcherProtocol = new OperaLauncherProtocol(listenerServer.accept());
So haben wir eine eng koppeln ed Bindung an den lokalen Server. Der Port wird zugunsten eines freien auf Ihrem System ignoriert, sollte aber gleichzeitig immer diesen Port verwenden können.
Wenn Ihre Firewall die Verbindung tatsächlich nicht verhindert (wie Sie besprochen haben), nehmen wir an, Sie möchten, dass Opera programmatisch verbunden wird, anstatt die Verbindung manuell zu öffnen.
Nach some documentation, opera.host
führt die folgende Einschränkung:
opera.host(String) Der Host-Opera sollte verbinden. Wenn Sie nicht manuell Opera starten, werden Sie dies nicht benötigen.
(Zusätzliche Betonung meins.)
Unnötig zu sagen, der Vorbehalt betrifft mich. Ebenso trotz seiner scheinbaren Unanwendbarkeit:
opera.port(Integer) Der Port, an Opera sollte verbinden. 0 = Zufällig, -1 = Opera Standard (zur Verwendung mit Opera> 12).
(zusätzliche Hervorhebung von mir.)
Kurz gesagt: versuchen Sie, Ihre Anwendung läuft 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);
Wenn dies nicht funktioniert, ist etwas anderes falsch, entweder mit Ihrem Projekt oder mit Ihre aktuelle Opera-Binärdatei, sei es versionsbezogen oder nicht.
Ich habe dies mit 11.52/Build 110 mit den gleichen Ergebnissen versucht. –