2013-11-27 14 views
5

Tôi đang mở một bộ URL có WebDriver bằng ruby ​​- loại trình chiếu có khoảng thời gian 3 giây giữa "trang trình bày" (trang). Người đang xem điều đó xảy ra có thể nhấp vào Không gian và tôi cần URL trang đó được lưu vào một tệp khác. Làm thế nào tôi có thể xử lý những gián đoạn - bắt sự kiện của Space ép?ruby ​​webdriver: làm thế nào để nắm bắt phím bấm trong khi kịch bản đang chạy?

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

Bạn sẽ đợi không gian ở đâu? Bạn có nghĩa là trong trình duyệt hoặc có thể dấu nhắc lệnh chạy kịch bản? –

+0

@ justin-ko: hoặc sẽ làm việc cho tôi. Tôi đã thử giải pháp được cung cấp ở đây http://stackoverflow.com/questions/946738/detect-key-press-non-blocking-wo-getc-gets-in-ruby nhưng không thể bắt bất kỳ phím nào được nhấn trong trình duyệt (không có gì xảy ra) hoặc dòng lệnh (nó sẽ hiển thị các phím đã nhấn, nhưng không có tác dụng trên tập lệnh đang chạy). – earlyadopter

Trả lời

3

Có vẻ như vấn đề của bạn có thể được giải quyết bằng STDIN.getch.

Nếu bạn tạo một tập tin với các kịch bản sau đây và sau đó chạy nó trong một dấu nhắc lệnh (ví dụ: "ruby script.rb"), kịch bản sẽ:

  1. Navigate to url.
  2. Hỏi xem url có được chụp hay không.
  3. Nếu người dùng không nhập bất cứ điều gì trong 10 giây, nó sẽ tiến hành vào url tiếp theo. Tôi đã thay đổi nó từ 3 vì nó quá nhanh. Bạn có thể thay đổi thời gian quay lại 3 giây trong dòng Timeout::timeout(10).
  4. Nếu người dùng đã nhập nội dung nào đó, nó sẽ lưu url nếu đầu vào là dấu cách. Nếu không nó sẽ bỏ qua nó và tiếp tục.

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 

Một vài lưu ý:

  • Lưu ý rằng các đầu vào cần phải được để dấu nhắc lệnh chứ không phải trình duyệt.
  • Nếu người dùng nhấn một phím trước thời gian chờ được phân bổ, tập lệnh sẽ ngay lập tức tiếp tục đến url tiếp theo.
+0

Justin, bạn có thể nghĩ ra bất kỳ cách nào để làm cho nó nói xuống mũi tên thay vì Enter để đi đến URL tiếp theo? Và - vâng, một số khóa ("s" chẳng hạn như một phím tắt để "lưu") thay vì s-Enter có thể đẹp hơn rất nhiều. Tôi có thể sẽ cần phải tìm một cách cho $ stdin để mong đợi chỉ có một khóa, và không (some_entry) + Enter. – earlyadopter

+0

Được rồi, sau khi tìm hiểu thêm, tôi tìm thấy một số thư viện cốt lõi có thể được kết hợp để làm những gì chúng ta cần (tức là không còn cần nhập khóa). Hãy thử câu trả lời cập nhật này. –

Các vấn đề liên quan