2013-08-14 6 views
6

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)

+2

Was passiert, wenn Sie diese Zeile ausführen? : browser.execute_script ("closeWindow (false, '/lnacui2api/cart/displayCart.do', 'false');"); – EwyynTomato

+0

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

+0

Es funktioniert! Vielen Dank, @EwyynTomato – Parzival

Antwort

0

die folgende Codezeile in Ihrem Skript laufen, löst die Frage.

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