2012-04-04 2 views
4

Java 용 OperaDriver (버전 0.11)를 테스트 스위트에 통합하려고합니다.OperaDriver가 오페라 런처 기다리는 시간 초과되었습니다

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 Timeout waiting for launcher to connect on port 29392와 webdriver 참조를 반환하지 : 여기에 코드입니다. 스피드 다이얼 탭이로드 된 브라우저 (오페라 버전 11.62)가 시작되고 실행기도 실행되고 있지만 OperaDriver가 연결할 수없는 것 같습니다. 또한 7001

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 
내가 시도 -1 "opera.port"에 대한

하고, 그러나 무작위로 연결을 시도하기 때문에 기능의 설정은 무시하는 것 같다

내가 볼 예외입니다 포트마다. 방화벽이 일시적으로 꺼져 있습니다.

+0

나는 이것을 11.52/Build 110과 같은 결과로 시도했다. –

답변

8

첫째, let's isolate the exception being hit here는 :

  1. private final int launcherPort =PortProber.findFreePort(); 우리 launcherPort을 설정하고,이 변수는 고유의 연결을 설정하는 데 사용됩니다

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

    우리는이 코드에서 몇 가지를 배운다.

    실제로이 블록에서는 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());

, 우리는 단단히해야 결합 ed는 로컬 서버에 바인딩합니다. 포트는 시스템의 비어있는 포트를 위해 무시되지만 동시에 포트를 항상 사용할 수 있어야합니다.

만약 당신의 방화벽이 실제로 연결을 방해하지 않는다면, 수동으로 연결을 열기보다는 오페라가 프로그래밍 방식으로 연결되기를 원한다고 가정 해 봅시다.(문자열) opera.host

호스트 오페라에 연결해야합니다

some documentation에 따르면, opera.host 다음과 같은 경고를 전달합니다. 오페라를 수동으로 시작하지 않는 한 이것을 필요하지 않습니다.

(추가 강조 광산.)

말할 필요도없이, 경고는 나를 염려합니다. 마찬가지로, 겉보기에는 적용 할에도 불구하고 :

opera.port(정수) 오페라에 대한 포트에 연결해야합니다. 0 = 무작위, -1 = 오페라 기본값 (Opera> 12와 함께 사용).

(추가 강조 광산.) 한마디로

는 : 응용 프로그램 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); 

, 뭔가 다른 프로젝트 또는 함께 중, 잘못 귀하의 현재 오페라 바이너리, 버전 관련 또는 기타.

+1

감사합니다. Gomez. 내 결과가 너와 일치한다. 나는 기본 포트 7001이 연결에 중요하지 않으며 임의의 포트가 정상적으로 작동하면 충분해야한다고 생각했습니다. 나는 오페라 포트를 7001로 다시 메모리에 넣으려고 시도했으나 연결을 시도하기 전에 (임의의 포트 할당 후) 동일한 결과를 보았습니다. 11.62 또는 operalauncher.exe (별도로 다운로드해야 함) 여야합니다. –

+0

@AshwinPrabhu Cool. 문제를 추적하는 데 도움이 필요하면 알려주십시오. 추가 문제 해결에 도움이 필요하면 저녁 블록 (PST (7-12PM)) 동안 스택 오버플로 채팅을 통해 직접 사용할 수있게되어 기쁩니다. 그것은 당신을 위해 실행 가능한 아침 시간을 준수해야합니다. 행운을 빕니다! – MrGomez

+0

@AshwinPrabhu Hm. 이 일을 처리 할 수 ​​있었습니까? – MrGomez