2013-08-14 26 views
6

Tôi đang sử dụng Selenium Webdriver (bằng Python) để tự động tải xuống hàng nghìn tệp từ một trang web nhất định (không thể được webscraped bằng các phương tiện thông thường như urllib, httplib, v.v.). Kịch bản của tôi hoạt động hoàn hảo với Firefox, nhưng tôi không cần phải thấy ma thuật xảy ra, vì vậy tôi đang cố gắng sử dụng PhantomJS. Nó hoạt động gần như tất cả các con đường xuống, ngoại trừ khi nó cố gắng bấm vào một nút nhất định để đóng một cửa sổ. Đây là lệnh mà tại đó tập lệnh bị kẹt:Webdriver + PhantomJS chỉ bị treo ở đó

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

Nó chỉ bị treo trong đó, không có gì xảy ra.

PhantomJS nhanh hơn Firefox (vì không có hình ảnh), vì vậy tôi nghĩ rằng sự cố có thể liên quan đến nút 'Đóng cửa sổ' không thể nhấp đủ sớm. Do đó tôi đã cố gắng sử dụng một chờ đợi rõ ràng:

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

Không làm việc: chờ đợi kết thúc khá nhanh chóng (các "thực hiện với chờ đợi" thông báo xuất hiện sau một giây hoặc lâu hơn), nhưng sau đó mã treo một lần nữa. Tôi cũng đã thử sử dụng một chờ đợi tiềm ẩn, nhưng điều đó đã không làm việc hoặc.

Vì vậy, tôi đang thua lỗ. Kịch bản tương tự chạy như một nét duyên dáng khi tôi sử dụng Firefox, vậy tại sao nó không hoạt động với PhantomJS?

Tôi không biết nếu điều này sẽ giúp, nhưng ở đây là mã nguồn trang web:

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

Tôi không biết nếu điều này giúp một trong hai, nhưng khi tôi phá vỡ thi w/Crtl-C , Tôi nhận được điều này:

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 

Tôi mới lập trình và tôi không thể hiểu được đầu ra này (Tôi thậm chí không biết "ổ cắm" là gì). Nhưng có lẽ một số bạn có thể chỉ cho tôi đi đúng hướng? Một sửa chữa nhanh có thể là quá nhiều để hỏi, nhưng có thể là một gợi ý về những gì có thể xảy ra?

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

+2

Điều gì xảy ra nếu bạn chạy dòng này? : browser.execute_script ("closeWindow (sai, '/lnacui2api/cart/displayCart.do', 'false');"); – EwyynTomato

+0

Tôi đã kết thúc với việc sửa chữa 'browser.close()' nhanh chóng và bẩn. Bây giờ tôi sẽ không có quyền truy cập vào mã cho đến thứ hai, nhưng sau đó tôi sẽ cố gắng đề xuất của bạn và xem những gì tôi nhận được đầu ra. – Parzival

+0

Nó hoạt động! Rất cám ơn, @EwyynTomato – Parzival

Trả lời

0

Chạy dòng mã sau đây trong kịch bản của bạn, giải quyết các câu hỏi.

browser.execute_script("closeWindow(false, '/lnacui2api/cart/displayCart.do', 'false');"); 
Các vấn đề liên quan