2014-11-11 22 views
5

Mam ten prosty przykład:otwarcia kilka wątków z wynikami Watir-webdriver w „Connection refused” błąd

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} 

każdym razem, kiedy uruchomić ten skrypt, dostaję

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

lub jeden z Przeglądarki zamykają się nieoczekiwanie na co najmniej jednym z wątków.

z drugiej strony, jeśli ustawię sleep 2 na końcu każdego cyklu pętli, wszystko działa płynnie! Każdy pomysł, dlaczego tak jest?

Musi być coś związane z zrozumienia, jak działają wątki ...

Odpowiedz

5

jesteś w zasadzie tworzenia sytuacji wyścigu między instancjami przeglądarki, aby połączyć się z otwartego portu Watir-webdriver jest znalezienie. W tym przypadku twoje pierwsze wystąpienie przeglądarki widzi, że port 9517 jest otwarty i łączy się z nim. Ponieważ równolegle kręcisz te wystąpienia, twoja druga instancja również uważa, że ​​port 9517 jest otwarty i próbuje się połączyć. Ale oops, ten port jest już używany przez pierwszą instancję przeglądarki. Właśnie dlatego otrzymujesz ten konkretny błąd.

Wyjaśnia to również, dlaczego ten problem rozwiązuje problem sleep 2. Pierwsza instancja przeglądarki łączy się z portem 9517, a uśpienie powoduje, że druga instancja przeglądarki widzi, że pobrano 9517. Następnie łączy się na porcie 9518.

EDIT

Można zobaczyć, jak to jest realizowane z Selenium::WebDriver::Chrome::Service#initialize (here), który wzywa Selenium::WebDriver::PortProber (here). PortProber to sposób, w jaki webdriver określa, który port jest otwarty.

+0

Dziękuję. Teraz jest jasne. – MichaelR

+0

Tak więc mam podobne sytuacje podczas przeszukiwania stron internetowych i kiedy wyrzucam na to zbyt wielu pracowników, zaczynam otrzymywać te same błędy. Czy istnieje sposób "ochrony" początkowego połączenia między przeglądarką a otwartym portem, aby było to zapewnione? Wolniejsze nie jest problemem, ale spanie nie działa, gdy mam gigantyczną kolejkę, a ilość czasu potrzebnego do wykonania każdego zadania jest nieco przypadkowa. Nieuchronnie, wpadnę w ten problem ... – kindofgreat

+0

zgaduję, że mogę zachować otwarte przeglądarki i przechodzić do nowych adresów URL, intsead otwierania i zamykania instancji przeglądarki dla każdego adresu URL. Tak więc mógłbym mieć określoną liczbę równoczesnych pracowników, powiedzmy 10, i mieć wystarczająco długi okres snu między tymi 10, aby zacząć wszystko, a następnie pracownicy są przypadkami w obrębie tych dziesięciu pracowników. Nie tak elegancka i nieco bardziej skomplikowana w skali ... – kindofgreat