【问题标题】:ruby webdriver: how to catch key pressed while the script is running?ruby webdriver:如何在脚本运行时捕捉按键?
【发布时间】:2013-12-13 20:14:38
【问题描述】:

我正在使用 ruby​​ 中的 WebDriver 打开一组 URL - 一种幻灯片,“幻灯片”(页面)之间的间隔为 3 秒。看到这种情况的人可能会单击 Space,我需要将该页面 URL 保存到另一个文件中。我该如何处理这些中断 - 捕捉按下 Space 的事件?

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

【问题讨论】:

  • 您希望在哪里按下空格?你的意思是在浏览器中还是在运行脚本的命令提示符下?
  • @justin-ko:两者都适合我。我尝试了stackoverflow.com/questions/946738/… 提供的解决方案,但无法捕捉到在浏览器中按下的任何键(没有任何反应)或命令行(它显示按下的键,但对脚本运行没有影响)。

标签: ruby watir-webdriver


【解决方案1】:

您的问题似乎可以通过 STDIN.getch 解决。

如果您使用以下脚本创建一个文件,然后在命令提示符下运行它(例如“ruby script.rb”),该脚本将:

  1. 导航到网址。
  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。

【讨论】:

  • 贾斯汀,你能想出什么办法让我们说向下箭头而不是 Enter 转到下一个 URL?而且 - 是的,某个键(例如“s”作为“save”的快捷方式)而不是 s-Enter 本来可以更好。我可能需要找到一种方法让 $stdin 只期望一个键,而不是 (some_entry)+Enter。
  • 好吧,经过一番挖掘,我发现了一些可以组合起来做我们需要的核心库(即不再需要回车键)。试试这个更新的答案。
猜你喜欢
  • 1970-01-01
  • 2021-10-26
  • 2012-09-21
  • 1970-01-01
  • 2013-03-12
  • 1970-01-01
  • 2011-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多