2012-03-06 11 views
7

A volte, nel mezzo del mio script, l'istanza del mio webdriver sarà solo die!Web driver selenio Python - il driver improvvisamente "muore" e non può uscire, ottenere current_url, pagine aperte

E da quel momento in poi, non posso invocare nessuno dei suoi metodi.

Alcuni esempi:

>>> spsel.driver.current_url 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/lib/python2.6/dist-packages/selenium/webdriver/remote/webdriver.py", line 414, in current_url 
    return self.execute(Command.GET_CURRENT_URL)['value'] 
    File "/usr/local/lib/python2.6/dist-packages/selenium/webdriver/remote/webdriver.py", line 151, in execute 
    response = self.command_executor.execute(driver_command, params) 
    File "/usr/local/lib/python2.6/dist-packages/selenium/webdriver/remote/remote_connection.py", line 280, in execute 
    return self._request(url, method=command_info[0], data=data) 
    File "/usr/local/lib/python2.6/dist-packages/selenium/webdriver/remote/remote_connection.py", line 321, in _request 
    response = opener.open(request) 
    File "/usr/lib/python2.6/urllib2.py", line 391, in open 
    response = self._open(req, data) 
    File "/usr/lib/python2.6/urllib2.py", line 409, in _open 
    '_open', req) 
    File "/usr/lib/python2.6/urllib2.py", line 369, in _call_chain 
    result = func(*args) 
    File "/usr/lib/python2.6/urllib2.py", line 1161, in http_open 
    return self.do_open(httplib.HTTPConnection, req) 
    File "/usr/lib/python2.6/urllib2.py", line 1136, in do_open 
    raise URLError(err) 
urllib2.URLError: <urlopen error [Errno 111] Connection refused> 



>>> spsel.driver.quit() 

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/lib/python2.6/dist-packages/selenium/webdriver/firefox/webdriver.py", line 55, in quit 
    RemoteWebDriver.quit(self) 
    File "/usr/local/lib/python2.6/dist-packages/selenium/webdriver/remote/webdriver.py", line 443, in quit 
    self.execute(Command.QUIT) 
    File "/usr/local/lib/python2.6/dist-packages/selenium/webdriver/remote/webdriver.py", line 151, in execute 
    response = self.command_executor.execute(driver_command, params) 
    File "/usr/local/lib/python2.6/dist-packages/selenium/webdriver/remote/remote_connection.py", line 280, in execute 
    return self._request(url, method=command_info[0], data=data) 
    File "/usr/local/lib/python2.6/dist-packages/selenium/webdriver/remote/remote_connection.py", line 321, in _request 
    response = opener.open(request) 
    File "/usr/lib/python2.6/urllib2.py", line 391, in open 
    response = self._open(req, data) 
    File "/usr/lib/python2.6/urllib2.py", line 409, in _open 
    '_open', req) 
    File "/usr/lib/python2.6/urllib2.py", line 369, in _call_chain 
    result = func(*args) 
    File "/usr/lib/python2.6/urllib2.py", line 1161, in http_open 
    return self.do_open(httplib.HTTPConnection, req) 
    File "/usr/lib/python2.6/urllib2.py", line 1136, in do_open 
    raise URLError(err) 
urllib2.URLError: <urlopen error [Errno 111] Connection refused> 

Tutte le idee perché questo potrebbe essere il caso? Qualche soluzione ottimale per il superamento?

Sto pensando di testare di tanto in tanto il livellamento da driver.current_url in un blocco try, e se lancia un'eccezione, quindi imposta il driver su None, e poi ri-istanziarlo ... ma è un brutto hack e io non capisco perché è necessario

+0

Si avrebbe più senso per vedere il codice del server web che dovrebbero essere controllati da questo codice. "Connessione rifiutata" afferma chiaramente che non c'è più nessuno in ascolto, o c'è una regola che impedisce all'ascoltatore di essere coinvolto ... –

+0

Secondo il dipartimento di ingegneria di backend, il server web è a posto e non disconnette automaticamente gli utenti . Penso che sia un bug di selenio? –

+0

qual è la tua versione di selenio? quale browser? Succede a tutti i browser? Sei dietro un proxy? Il tuo URL è stato formato correttamente? – nilesh

risposta

1

Dopo interminabili lotte con i driver del selenio e le estensioni FF che si rompono. L'ho rimosso completamente.

Io uso http://www.phantomjs.org/ che è senza JS lib. Funziona come un fascino. (e ti voglio vedere la pagina, si può sempre fare screen-shoot)

Io lavoro principalmente in rubino così: avere sostituire Capybara-webkit con poltergeist (che è solo un js_driver per capibara)

I Sono abbastanza sicuro che ci sarà una soluzione simile. Forse questo non risponde alla tua domanda ma fornirà uno sguardo diverso sul test di js.

+3

lol stiamo avendo questo problema con PhantomJS, ma quello che abbiamo fatto è solo controllare se il Webdriver non risponde se non lo uccidiamo e ne iniziamo uno nuovo. Funziona benissimo fino ad ora! –

+0

puoi dettagliare i passaggi che hai fatto per farlo? che procedura sto cercando – KJW

+0

@SamStoelinga come si controlla se un webdriver non risponde? – pad

0

Avete il selenio webserver in esecuzione per primo?

Questa domanda suggerisce che il server web non è in esecuzione è il problema: Selenium in Python

 
then the solution is most likely that you need get the selenium server running first. 

In the download for SeleniumRC you will find a file called selenium-server.jar (as of a 
few months ago, that file was located at SeleniumRC/selenium-server-1.0.3/selenium- 
server.jar). 

On Linux, you could run the selenium server in the background with the command 

java -jar /path/to/selenium-server.jar 2>/dev/null 1>&2 & 

Troverete istruzioni più complete su come impostare il server qui http://seleniumhq.org/docs/05_selenium_rc.html#installation

Questa pagina ha un problema simile: http://johnmudd.infogami.com/blog/5be6

Un'altra domanda simile: How do you connect remotely using Python + Webdriver

+1

Questo non è il problema. Non ho bisogno di avere il server di selenio in esecuzione dal momento che sto usando selenium2 con webdriver. Detto questo, ho provato ad avviare lo script avendo il webserver in background, e non ha risolto il mio problema. –

0

Quindi si tratta di un errore di "connessione rifiutata" al driver Web del selenio in Firefox implementato come estensione per Firefox. L'indovinata ipotesi qui è un problema all'interno dell'estensione o Firefox si ferma il codice httpd nell'estensione dal lavoro.

È possibile provare a verificare se è disponibile o meno l'ultima versione web driver extension e una versione per Firefox compatibile.

E inoltre si consiglia di provare un browser alternativo, ad es. Driver Web Chrome (richiede alcune righe di modifica nel codice Python)

0

Ho riscontrato lo stesso problema, o almeno lo penso. Da parte mia il browser (Chrome) sarebbe un blocco e quando arresterei manualmente il processo nel terminale avrei ottenuto lo stesso URLError.

A quel tempo stavo usando LiveServerTestCase di Django così come Splinter e l'attuazione dei seguenti metodi:

@classmethod 
def setUpClass(cls): 
    cls.browser = Browser() 
    super(MyClass, cls).setUpClass() 

@classmethod 
def tearDownClass(cls): 
    cls.browser.quit() 
    super(MyClass, cls).tearDownClass() 

Questo creerebbe un solo driver per tutte le prove corse dalla classe. Ho anche messo tutti i miei test in un solo metodo.

In ogni caso, a un certo punto, il conducente potrebbe bloccarsi.

Quindi ho passato a implementare il metodo di installazione e TearDown un'istanza/uscire dal driver in loro. Ciò quindi crea e chiude un driver per ogni test (metho) nella classe. Ho anche rotto le mie prove in diversi metodi.

Dopo tutto, tutto sarebbe andato per il verso giusto, mentre stavo facendo esattamente le stesse cose. Quindi il problema sembra essere stato principalmente fare tutto con un solo driver.

Come suggerimento, è possibile implementare le informazioni di accesso nel metodo di installazione in modo che il proprio autista sia connesso per ogni test, necessario poiché l'uscita dal driver scarica anche la sessione.

questo è ciò che il risultato finale assomiglia a:

from splinter import Browser 
from django.test import LiveServerTestCase 
from django.core.urlresolvers import reverse 

class MySeleniumTests(LiveServerTestCase): 
    fixtures = ['initial_data.json'] 

    def setUp(self): 
     #fire up your driver 
     self.browser = Browser('chrome') 
     #login 
     self.browser.visit('%s%s' % (self.live_server_url, reverse('home'))) 
     self.assertEquals(self.browser.url, '%s%s' % (self.live_server_url,'/accounts/login/?next=%s' % reverse('home'))) 
     self.browser.fill_form({'username': 'test', 'password': 'test'}) 
     self.browser.find_by_tag('button').first.click() 
     self.assertEquals(self.browser.url, '%s%s' % reverse('home'))) 

    def tearDown(self): 
     #quit your driver 
     self.browser.quit() 
Problemi correlati