Ich benutze Selenium Webdriver (in Python), um das Herunterladen von Tausenden von Dateien von einer bestimmten Website zu automatisieren (die nicht mit herkömmlichen Mitteln wie urllib, httplib, etc. webscraped werden kann). Mein Skript funktioniert perfekt mit Firefox, aber ich muss keine Magie erleben, also versuche ich PhantomJS zu benutzen. Es funktioniert fast ganz nach unten, außer wenn es versucht, auf eine bestimmte Schaltfläche zu klicken, um ein Fenster zu schließen. Hier ist der Befehl, bei dem das Skript stecken bleibt:Webdriver + PhantomJS hängt einfach dort
browser.find_element_by_css_selector("img[alt=\"Close Window\"]").click()
Es hängt einfach drin, nichts passiert.
PhantomJS ist schneller als Firefox (da es keine Visuals gibt), also dachte ich, das Problem könnte damit zusammenhängen, dass der Button 'Fenster schließen' nicht schnell genug anklickbar ist. Daher habe ich versucht, eine explizite Warte mit:
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()
funktioniert nicht: das Warten endet ziemlich schnell (die „erledigt warten“ Nachricht nach einer Sekunde erscheint oder so), aber dann wieder der Code hängt. Ich habe auch versucht, eine implizite Wartezeit zu verwenden, aber das hat auch nicht funktioniert.
So bin ich ratlos. Das gleiche Skript läuft wie ein Zauber, wenn ich Firefox verwende, also warum funktioniert das nicht mit PhantomJS?
Ich weiß nicht, ob das hilft, aber hier ist die Seite Quelle:
http://www.flickr.com/photos/[email protected]/9512669916/sizes/l/in/photostream/
Ich weiß nicht, ob dies entweder hilft, aber wenn ich breche die Ausführung w/Strg-C , bekomme ich diese:
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
ich bin neu in der Programmierung und ich kann nicht Sinn dieser Ausgabe machen (ich weiß nicht einmal, was ein „Sockel“ ist). Aber vielleicht können einige von Ihnen mich in die richtige Richtung weisen? Eine schnelle Lösung könnte zu viel verlangt sein, aber vielleicht ein Hinweis darauf, was passieren könnte?
(Mac OS X 10.6.8, Python 2.7.5, Selen 2,33, PhantomJS 1.9.1)
Was passiert, wenn Sie diese Zeile ausführen? : browser.execute_script ("closeWindow (false, '/lnacui2api/cart/displayCart.do', 'false');"); – EwyynTomato
Ich landete auf den schnellen und schmutzigen 'browser.close()' zu beheben. Jetzt werde ich bis Montag keinen Zugriff auf den Code haben, aber dann werde ich Ihren Vorschlag ausprobieren und sehen, welche Ausgabe ich bekomme. – Parzival
Es funktioniert! Vielen Dank, @EwyynTomato – Parzival