Capybara due sessioni in parallello

Ciao a tutti e buon Ruby Day :), vi scrivo per un problema al momento
insormontabile per me, vorrei lanciare due sessioni in parallelo con
capybara e il driver Chrome,inserendole in due Thread differenti, ma
quando lancio il mio codice partono tutte e due contemporaneamente, ma
al momento di interagire, prosegue solo su una sessione, devo chiuderla
manualmente e parte anche l’altra, io vorrei venissere eseguite in
parallelo.

Ho fatto dei test anche lanciado due processi separati, non con i
Thread, ma si verifica lo stesso probleme.

Spero possiate aitutarmi, grazie, di seguito il codice:

Il giorno 15 giugno 2012 11:10, michele boscolo [email protected] ha
scritto:

Spero possiate aitutarmi, grazie, di seguito il codice:

Capyraba MultiThread - Pastebin.com

Posso chiederti perch vuoi farlo?
Usare i Thread nei test veramente veramente una bad practice.

Secondo me il problema con Selenium, che supporta una sola istanza alla
volta.
Prova con capybara-webkit o con zombiejs.

Ciao,

Matteo

2012/6/15 Matteo C. [email protected]:

Posso chiederti perch vuoi farlo?
Usare i Thread nei test veramente veramente una bad practice.

beh a meno di voler fare uno smoke test per qualcosa che dovrebbe
essere thread safe :slight_smile:


twitter: @riffraff
blog (en, it): www.riffraff.info riffraff.blogsome.com
work: circleme.com

Voleve farlo per velocizzare il processo, perchè sto realizando uno
spider per raccogliere dei prezzi della borsa elettrica di divesri
paesi.
Sono riuscito a raccogliere i prezzi di tutte le frontiere con
Mechanize, che ha una velocità disarmante, ma non supportando
javascript, ho provato con capybara-webkit, mi da sempre problemi con il
javascript, allora ho utilizzato capyraba con selenium(driver chrome),
quindi questo sito è il collo di bottiglia del mio programma, in quanto
a scaricare i prezzi di 7 frontiere ci mette 4 secondi, invece solo per
questo sito ci mette quasi 2 minuti, e mi dispiace.

Spero che qualcuno posso aiutarmi, oppure conoscete qualcosa come
Mechanize ma che funzioni anche con il javascript??

Grazie.

2012/6/15 michele boscolo [email protected]:

Voleve farlo per velocizzare il processo, perch sto realizando uno
spider per raccogliere dei prezzi della borsa elettrica di divesri
paesi.
Sono riuscito a raccogliere i prezzi di tutte le frontiere con
Mechanize, che ha una velocit disarmante, ma non supportando
javascript, ho provato con capybara-webkit, mi da sempre problemi con il
javascript, allora ho utilizzato capyraba con selenium(driver chrome),
quindi questo sito il collo di bottiglia del mio programma, in quanto
a scaricare i prezzi di 7 frontiere ci mette 4 secondi, invece solo per
questo sito ci mette quasi 2 minuti, e mi dispiace.

se il problema che non va in multithread, hai provato a farlo
multiprocesso?


twitter: @riffraff
blog (en, it): www.riffraff.info riffraff.blogsome.com
work: circleme.com

Ciao a tutti, grazie dei consigli, ma alla fine sono riuscito a
risolvere con capybara-webkit, ora in 13 sec. riesco a scaricare tutto,
una figata.

Scusa una curiosità, ma cosa intendevi “farlo multiprocesso”???

Per Gabriele “(fire)watir” è ottimo ho sempre usato questo per fare i
miei spider, ma è lento, perchè lavora con il browser, mentre se lavori
con mechanize o capybara, oppure fai il trace delle richieste http post,
e poi le esegui in ruby, è tutto molto più rapido, ti scrolli di dosso
la GUI, che appesantisce il tutto.

Ciao, grazie ancora.

2012/6/17 michele boscolo [email protected]:

Ciao a tutti, grazie dei consigli, ma alla fine sono riuscito a
risolvere con capybara-webkit, ora in 13 sec. riesco a scaricare tutto,
una figata.

Scusa una curiosit, ma cosa intendevi “farlo multiprocesso”???

intendevo: se c’era un problema dovuto al fatto che capybara-webkit
non funzionasse in ambiente multithread a causa di qualche stato
condiviso, potevi provare con i processi.

Ma rileggendo il thread mi sono accorto che gi avevi detto di averci
provato, sono uno scemo scusami…

Ad ogni modo, se hai identificato il problema, come hai risolto?
Cos almeno rimane nell’archivio della lista (e mis che fra un po’
servir anche a me :slight_smile:


twitter: @riffraff
blog (en, it): www.riffraff.info riffraff.blogsome.com
work: circleme.com

2012/6/16 gabriele renzi [email protected]:

questo sito ci mette quasi 2 minuti, e mi dispiace.
altra alternativa a capybara-*, forse (fire)watir?


twitter: @riffraff
blog (en, it): www.riffraff.info riffraff.blogsome.com
work: circleme.com

On Mon, Jun 18, 2012 at 9:29 AM, michele boscolo [email protected]
wrote:

Ciao, senza allegarti tutto il programma che contine abbastanza
codice,ti allego un esempio di come ho risolto il problema:

grazie, sembra ragionevole e pi o meno come avrei pensato di farlo io, a parte che pensavo di usare DRb per far comunicare i processi :)


twitter: @riffraff
blog (en, it): www.riffraff.info riffraff.blogsome.com
work: circleme.com

Ciao, senza allegarti tutto il programma che contine abbastanza
codice,ti allego un esempio di come ho risolto il problema:

Avvio.rb


pipe = IO.popen(“rubyw capyraba.rb google”,‘r’)
pipe2 = IO.popen(“rubyw capyraba.rb bing”,‘r’)
Process.wait

Capybara.rb


require ‘capybara/dsl’
require ‘capybara-webkit’

Capybara.run_server = false
Capybara.current_driver = :webkit

module Test
class Google
include Capybara::DSL

def get_results(site)
  if "google" == site
  Capybara.instance_variable_set('@app_host',"http://www.google.com/")
  visit('/')
  fill_in "q", :with => "Capybara"
  click_button "Cerca con Google"
  click_link("Wikipedia, the free encyclopedia")
  page.driver.render "mio.png"
  else
  Capybara.instance_variable_set('@app_host',"http://it.bing.com/")
  visit('/')
  fill_in "q", :with => "Rails"
  click_button "sb_form_go"
  click_link("Ruby on Rails - Wikipedia")
  page.driver.render "mio2.png"
  end
end

end
end

site = ARGV[0]
spider = Test::Google.new
spider.get_results(site)

Avevo provato a farlo multithread, ma generava errori, che vista
mancanza tempo non sono riuscito a risolvere, quindi l’ho fatto con i
processi.

Ciao.

Ciao, mi ha incuriosito quello che hai detto, mi potresti fare un
piccolo codice d’esempio su come far comunicare diversi processi tra
loro??
E poi volevo un vostro parere, su cosa sia più performante tra il
lanciare diversi processi che eseguono particolari parti di codice più
lento tipo IO lento, oppure usare i Thread oppure ancora usare un
sistema come Eventmachine che fa uso dei Fiber??

In altre parole vorrei sapere, secondo voi quale sia la strada migliore
da intraprendere per un’applicativo, con molto IO, quindi tempi d’attesa
lunghi, non mi interessa il fatto che debba gestire molte connessioni
contemporaneamente, deve solo eseguire una serie di operazioni nel minor
tempo possibile, e che dia la possibilità di gestire gli errori in caso
ce ne fossero.

Grazie a tutti ciao.

2012/6/19 michele boscolo [email protected]:

Ciao, mi ha incuriosito quello che hai detto, mi potresti fare un
piccolo codice d’esempio su come far comunicare diversi processi tra
loro??

DRb facilissimo:

server.rb

require ‘drb’

crea una classe, magari usando delle strutture dati sensate :slight_smile:

QueueManager = Struct.new :queued, :visited do
def next_url
queued.shift
end
def save url, content, new_links
p “#$0: saving visited #{url}”
visited << [url, content]
self.queued = new_links + queued
end
end

rendila distribuita

DRb.start_service nil, QueueManager.new([‘origin’], [])

stampa lo uri di bind

puts DRb.uri

#loop forever
DRb.thread.join

#client.rb
require ‘drb’

connettiti allo uri passato da command line

queue_manager = DRbObject.new nil, ARGV.shift

#implementa la tua logica
def visit url
sleep rand(5)
p “#$0: visiting #{url}”
[‘some content’, [rand.to_s, ‘new_links’]]
end

gira in eterno, invocando i metodi remoti come se fosser locali

while true
url = queue_manager.next_url
queue_manager.save(url, *visit(url))
end

Se vuoi gestire errori/retry/politeness/priority… diventa pi complicato
:slight_smile:

E poi volevo un vostro parere, su cosa sia pi performante tra il
lanciare diversi processi che eseguono particolari parti di codice pi
lento tipo IO lento, oppure usare i Thread oppure ancora usare un
sistema come Eventmachine che fa uso dei Fiber??

Evented io, quindi event machine o simili, perch rischi spesso che un
thread/processo si piombi ad aspettare su una connessione di rete, e
generalmente avere 1000+ thread o processi pesantuccio. Ma neanche
cos tanto, con i computer attuali.

In compenso non scali a pi macchine… in quel caso, N processi
fetcher tutti con event loop, e un master controller che fa
distribuzione dei task secondo me la soluzione “giusta”.

In generale la cosa che ti migliora un sacco le prestazioni mettere
una cache per il dns :slight_smile:

In altre parole vorrei sapere, secondo voi quale sia la strada migliore
da intraprendere per un’applicativo, con molto IO, quindi tempi d’attesa
lunghi, non mi interessa il fatto che debba gestire molte connessioni
contemporaneamente, deve solo eseguire una serie di operazioni nel minor
tempo possibile, e che dia la possibilit di gestire gli errori in caso
ce ne fossero.

pi connessioni rendono pi efficiente l’uso della banda, e gestire
gli errori pi facile in un single thread, single process.
Il problema se puoi farlo con le librerie che usi, e.g. se puoi
fetchare l’html con typheous e poi passarlo al motore webkit come
stringa, allora direi fai quello.


twitter: @riffraff
blog (en, it): www.riffraff.info riffraff.blogsome.com
work: circleme.com

Grazie mille per la rapida risposta, mi hai dato un ottimo spunto per
alcuni miei progetti, vorrei segnalare anche questa ottima guida all’uso
di drb, la trovo eccezionale e per di più è in italiano.

http://code.google.com/p/hackerarena/wiki/RelationWikiPage.

Inoltre mi confermi il fatto che più processi, vengono eseguiti
contemporaneamente dalle cpu, quindi viene sfruttato a pieno i
processori multicore, perchè viene usato lo schedule del so.

Ciao.