2012-04-04 4 views
4

Ich versuche OperaDriver für Java (Version 0.11) in meine Testsuite zu integrieren. Hier ist der Code-Schnipsel:OperaDriver hat Zeitüberschreitung beim Warten auf Opera Launcher

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); 

Der obige Code-Schnipsel nicht Timeout waiting for launcher to connect on port 29392 eine WebDriver Referenz mit einer SocketTimeoutException zurückzukehren. Ich kann sehen, dass der Browser (Opera ver. 11.62) mit der geladenen Kurzwahlkarte gestartet wird und der Launcher ebenfalls ausgeführt wird, aber irgendwie scheint OperaDriver keine Verbindung herzustellen.

Die Ausnahme, die ich sehe, ist:

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 

ich versucht habe, -1 für „opera.port“ und auch 7001, aber die Fähigkeit Einstellung scheint ignoriert werden, da sie mit einem zufälligen zu verbinden versucht, Port jedes Mal. Ich habe meine Firewalls auch vorübergehend ausgeschaltet.

+0

Ich habe dies mit 11.52/Build 110 mit den gleichen Ergebnissen versucht. –

Antwort

8

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:

  1. 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.

  2. 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.

+1

Danke Gomez. Meine Ergebnisse stimmen mit Ihren überein. Ich dachte, dass der Standard-Port 7001 nicht kritisch für die Verbindung ist und jeder zufällige Port sollte ausreichen, wenn die Dinge normal funktionieren. Ich versuchte In-Memory-Bearbeitung von Opera-Port zurück zu 7001, kurz bevor es versucht (nach zufälliger Port-Zuweisung) und sah die gleichen Ergebnisse. Ich denke, es muss 11,62 oder operelauncher.exe sein (die ich separat herunterladen musste) –

+0

@AshwinPrabhu Cool. Lassen Sie es mich wissen, wenn Sie weitere Hilfe benötigen, um das Problem aufzuspüren. Ich werde mich gerne über den Stack-Overflow-Chat während des Abendblocks PST (7-12 Uhr) informieren, falls Sie Hilfe bei der weiteren Fehlerbehebung benötigen. Das sollte für Sie zu arbeitsfähigen Morgenstunden passen. Viel Glück! – MrGomez

+0

@AshwinPrabhu Hm. Hast du es geschafft, dass das funktioniert? – MrGomez

Verwandte Themen