2013-11-27 16 views
5

WebDriver'a sahip bir dizi URL'yi "slaytlar" (sayfalar) arasında 3 saniyelik aralıklarla bir slayt gösterisi olarak açıyorum. Buna bakmak isteyen kişi Alan'ı tıklayabilir ve bu sayfa URL'sinin başka bir dosyaya kaydedilmesini istiyorum. Bu kesintileri nasıl halledebilirim - Space olayını yakaladım mı?ruby ​​webdriver: komut dosyası çalışırken tuşa nasıl basılır?

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

Mekanın nerede basılmasını bekliyorsunuz? Tarayıcıda mı yoksa komut dosyasını çalıştıran komut istemi mi demek istiyorsun? –

+0

@ justin-ko: ya benim için çalışacak. Burada sunulan çözümü denedim http://stackoverflow.com/questions/946738/detect-key-press-non-blocking-wo-getc-gets-in-ruby ama tarayıcıda basılan herhangi bir tuşa basamadı (hiçbir şey olmuyor) veya komut satırı (basılı tuşları gösterir, ancak komut dosyası üzerinde hiçbir etkisi olmadan). – earlyadopter

cevap

3

Sorununuz STDIN.getch ile çözülebilir gibi görünüyor. Eğer (örneğin, "yakut script.rb") aşağıdaki komut ile bir dosya oluşturmak ve daha sonra bir komut isteminde çalıştırın Eğer

, senaryo olacak: url

  1. gezinin.
  2. URL'nin yakalanması gerekip gerekmediğini sorun.
  3. Kullanıcı 10 saniyede bir şey girmezse, sonraki URL'ye devam eder. Çok hızlı olduğu için 3'ten değiştirdim. Zaman Timeout::timeout(10) satırında 3 saniyeye kadar değiştirebilirsiniz.
  4. Kullanıcı bir şey girdiyse, girdi bir boşluksa, URL'yi kaydedecektir. Aksi takdirde bunu görmezden gelir ve devam eder.

Senaryo:

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 

birkaç not: girişler komut istemine ziyade tarayıcıya olması gerektiğini

  • Not.
  • Kullanıcı ayrılan zaman aşımından önce bir tuşa basarsa, komut dosyası hemen bir sonraki URL'ye geçer.
+0

Justin, bir sonraki URL'ye gitmek için Enter yerine aşağı ok diyelim. Ve - evet, s-Enter yerine bir tuş ("s" örneğin "kaydet" için kısayol olarak) çok daha iyi olabilirdi. Muhtemelen $ stdin'in sadece bir anahtar beklemesi için bir yol bulmam gerekecek ve (Enter). – earlyadopter

+0

Tamam, biraz daha kazma işleminden sonra, ihtiyacımız olanı yerine getirmek için birleştirilebilecek bazı çekirdek kitaplıklar buldum (yani artık anahtar girmeye gerek yok). Bu güncellenmiş cevabı deneyin. –

İlgili konular