2013-03-03 10 views
6

Ho scritto diverse classi che governano il modo in cui voglio gestire diversi siti web, con metodi simili in entrambi (ad es. Login, aggiornamento). Ogni classe apre la propria istanza del browser WATIR.Fili di rubino con Watir

class Site1 
    def initialize 
     @ie = Watir::Browser.new 
    end 
    def login 
     @ie.goto "www.blah.com" 
    end 
end 

un esempio di codice nella principale senza fili è il seguente

require 'watir' 
require_relative 'site1' 

agents = [] 
agents << Site1.new 

agents.each{ |agent| 
    agent.login 
} 

Questo funziona bene, ma doesnt spostare sulla linea successiva finché quella corrente ha terminato il login. Vorrei incorporare il multithreading per gestire questo, ma non riesco a farlo funzionare.

require 'watir' 
require_relative 'site1' 

agents = []; threads = [] 
agents << Site1.new 


agents.each{ |agent| 
    threads << Thread.new(agent){ agent.login } 
} 

threads.each { |t| t.join } 

questo mi dà l'errore: la proprietà sconosciuta o il metodo: navigate. Codice errore HRESULT: 0x8001010e. L'applicazione ha chiamato un'interfaccia che è stata sottoposta a marshalling per un thread diverso.

qualcuno sa come risolvere questo problema o come implementare una funzionalità simile?

+1

Sembra che si tratti di un bug in watir-classic o in una delle librerie che utilizza. Il problema non si verifica quando si usa watir-wedriver con firefox. –

+0

grazie justin, sembra che tu abbia ragione. funziona bene con watir-webdriver quindi immagino sia solo un baco con watir-classic. – cubesnyc

risposta

0

Non proprio sicuro su questo, ma qui c'è uno swing utilizzando i thread.

require 'thread' 
    threads = []    # Setting an array to store threaded commands 
    c_thread = Thread.new do # Start a new thread 
    login      # Call our command in the thread 
    end 
    threads << c_thread