2012-03-06 18 views
7

Czasami, w środku mojego skryptu, moja instancja webdriver będzie po prostu umrzeć!Python selenium webdriver - sterownik nagle "umiera" i nie może wyjść, pobierz current_url, otwórz strony

Odtąd nie mogę powoływać się na żadną z jej metod.

Kilka przykładów:

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

Wszelkie pomysły, dlaczego to może być przypadek? Jakieś najlepsze rozwiązania dla pokonywania przeszkód?

Mam na myśli od czasu do czasu testowanie na żywo przez driver.current_url w bloku try, a jeśli zgłasza wyjątek, to ustawienie sterownika na None, a następnie ponowne utworzenie go ... ale to brzydki hack i ja nie rozumiem, dlaczego jest to potrzebne.

+0

byłoby bardziej sensowne, aby zobaczyć kod serwera WWW, które powinny być sprawdzane przez ten kod. "Odmowa połączenia" wyraźnie stwierdza, że ​​nie ma już nikogo, kto będzie nasłuchiwał, lub istnieje zasada, która powstrzymuje słuchacza od angażowania się ... –

+0

Według działu inżynierii backendu, serwer internetowy działa dobrze i nie rozłącza automatycznie użytkowników . Myślę, że to błąd selenu? –

+0

jaka jest twoja wersja selenowa? jaka przeglądarka? Czy dzieje się to we wszystkich przeglądarkach? Czy jesteś za proxy? Czy Twój adres URL został poprawnie utworzony? – nilesh

Odpowiedz

1

Po niekończących się zmaganiach ze sterownikami selenu i zerwaniem rozszerzeń FF. Całkowicie go usunąłem.

Używam http://www.phantomjs.org/, która jest bezgłową biblioteką JS. Działa jak urok. (i chcesz zobaczyć stronę, zawsze można zrobić screen-shoot)

Pracuję głównie w ruby ​​tak: mają zastąpić capybara-WebKit z poltergeist (który jest tylko js_driver dla kapibary)

I Jestem pewien, że będzie podobne rozwiązanie. Może to nie odpowiada na twoje pytanie, ale zapewni inne spojrzenie na testowanie JS.

+3

lol mamy ten problem z PhantomJS, ale to, co zrobiliśmy, to po prostu sprawdzamy, czy Webdriver nie odpowiada, jeśli nie my go zabijamy i zaczynamy nowy. Działa świetnie do teraz! –

+0

możesz szczegółowo opisać kroki, które zrobiłeś to zrobić? Jaki proces szukam? – KJW

+0

@SamStoelinga Jak sprawdzić, czy webdriver nie odpowiada? – pad

0

Czy masz serwer selenowy działający jako pierwszy?

To pytanie sugeruje, że serwer WWW nie działa to jest problem: 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 & 

Znajdziesz bardziej kompletne instrukcje jak skonfigurować serwer tutaj http://seleniumhq.org/docs/05_selenium_rc.html#installation

Ta strona ma podobny problem: http://johnmudd.infogami.com/blog/5be6

Innym podobne pytanie: How do you connect remotely using Python + Webdriver

+1

To nie jest problem. Nie muszę uruchamiać serwera selenu, ponieważ używam selenu2 z webdriverem. Powiedziałem, że próbowałem uruchomić skrypt, mając serwer WWW w tle i to nie rozwiązało mojego problemu. –

0

Jest to błąd "odmowy połączenia" do sterownika internetowego selonu w przeglądarce Firefox, który jest zaimplementowany jako rozszerzenie przeglądarki Firefox. Dziką domysłą jest tutaj pewien problem w rozszerzeniu lub Firefox zatrzymuje działanie kodu httpd w rozszerzeniu.

Możesz spróbować sprawdzić, czy masz najnowszą wersję web driver extension i zgodną wersję przeglądarki Firefox.

A może warto wypróbować alternatywną przeglądarkę np. Sterownik Chrome Web (wymaga kilku linii zmiany w kodzie Pythona)

0

Doświadczyłem tego samego problemu, a przynajmniej tak mi się wydaje. Po mojej stronie przeglądarka (Chrome) byłaby blokowana, a przy ręcznym zatrzymywaniu procesu w terminalu otrzymywałbym ten sam URLError.

W tym czasie używał LiveServerTestCase Django, jak Splinter i wykonawczego następujące metody:

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

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

Byłoby utworzyć tylko jeden sterownik wszystkie testy prowadzone przez klasy. Wszystkie moje testy umieściłem w jednej metodzie.

W każdym razie doprowadziłoby to do zablokowania sterownika w pewnym momencie.

Potem przełączyłem się na implementację metody Setup i TearDown, która tworzyła/opuszczała sterownik w nich. To by następnie utworzyć i zamknąć sterownik dla każdego testu (metho) w klasie. Złożyłem również moje testy na kilka metod.

Po tym wszystkim wszystko będzie dobrze, a ja robię dokładnie to samo. Wydaje się, że problem dotyczył głównie robienia wszystkiego z jednym sterownikiem.

Jako wskazówka, możesz zaimplementować elementy logowania w metodzie instalacji, tak aby twój sterownik był zalogowany do każdego testu, jest to konieczne, ponieważ zamknięcie sterownika powoduje również opróżnienie sesji.

to właśnie efekt końcowy wygląda tak:

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