2013-11-27 24 views
5

私はRubyでWebDriverを使って一連のURLを開きます - スライドの種類(ページ)の間隔は3秒です。そのことを見ている人はスペースをクリックするかもしれません。そのページURLを別のファイルに保存する必要があります。どのように私はそれらの中断を処理することができます - 宇宙プレスのイベントをキャッチ?ruby​​ webdriver:スクリプトの実行中にキーを押さえる方法

require "watir-webdriver" 

urls = [...list of URLs here...] 
saved = [] 

b = Watir::Browser.new 

urls.each do |url| 
    b.goto url 
    sleep(3) 

    # ...what should I put here to handle Space pressed? 

    if space_pressed 
    saved << b.url 
    end 
end 
+0

ここで、スペースを押したいと思いますか?ブラウザで、あるいはスクリプトを実行しているコマンドプロンプトを意味しますか? –

+0

@ justin-ko:どちらも私のために働くでしょう。私はここで提供されたソリューションを試しましたhttp://stackoverflow.com/questions/946738/detect-key-press-non-blocking-wo-getc-gets-in-rubyしかし、ブラウザで押されたキーをキャッチすることができませんでした(何も起こりません)またはコマンドライン(押されたキーを表示しますが、実行中のスクリプトには影響しません)。 – earlyadopter

答えて

3

STDIN.getchで問題が解決する可能性があります。

次のスクリプトを使用してファイルを作成し、コマンドプロンプト(例えば「ルビーscript.rb」)でそれを実行すると、スクリプトます:

  1. 移動したURLへ。
  2. URLを取得する必要があるかどうかを確認します。
  3. ユーザーが10秒以内に何も入力しない場合は、次のURLに進みます。私はそれが速すぎるので3から変更しました。あなたは、Timeout::timeout(10)の行で3秒に時間を戻すことができます。
  4. ユーザーが何かを入力した場合は、入力がスペースの場合はURLが保存されます。それ以外の場合は無視して移動します。

スクリプト:

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 

ノートのカップル:入力は、コマンドプロンプトではなく、ブラウザにする必要があること

  • 注意。
  • 割り当てられたタイムアウト前にユーザーがキーを押すと、スクリプトはただちに次のURLに進みます。
+0

ジャスティン、次のURLに行くためにEnterの代わりに下矢印を言うようにする方法はありますか?そして、はい、s-Enterの代わりに、あるキー(「s」、たとえば「save」のショートカットとして)はずっと良いかもしれません。おそらく$ stdinが(some_entry)+ Enterではなく、ただ一つのキーを期待する方法を見つける必要があります。 – earlyadopter

+0

もう少し掘り下げた後、私たちが必要としている(つまりキーを入力する必要がない)ために組み合わされるコアライブラリがいくつか見つかりました。この更新された回答を試してください。 –

関連する問題