2013-11-27 30 views
5

我用ruby中的WebDriver打開一組網址 - 類似於幻燈片(幻燈片)(頁面)之間有3秒間隔的幻燈片放映。看到這種情況的人可能會點擊空間,我需要將該頁面網址保存到另一個文件。我怎麼能處理這些中斷 - 趕上空間事件的壓力?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秒內沒有輸入任何內容,則會進入下一個網址。由於速度太快,我將它從3改爲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?並且 - 是的,某個鍵(例如「s」作爲「保存」的快捷鍵)而不是s-Enter本來可以更好。我可能需要爲$ stdin找到一種方法來期望只有一個鍵,而不是(some_entry)+ Enter。 – earlyadopter

+0

好的,經過一番更深入的挖掘,我發現了一些可以組合起來做我們需要的核心庫(即不再需要輸入密鑰)。試試這個更新的答案。 –

相關問題