2013-11-27 6 views
5

Ich öffne eine Reihe von URLs mit einem WebDriver in Ruby - eine Art Diashow mit 3 Sekunden Intervallen zwischen "Folien" (Seiten). Die Person, die auf dieses Ereignis schaut, könnte auf Space klicken und ich brauche diese Seiten-URL in einer anderen Datei gespeichert. Wie könnte ich mit diesen Unterbrechungen umgehen - fangen Sie das Ereignis von Space gedrückt?Ruby-Webdriver: Wie wird die Taste gedrückt, während das Skript ausgeführt wird?

+0

Wo würden Sie erwarten, dass der Raum gepresst wird? Meinst du in dem Browser oder vielleicht der Eingabeaufforderung, das Skript auszuführen? –

+0

@ Justin-Ko: entweder wird für mich arbeiten. Ich versuchte die hier angebotene Lösung http://stackoverflow.com/questions/946738/detect-key-press-non-blocking-wo-getc-gets-in-ruby, konnte aber keine im Browser gedrückten Tasten fangen (nichts passiert) oder Befehlszeile (es zeigt gedrückte Tasten, aber ohne Auswirkung auf das Skript läuft). – earlyadopter

Antwort

3

Ihr Problem könnte mit STDIN.getch lösbar sein.

Wenn Sie eine Datei mit dem folgenden Skript erstellen und sie dann in einer Eingabeaufforderung (zB „Rubin script.rb“), wird das Skript:

  1. Navigieren Sie zu der URL.
  2. Fragen Sie, ob die URL erfasst werden soll.
  3. Wenn der Benutzer innerhalb von 10 Sekunden nichts eingibt, wird mit der nächsten URL fortgefahren. Ich habe es von 3 geändert, da es zu schnell war. Sie können die Zeit in der Zeile Timeout::timeout(10) auf 3 Sekunden zurücksetzen.
  4. Wenn der Benutzer etwas eingegeben hat, wird die URL gespeichert, wenn es sich bei der Eingabe um ein Leerzeichen handelt. Sonst ignoriert es es und geht weiter.

Script:

require "watir-webdriver" 
require 'io/console' 
require 'timeout' 

urls = ['www.google.ca', 'www.yahoo.ca', 'www.gmail.com'] 
saved = [] 

b = Watir::Browser.new 

urls.each do |url| 
    b.goto url 

    # Give user 10 seconds to provide input 
    puts "Capture url '#{url}'?" 
    $stdout.flush 
    input = Timeout::timeout(10) { 
    input = STDIN.getch 
    } rescue '' 

    # If the user's input is a space, save the url 
    if input == ' ' 
    saved << b.url 
    end 
end 

p saved 

Ein paar Anmerkungen:

  • Beachten Sie, dass die Eingaben an der Eingabeaufforderung sein müssen, anstatt den Browser.
  • Wenn der Benutzer vor dem zugewiesenen Zeitlimit eine Taste drückt, fährt das Skript sofort mit der nächsten URL fort.
+0

Justin, könntest du dir irgendeinen Weg vorstellen, wie wir sagen können, dass wir einen Abwärtspfeil anstelle von Enter drücken, um zur nächsten URL zu gelangen? Und - ja, ein einzelner Schlüssel ("s" zum Beispiel als Abkürzung für "save") anstelle von s-Enter hätte so viel schöner sein können. Ich werde wahrscheinlich einen Weg finden müssen, damit $ stdin nur einen Schlüssel erwartet und nicht (some_entry) + Enter. – earlyadopter

+0

Okay, nach etwas mehr Graben habe ich einige Kernbibliotheken gefunden, die kombiniert werden können, um das zu tun, was wir brauchen (dh nicht mehr Enter-Schlüssel). Versuchen Sie diese aktualisierte Antwort. –

Verwandte Themen