处理在keyup事件上发生的javascript弹出窗口

时间:2011-11-17 08:22:14

标签: ruby watir watir-webdriver

我在HTML页面上有一个文本字段,用于检查您是否输入了1到365之间的值。如果用户输入的值无效,如非数字字符或不在范围内的值,它显示了一个弹出窗口。我在watir wiki上看到有一个select_no_wait方法,用于在从列表中选择无效值时关闭弹出窗口。

处理keyup事件时弹出窗口的好方法是什么?我是否需要按照select_no_wait方法的方式继续执行,或者我们是否可以启动一个不同的进程来解除调用set方法时可能出现的弹出窗口。

在Javascript中带有验证功能的HTML文件的示例示例如下:

<html>
<head>
<script type="text/javascript">
var num = 0
function validate(e)
{
 var charPressed = String.fromCharCode(e.keyCode);
if(charPressed >= '0' && charPressed<= '9')
{
  num = parseInt(document.getElementById('foo').value);
   if ((document.getElementById('foo').value).length <= 3 && (num > 365 || num==0))
    alert ("Values can only be from to 1 to 365");
    }
  else
  {
  alert("Invalid character entered");
  document.getElementById('foo').value = "";
  }
}
</script>
</head>
<body>
<label id="code"> Sample </label>
<input type="text" id ="foo" onkeyup="validate(event)" maxLength="3"/>
</body>
</html>

我真的很感激关于这个问题的任何指示。提前谢谢。

2 个答案:

答案 0 :(得分:9)

对于Watir:

目前有一些操作正在等待页面加载,例如.click.select,因为在执行此类操作后,页面通常会通过回发或表单发布更新。这些变体存在_no_wait变体,作为一种告诉脚本继续运行的方法,而不会在弹出窗口时等待页面加载。

目前.set没有等待页面加载逻辑(据我所知),因此没有_no_wait方法的变体。所以你可以直接从设置值开始,到寻找弹出窗口。

请注意,如果在使用.set后没有看到弹出窗口,则可能需要触发'onkeyup'事件以触发客户端脚本。还要确定它真的是一个JS弹出窗口,还有很多其他方法可以做一些看起来像JS弹出窗口的东西,但实际上只是像div这样的东西等。

由于这是Javascript Popup,您应该能够通过与Watir Wiki

中的示例类似的代码摆脱它
browser.javascript_dialog.button('OK').click


对于Watir-Webdriver:

如果您使用的是Watir-Webdriver,那么事情会有所不同。 我将在此处详细介绍,因为此信息不太容易获得(还)

Webdriver有一个Alerts API,而Watir-Webdriver有一个警报帮助器,它使用它,有几种不同的方法来处理各种风格的javascript弹出窗口。这些方法在主要的watir类下RDoc for watir-webdriver寻找'alerthelper'中描述。这些是那里给出的例子。

require "watir-webdriver/extensions/alerts"   #add to require section at top of script)

browser.alert do
  browser.button(:value => "Alert").click
end #=> "the alert message"

browser.confirm(true) do
  browser.button(:value => "Confirm").click
end #=> "the confirm message"

browser.prompt("hello") do
  browser.button(:value => "Prompt").click
end #=> { :message => "foo", :default_value => "bar" }

请注意,这些示例非常直接来自alerthelper代码的rspec测试。因此,如果不了解这一特定的细节,它们可能对您没有任何意义。 循环中的click方法是使警报显示的操作。测试网页有三个按钮,其值为Alert,Confirm,Prompt,这会导致弹出窗口显示为针对该页面运行的测试

要在代码中使用这些东西,请用脚本中的任何操作替换该中间行导致弹出窗口。例如,在我的一个脚本中,我单击一个按钮删除用户的信用卡,弹出一个确认对话框。所以我的代码最终看起来像这样(请注意,此代码适用于watir和watir-webdriver,$ webdriver设置为true或false,具体取决于使用的是什么。

if $webdriver #watir-webdriver
  $browser.confirm(true) do
    $browser.div(:id => 'credit_cards').link(:text =>'Delete').click
  end 
else #watir
  $browser.div(:id => 'credit_cards').link(:text =>'Delete').click_no_wait
  $browser.javascript_dialog.button('OK').click
end

在每个例子中,'结束'之后的评论是什么?如果将循环的输出分配给变量

,那就是你得到的
confirm_message = browser.confirm(true) do
  browser.link(:text => "Add Lasers").click
end 

puts confirm_message
> "do you really want to put lasers on sharks?"

答案 1 :(得分:0)

我发现将browser.javascript_dialog.button('OK').click命令包含在sleep(3) do中,可以帮助快速浏览器完成命令。