【问题标题】:Handling a javascript popup occurring on a keyup event处理发生在 keyup 事件上的 javascript 弹出窗口
【发布时间】:2011-12-31 03:10:07
【问题描述】:

我在 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>

我非常感谢有关此问题的任何指示。提前致谢。

【问题讨论】:

  • 就在我的脑海中,我敢打赌,如果用户输入一个 4 位(或更多)位的数字,其中前三位数字小于 366,验证将无法发出警报。例如如果您输入 1111 或 2222 或 3651
  • 查克文本字段只接受 3 个字符,这就是我使用 maxLength = 3 属性的原因
  • 因此,如果您认为该值永远不会超过三位数,那么为什么要检查长度
  • 我的安全测试人员也想问“你也有服务器端验证对吗?因为从安全角度来看,客户端验证只是为了让你的客户更轻松,你永远不应该相信它可以保护您免受攻击者的攻击,这些攻击者只需几个心跳就可以绕过它。”
  • Chuck,是的,我们有服务器端验证。我只是想提出一个小例子。 length

标签: ruby watir watir-webdriver


【解决方案1】:

对于瓦提尔:

目前有一些操作正在等待页面加载,例如.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 弹出窗口。这些方法在 RDoc for watir-webdriver 中描述,在主 watir 类下查找“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?"

【讨论】:

  • Chuck 我观察到的行为是无效字符串。如果我使用 set 方法输入“abc”,它将输入 a,弹出窗口被触发 [我手动关闭它],输入 b,弹出窗口被触发并手动关闭,然后继续。因此,它正在发生一种走走停停的互动。
  • 这就是您所期望的。在验证弹出窗口是否存在之前,我不确定是否有尝试输入多个无效字符的测试用例。除非你想一次做一个角色
  • 嗯,正在生成一个弹出窗口。我需要一种方法来消除它。但本质上,如果我们有超过 1 个无效字符,则对 set 的调用是阻塞的。因此,我想知道如何关闭弹出窗口。在调用 set 方法之前,我正在考虑在不同的进程中启动弹出解除脚本。沿着这些思路思考是否正确?
  • 谢谢。您对确认、警报、提示块中的命令应该是产生 JS 弹出窗口的命令的解释对我帮助很大。
  • 是的,我把头撞在墙上一段时间试图让它工作,然后当我看到测试在做什么时决定“好的时候去看测试”突然间一切都变得有意义了。验证测试作为文档有效,但您不应该逐字复制测试代码并将其(无上下文)作为如何做某事的示例。在测试的上下文中,您可以看到正在测试的页面,内部命令是有意义的,除此之外,它很容易被解释为不会改变的静态代码。
【解决方案2】:

我发现将browser.javascript_dialog.button('OK').click 命令包装在sleep(3) do 中有助于快速浏览器完成命令。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 2014-01-24
    • 2015-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多