2017-12-21 148 views
12

Tôi đang sử dụng một thiết lập rất phức tạp để kiểm tra các trang web không công khai khác nhau. Tôi sử dụng jenkins để chạy thử nghiệm python-selenium trong hình ảnh docker. Bằng cách đó, tôi hoàn toàn độc lập với môi trường jenkins và có thể tạo ra môi trường của riêng tôi. Trong môi trường này, tôi đã cài đặt các phần mềm sau đây:Cách khắc phục "WebDriverException: Thông báo: kết nối bị từ chối"?

  • Firefox: 57.0.1
  • geckodriver: 0.18.0
  • nosetests: 1.3.7
  • selen: 3.8.0

Thử nghiệm selen tạo ra WebDriver theo cách sau:

profile = webdriver.FirefoxProfile() 
profile.set_preference("browser.download.dir", self.downloadpath) 
profile.set_preference("browser.download.folderList", 2) 
profile.set_preference("browser.download.useDownloadDir", True) 
profile.set_preference("browser.download.manager.showWhenStarting", False) 
profile.set_preference("pdfjs.disabled", True) 
profile.set_preference("browser.helperApps.neverAsk.saveToDisk", 
"application/force-download, image/png, text/html, text/plain, " 
"image/tiff, text/csv, application/zip, application/octet-stream") 
profile.set_preference("browser.download.manager.alertOnEXEOpen", False) 
profile.set_preference("browser.download.manager.focusWhenStarting", False) 
profile.set_preference("browser.helperApps.alwaysAsk.force", False) 
profile.set_preference("browser.download.manager.alertOnEXEOpen", False) 
profile.set_preference("browser.download.manager.closeWhenDone", True) 
profile.set_preference("browser.download.manager.showAlertOnComplete", False) 
profile.set_preference("browser.download.manager.useWindow", False) 
profile.set_preference("services.sync.prefs.sync.browser.download.manager.showWhenStarting", 
False) 
self.driver = webdriver.Firefox(profile, log_path = logfile) 

trong đó logfileself.downloadpath là hai đường dẫn hợp lệ trong thiết lập bộ đế.

Toàn bộ bộ thử nghiệm bao gồm 6 trường hợp kiểm tra độc lập, mỗi trường hợp có cùng thiết lập như trên. Họ thường chạy tốt và hoàn thành mà không có vấn đề.

Nhưng mà không cần bất kỳ sự thay đổi để thử nghiệm hoặc cài đặt chung, một thử nghiệm đôi khi không thành công với thông báo lỗi sau:

File "/root/tests/bsp_usecase_tests/tools/basicsuite.py", line 210, in set_driver_firefox 
    self.driver = webdriver.Firefox(profile, log_path = logfile) 
    File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/webdriver.py", line 158, in __init__ 
    keep_alive=True) 
    File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 154, in __init__ 
    self.start_session(desired_capabilities, browser_profile) 
    File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 243, in start_session 
    response = self.execute(Command.NEW_SESSION, parameters) 
    File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 311, in execute 
    self.error_handler.check_response(response) 
    File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/errorhandler.py", line 237, in check_response 
    raise exception_class(message, screen, stacktrace) 
WebDriverException: Message: connection refused 

Tôi có hai câu hỏi:

  1. kết nối gì bị từ chối ở đây? Ý nghĩa của thông báo lỗi
  2. Làm cách nào để sửa lỗi này?

Phụ Lục:

  • Khi tôi sử dụng một time.sleep(10) ngay trước khi dòng webdriver.Firefox, lỗi không xuất hiện nữa. Tôi đã đặt dòng đó trong một vòng lặp cố gắng-trừ-ngoại trừ?
+0

bạn có sử dụng màn hình ảo để chạy thử nghiệm selen không? Afaik jenkins chạy trong môi trường không đầu, vì vậy bạn cần 'Xvfb' để khởi tạo trình điều khiển firefox. Các phiên bản mới hơn của firefox cũng có thể làm việc trong môi trường không đầu - để sử dụng nó, bạn phải chuyển cờ trong các tùy chọn: 'opts = selenium.webdriver.firefox.options.Options(); opts.add_argument ('- không đầu'); driver = webdriver.Firefox (firefox_profile = profile, firefox_options = opts) '. – hoefling

+0

Lỗi này/ngăn xếp theo dõi chỉ ra rằng trình điều khiển không thể khởi động máy chủ nội bộ của nó để giao tiếp với máy khách python. Nó có thể là một điều kiện chủng tộc trên số cổng được tạo ra hoặc có thể hình ảnh docker thiếu bộ nhớ không tái chế đúng thời gian khi thử nghiệm tiếp theo bắt đầu. Trong mọi trường hợp, vấn đề của bạn đòi hỏi một ví dụ tái tạo và phân tích các bản ghi từ hệ điều hành, trình duyệt và trình điều khiển không có trong bài đăng của bạn. –

Trả lời

3

Các lỗi bạn đang nhìn thấy là:

WebDriverException: Message: connection refused 

Theo tài liệu WebDriverExceptioncơ sở webdriver ngoại lệ được như sau:

exception selenium.common.exceptions.WebDriverException(msg=None, screen=None, stacktrace=None) 

Vì vậy connection is refused here nghĩa là Selenium không thể thiết lập kết nối bạn muốn establis h qua:

self.driver = webdriver.Firefox(profile, log_path = logfile) 

Một giải pháp có thể sẽ được cung cấp tên đầy đủ của logfile cùng với logical location của logfile (từ Project Level) như sau:

self.driver = webdriver.Firefox(firefox_profile=profile, log_path='./Log/geckodriver.log') 

Ở đây bạn có thể tìm thấy một tương tự Discussion

Một lần nữa, như bạn đã đề cập When I used a time.sleep(10) just before the webdriver.Firefox line, the error did not show up anymore, vì vậy tôi giả sử có một ví dụ là GeckoDriverFirefox Browser khách hàng hoạt động trước đó. Do đó, tương tự như @Florent B. đề cập bạn có để bảo vệ bạn chống lại kịch bản phải đối mặt với Race Around Condition mà có thể xuất phát ra từ một trong hai điều sau đây:

  • Tiếp cận cùng logfile bởi các phiên làm việc mới mà have't phiên trước phát hành được nêu ra.
  • Truy cập vào cùng một cổng số bởi GeckoDriver hoặc Marionette bởi các phiên làm việc mới mà phiên trước have't phát hành được nêu ra.
  • Thiếu tiếp cận với CPU
  • Thiếu Physical Memory
  • Thiếu Swap Memory
  • Thiếu Disc cache
  • Thiếu Mạng băng thông
  • Docker Image chạy hết bộ nhớ

Ở đây bạn có thể tìm thấy một số Discussion tương tự.

Theo những nguyên nhân nêu trên, bạn cần phải làm theo một vài bước như sau:

  • Luôn luôn sử dụng phiên bản phát hành mới nhất của Selenium-Python client, WebDriver variant (GeckoDriver) và Web Browser (Firefox Browser)
  • Luôn sử dụng thoát() trong phương thức tearDown() để webdriverwebclient cả hai đều bị hủy.
  • CleanKhông gian làm việc dự án từ IDE trước và sau khi thực hiện Test Suite.
  • Clear các trình duyệt Cache trước và sau khi thực hiện Tests
  • Sử dụng CCleaner công cụ của bạn thường xuyên để lau đi những việc vặt OS bao gồm cả cũ rust_mozprofile directories.
+1

Tôi có thể thay đổi điều đó. Câu trả lời của bạn không giải thích được, tuy nhiên, những gì một 'WebDriverException' là, cũng không câu trả lời của bạn thảo luận về lý do phù hợp có thể tại sao tôi nhận được lỗi này chỉ thỉnh thoảng ... – Alex

+0

Kiểm tra câu trả lời cập nhật của tôi. – DebanjanB

2

Kết nối nào bị từ chối ở đây? Ý nghĩa của thông báo lỗi là gì

Kết nối giữa API trình quản trị web Python và trình duyệt web Firefox của bạn. Vâng, không phải bản thân kết nối, mà là một yêu cầu duy nhất mà trình duyệt web gửi đã bị "từ chối" bởi trình duyệt. Lưu ý rằng điều này hoạt động thông qua các JSON Wire protocol - JSON qua HTTP.

Làm cách nào để sửa lỗi này?

Thông thường, trong trường hợp có lỗi như vậy, lý do phổ biến nhất là sự cố tương thích . Nói cách khác, tôi nghi ngờ rằng geckodriver phiên bản 0.18.0 của bạn quá cũ cho Firefox 57. Nâng cấp geckodriver lên phiên bản ổn định mới nhất (hiện tại là 0.19.1).

Các vấn đề liên quan