2

Я пытаюсь получить доступ к нескольким сайтам, используя Selenium в Java. Иногда я получаю UnreachableBrowserException. Я прочитал много потоков об этой ошибке, но кажется, что существует много разных причин ошибки. Я получаю ошибку около 1% времени, когда я пытаюсь получить доступ к новой странице, и я не могу найти никаких сходств между вхождениями. В настоящее время я использую Firefox, однако я также пробовал Internet Explorer и испытывал подобные ошибки. Я только открываю одну страницу за раз и пробовал использовать то же окно и полностью покидал драйвер, прежде чем пытаться получить доступ к другой странице, и в любом случае ошибка все еще происходит. Важно отметить, что я не всегда получаю эту ошибку, иногда мой код может работать без этого. Вот сообщение об ошибке:Selenium casual UnreachableBrowserException

Jan 12, 2015 10:39:40 PM org.apache.http.impl.execchain.RetryExec execute 
INFO: I/O exception (java.net.SocketException) caught when processing request to {}-  http://127.0.0.1:7055: Permission denied: connect 
Jan 12, 2015 10:39:40 PM org.apache.http.impl.execchain.RetryExec execute 
INFO: Retrying request to {}->http://127.0.0.1:7055 
Jan 12, 2015 10:39:40 PM org.apache.http.impl.execchain.RetryExec execute 
INFO: I/O exception (java.net.SocketException) caught when processing request to {}->http://127.0.0.1:7055: Permission denied: connect 
Jan 12, 2015 10:39:40 PM org.apache.http.impl.execchain.RetryExec execute 
INFO: Retrying request to {}->http://127.0.0.1:7055 
Jan 12, 2015 10:39:40 PM org.apache.http.impl.execchain.RetryExec execute 
INFO: I/O exception (java.net.SocketException) caught when processing request to {}->http://127.0.0.1:7055: Permission denied: connect 
Jan 12, 2015 10:39:40 PM org.apache.http.impl.execchain.RetryExec execute 
INFO: Retrying request to {}->http://127.0.0.1:7055 
Jan 12, 2015 10:39:40 PM org.apache.http.impl.execchain.RetryExec execute 
INFO: I/O exception (java.net.SocketException) caught when processing request to {}->http://127.0.0.1:7055: Permission denied: connect 
Jan 12, 2015 10:39:40 PM org.apache.http.impl.execchain.RetryExec execute 
INFO: Retrying request to {}->http://127.0.0.1:7055 
Jan 12, 2015 10:39:40 PM org.apache.http.impl.execchain.RetryExec execute 
INFO: I/O exception (java.net.SocketException) caught when processing request to {}->http://127.0.0.1:7055: Permission denied: connect 
Jan 12, 2015 10:39:40 PM org.apache.http.impl.execchain.RetryExec execute 
INFO: Retrying request to {}->http://127.0.0.1:7055 
Jan 12, 2015 10:39:40 PM org.apache.http.impl.execchain.RetryExec execute 
INFO: I/O exception (java.net.SocketException) caught when processing request to {}->http://127.0.0.1:7055: Permission denied: connect 
Jan 12, 2015 10:39:40 PM org.apache.http.impl.execchain.RetryExec execute 
INFO: Retrying request to {}->http://127.0.0.1:7055 
Exception in thread "main" org.openqa.selenium.remote.UnreachableBrowserException: Error communicating with the remote browser. It may have died. 
Build info: version: '2.44.0', revision: '76d78cf', time: '2014-10-23 20:03:00' 
System info: host: '****', ip: '**.*.*.*', os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.7.0_60' 
Driver info: driver.version: RemoteWebDriver 
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:593) 
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:614) 
    at org.openqa.selenium.remote.RemoteWebDriver.quit(RemoteWebDriver.java:468) 
    at scrape.Scraper.killInstance(Scraper.java:162) 
    at scrape.Updater.main(Updater.java:93) 
Caused by: java.net.SocketException: Permission denied: connect 
    at java.net.DualStackPlainSocketImpl.connect0(Native Method) 
    at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source) 
    at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) 
    at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) 
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source) 
    at java.net.PlainSocketImpl.connect(Unknown Source) 
    at java.net.SocksSocketImpl.connect(Unknown Source) 
    at java.net.Socket.connect(Unknown Source) 
    at org.apache.http.conn.socket.PlainConnectionSocketFactory.connectSocket(PlainConnectionSocketFactory.java:72) 
    at org.apache.http.impl.conn.HttpClientConnectionOperator.connect(HttpClientConnectionOperator.java:123) 
    at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:318) 
    at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:363) 
    at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:219) 
    at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:195) 
    at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:86) 
    at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:108) 
    at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184) 
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:72) 
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:57) 
    at org.openqa.selenium.remote.HttpCommandExecutor.fallBackExecute(HttpCommandExecutor.java:215) 
    at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:184) 
    at org.openqa.selenium.firefox.internal.NewProfileExtensionConnection.execute(NewProfileExtensionConnection.java:165) 
    at org.openqa.selenium.firefox.FirefoxDriver$LazyCommandExecutor.execute(FirefoxDriver.java:362) 
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:572) 
    ... 4 more 

Как предотвратить эту ошибку или по крайней мере уловить ошибку и эффективно ее решить?

+1

Что произойдет, если вы поймаете исключение, закройте браузер и перезапустите? Так ли это работает? У вас есть мои симпатии - эти исключения ужасны. – bsg

+0

Это может быть глупый вопрос, но какое исключение и как вы попытаетесь его поймать и перезапустить? Я попытался поймать SocketException, поскольку это, казалось, произошло сначала, но по какой-то причине это не сработало. Не могли бы вы показать мне пример? – klib

+0

Вы видели мой ответ? Было ли это полезно? – bsg

ответ

2

UnreachableBrowserException может происходить по нескольким причинам - наиболее очевидно, что браузер был закрыт, либо в коде, либо физически в графическом интерфейсе, а затем код попытался получить к нему доступ. Часто, как и в вашем случае, они вызваны ошибками сокета. Это может означать, опять-таки, несколько вещей - ваша программа пыталась открыть слишком много сокетов, не могла подключиться к удаленному веб-сайту и другим.

То, что я предлагаю сделать в такой ситуации, ждет короткое время, а затем повторите попытку, чтобы увидеть, все еще ли исключение. Иногда эти ситуации разрешаются сами, и ваша программа может восстановиться.

Вот какой код для этого. Он продолжает повторять попытку до тех пор, пока не будет выбрано исключение UnreachableBrowserException, а количество попыток ниже определенного предела. Если он попадает в предел повтора и исключение все еще бросается, оно закрывает браузер и перезапускает его, сброс счетчика повторов до 0. Существует также счетчик перезапуска, чтобы убедиться, что если по какой-либо причине перезапуск браузера не выполняется help, вы не зацикливаетесь бесконечно через запущенный код -> exception -> wait -> retry -> hit retry limit, restart browser -> run code -> exception. Здесь превышение предела перезапуска (или успешного доступа к браузеру) выйдет из цикла.

Если вам нужна дополнительная помощь, сообщите мне. Упование это полезно!

WebDriver driver = new FirefoxDriver(); //or whatever you're using 
boolean worked = false; 
int numredos = 0; 
final int REDO_LIMIT = 3; //or however many times you want to retry before giving up 
final int RESTART_LIMIT = 3; //or however many times you want to restart the browser b/f terminating  
int numrestarts = 0; 
boolean restart = false; 
do 
{ 
    try{ 

     if(restart) 
     { 
     driver = new FirefoxDriver(); 
     numrestarts++; 
     } 

    //RUN YOUR BROWSER CODE HERE 
     worked = true;               
    } 

    //if the browser becomes unreachable (probably b/c of a socket issue), 
// write the error to the log and then sleep for 10 seconds 
//if we've already retried the set limit number of times, restart the browser and try again 
    catch (UnreachableBrowserException ube) 
    { 
    worked = false; 
    if(numredos >= REDO_LIMIT) 
    { 
     //if you've already restarted the browser too many times, it will set it to null 
     //and return an error code. If not, it will set the restart flag so it will be restarted on the next iteration. 

     //try quitting. If it can't do it, it's already dead; just set it to null 
     //(set it to null either way, just in case) 
      try 
      { 
      driver.quit(); 
      } 
      catch(Exception j) 
      { 
      errorwriter.println(j); 
      } 

      driver = null; 

      if(numrestarts < RESTART_LIMIT) 
      { 
      //log that you're restarting the driver (not coded here), then set the restart flag to true. This will cause the browser to be restarted after falling out of the catch block 
      numredos = 0; 
      restart = true; 
      } 

     } 

     else 
     { 
     //print details of the exception to the error file 
     errorfile.println("\n\n\n"); 
     //timestamp, and some exception details - you can decide which you want 
     errorfile.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Calendar.getInstance().getTime())); 
     errorfile.println(s.getClass()); 
     errorfile.println(s.getMessage()); 
     errorfile.println("Cause: " + s.getCause()); 
     errorfile.flush(); 

     //now sleep for some number of seconds - here 10 
     try 
     { 
     TimeUnit.SECONDS.sleep(10); 
     } 

     catch(InterruptedException e) 
     { 
      System.out.println("waiting after socket crash interrupted"); 
     } 

     numredos++; 
     } 

    } 

}while(!worked && numredos <= REDO_LIMIT && numrestarts <= RESTART_LIMIT); 
Смежные вопросы