2013-08-14 17 views
6

Utilizzo Selenium Webdriver (in Python) per automatizzare il download di migliaia di file da un determinato sito Web (che non può essere eseguito su Web con metodi convenzionali come urllib, httplib, ecc.). Il mio script funziona perfettamente con Firefox, ma non ho bisogno di vedere la magia che accada, quindi sto cercando di usare PhantomJS. Funziona quasi completamente verso il basso, tranne quando tenta di fare clic su un determinato pulsante per chiudere una finestra. Ecco il comando al quale la sceneggiatura rimane bloccata:Webdriver + PhantomJS si blocca lì dentro

browser.find_element_by_css_selector("img[alt=\"Close Window\"]").click() 

Si blocca solo lì, non succede nulla.

PhantomJS è più veloce di Firefox (dal momento che non ci sono immagini), quindi ho pensato che il problema potrebbe essere correlato al pulsante 'Chiudi finestra' non selezionabile abbastanza presto. Quindi Ho provato ad utilizzare un'attesa esplicito:

element = WebDriverWait(browser, 30).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "img[alt=\"Close Window\"]"))) 
print "done with waiting" 
browser.find_element_by_css_selector("img[alt=\"Close Window\"]").click() 

non funziona: l'attesa finisce abbastanza rapidamente (il "fatto con l'attesa" appare il messaggio dopo un secondo o giù di lì), ma poi il codice si blocca di nuovo. Ho anche provato a usare un'attesa implicita, ma non ha funzionato neanche.

Quindi, sono in perdita. Lo stesso script funziona come un incantesimo quando utilizzo Firefox, quindi perché non funziona con PhantomJS?

Non so se questo aiuta, ma qui è la sorgente della pagina:

http://www.flickr.com/photos/[email protected]/9512669916/sizes/l/in/photostream/

Non so se questo aiuta sia, ma quando mi rompere l'esecuzione w/Crtl-C , ottengo questo:

Traceback (most recent call last): 
    File "myscript.py", line 361, in <module> 
    myfunction(some_argument, some_other_argument) 
    File "myscript.py", line 277, in myfunction 
    browser.find_element_by_css_selector("img[alt=\"Close Window\"]").click() 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/selenium-2.33.0-py2.7.egg/selenium/webdriver/remote/webelement.py", line 54, in click 
    self._execute(Command.CLICK_ELEMENT) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/selenium-2.33.0-py2.7.egg/selenium/webdriver/remote/webelement.py", line 228, in _execute 
    return self._parent.execute(command, params) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/selenium-2.33.0-py2.7.egg/selenium/webdriver/remote/webdriver.py", line 163, in execute 
    response = self.command_executor.execute(driver_command, params) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/selenium-2.33.0-py2.7.egg/selenium/webdriver/remote/remote_connection.py", line 349, in execute 
    return self._request(url, method=command_info[0], data=data) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/selenium-2.33.0-py2.7.egg/selenium/webdriver/remote/remote_connection.py", line 396, in _request 
    response = opener.open(request) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 404, in open 
    response = self._open(req, data) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 422, in _open 
    '_open', req) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 382, in _call_chain 
    result = func(*args) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 1214, in http_open 
    return self.do_open(httplib.HTTPConnection, req) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 1187, in do_open 
    r = h.getresponse(buffering=True) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 1045, in getresponse 
    response.begin() 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 409, in begin 
    version, status, reason = self._read_status() 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 365, in _read_status 
    line = self.fp.readline(_MAXLINE + 1) 
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 476, in readline 
    data = self._sock.recv(self._rbufsize) 
KeyboardInterrupt 

sono nuovo di programmazione e non riesco a dare un senso a questa uscita (non so nemmeno cosa sia un "presa" è). Ma forse qualcuno di voi può indicarmi la giusta direzione? Una soluzione rapida potrebbe essere troppo chiedere, ma forse un suggerimento su cosa potrebbe succedere?

(Mac OS X 10.6.8, Python 2.7.5, Selenio 2.33, PhantomJS 1.9.1)

+2

Cosa succede se si esegue questa linea? : browser.execute_script ("closeWindow (false, '/lnacui2api/cart/displayCart.do', 'false');"); – EwyynTomato

+0

Ho finito per ricorrere alla soluzione rapida e sporca di 'browser.close()'. Ora non avrò accesso al codice fino a lunedì, ma poi proverò il tuo suggerimento e vedrò quale output ottengo. – Parzival

+0

Funziona! Molte grazie, @EwyynTomato – Parzival

risposta

0

eseguendo il seguente riga di codice nello script, risolve la questione.

browser.execute_script("closeWindow(false, '/lnacui2api/cart/displayCart.do', 'false');");