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)
Cosa succede se si esegue questa linea? : browser.execute_script ("closeWindow (false, '/lnacui2api/cart/displayCart.do', 'false');"); – EwyynTomato
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
Funziona! Molte grazie, @EwyynTomato – Parzival