2013-08-14 7 views
6

Я использую Selenium Webdriver (в Python), чтобы автоматизировать загрузку тысяч файлов с определенного веб-сайта (который нельзя использовать с помощью обычных средств, таких как urllib, httplib и т. Д.). Мой скрипт отлично работает с Firefox, но мне не нужно видеть, как происходит магия, поэтому я пытаюсь использовать PhantomJS. Он работает почти полностью вниз, за ​​исключением случаев, когда он пытается щелкнуть определенную кнопку, чтобы закрыть окно. Ниже приведена команда, в которой скрипт застревает:Webdriver + PhantomJS просто висит там

Он просто висит там, ничего не происходит.

PhantomJS быстрее, чем Firefox (так как нет визуальных эффектов), поэтому я подумал, что проблема может быть связана с кнопкой «Закрыть окно», которая не будет достаточно быстро нажата. Поэтому я попытался с помощью явного ожидания:

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

Не работает: ожидание заканчивается довольно быстро («Сделано с ожиданием» после того, как второй или так появляется сообщение), но затем код висит снова. Я также пытался использовать неявное ожидание, но это тоже не сработало.

Итак, я в недоумении. Тот же скрипт работает как шарм, когда я использую Firefox, так почему же он не работает с PhantomJS?

Я не знаю, если это помогает, но вот исходный код страницы:

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

Я не знаю, если это помогает либо, но когда я ломаю исполнение ж/Crtl-C , я получаю это:

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 

Я новичок в программировании и я не могу понять смысл этого вывода (я даже не знаю, что такое «гнездо» есть). Но, может быть, некоторые из вас могут указать мне в правильном направлении? Быстрое исправить может быть слишком много, чтобы спросить, но, может быть, намек на то, что может продолжаться?

(Mac OS X 10.6.8, Python 2.7.5, Селен 2,33, PhantomJS 1.9.1)

+2

Что произойдет, если вы запустите эту строку? : browser.execute_script ("closeWindow (false, '/lnacui2api/cart/displayCart.do', 'false');"); – EwyynTomato

+0

Я закончил тем, что прибегал к быстрому и грязному 'browser.close()' fix. Теперь у меня не будет доступа к коду до понедельника, но тогда я попробую ваше предложение и посмотрю, какой результат я получаю. – Parzival

+0

Это работает! Большое спасибо, @EwyynTomato – Parzival

ответ

0

Запуск следующую строку кода в вашем скрипте, решает этот вопрос.

browser.execute_script("closeWindow(false, '/lnacui2api/cart/displayCart.do', 'false');"); 
Смежные вопросы