2014-11-11 36 views
5

Tôi có ví dụ đơn giản này:Mở nhiều chủ đề với kết quả watir-webdriver trong 'Kết nối từ chối' lỗi

require 'watir-webdriver' 

arr = [] 
sites = [ 
"www.google.com", 
"www.bbc.com", 
"www.cnn.com", 
"www.gmail.com" 
] 

sites.each do |site| 
    arr << Thread.new { 
     b = Watir::Browser.new :chrome 
     b.goto site 
     puts b.url 
     b.close 
    } 
end 
arr.each {|t| t.join} 

Mỗi lần tôi chạy kịch bản này, tôi nhận được

ruby/2.1.0/net/http.rb:879:in `initialize': Connection refused - connect(2) for "127.0.0.1"  port 9517 (Errno::ECONNREFUSED) 

Hoặc một trong những trình duyệt đóng bất ngờ vào ít nhất một trong các chủ đề.

mặt khác, nếu tôi đặt sleep 2 vào cuối mỗi chu kỳ vòng lặp, mọi thứ sẽ chạy trơn tru! Bất kỳ ý tưởng nào về lý do đó?

Phải là một cái gì đó liên quan đến việc tìm hiểu đề làm việc ...

Trả lời

5

Bạn đang cơ bản tạo ra một tình trạng chủng tộc giữa trường hợp của trình duyệt của bạn để kết nối với các cổng mở watir-webdriver là tìm. Trong trường hợp này, phiên bản đầu tiên của trình duyệt sẽ thấy cổng 9517 đang mở và kết nối với nó. Vì bạn đang xoay vòng các trường hợp này song song, thể hiện thứ hai của bạn cũng cho rằng cổng 9517 đang mở và cố gắng kết nối. Nhưng oops, cổng đó đã được sử dụng bởi cá thể trình duyệt đầu tiên. Đó là lý do tại sao bạn nhận được lỗi cụ thể này.

Điều này cũng giải thích lý do tại sao sửa lỗi sleep 2. Ví dụ trình duyệt đầu tiên kết nối với cổng 9517 và chế độ ngủ gây ra phiên bản trình duyệt thứ hai để thấy rằng 9517 được thực hiện. sau đó nó kết nối trên cổng 9518.

EDIT

Bạn có thể xem cách này được thực hiện với Selenium::WebDriver::Chrome::Service#initialize (here), trong đó kêu gọi Selenium::WebDriver::PortProber (here). PortProber là cách trình quản trị web xác định cổng nào đang mở.

+0

Cảm ơn bạn. Rõ ràng của nó bây giờ. – MichaelR

+0

Vì vậy, tôi đang chạy vào một tình huống tương tự trong khi tôi đang thu thập dữ liệu trang web và khi tôi ném quá nhiều công nhân vào nó, tôi bắt đầu nhận được các lỗi tương tự. Có cách nào để "bảo vệ" kết nối ban đầu giữa trình duyệt và cổng mở, sao cho nó được đảm bảo? Chậm hơn không phải là vấn đề, nhưng ngủ sẽ không hoạt động khi tôi có hàng đợi khổng lồ và lượng thời gian cần thiết để hoàn thành mỗi công việc là hơi ngẫu nhiên .. chắc chắn, tôi sẽ rơi vào vấn đề này .... – kindofgreat

+0

Tôi đoán tôi có thể giữ cho các trình duyệt mở và đi đến các URL mới, intsead mở và đóng một thể hiện trình duyệt cho mỗi URL. Vì vậy, sau đó tôi chỉ có thể có một số công nhân đồng thời, nói 10, và có một khoảng thời gian ngủ đủ dài giữa 10 người đó để bắt đầu, sau đó người lao động là trường hợp trong mười công nhân đó. Không hoàn toàn thanh lịch và phức tạp hơn một chút ... – kindofgreat

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