【问题标题】:Does Watir-Webdriver support clicking on links where the destination is a javascript?Watir-Webdriver 是否支持单击目标为 javascript 的链接?
【发布时间】:2012-11-13 16:12:19
【问题描述】:

我是 Ruby 和 Watir-Webdriver 的新手。我有一套用 VBScript 编写的网站自动化套件,我想将其转换为 Ruby/Watir,因为我现在必须支持 Firefox。我发现我真的很喜欢 Ruby,而且我正在开发 Watir,但我花了一个星期的时间试图让 Webdriver 甚至显示我的登录屏幕。

该网站以带有“我同意”区域的“警告屏幕”开头。用户单击我同意并显示登录屏幕。

<body onload="showMessage('true')"><div id="login"><div id="message"><map name="accept">

<area href="javascript:showLogin();" shape="rect" coords="280,390,384,432" />

</map></div></div></body>

我需要单击该区域以显示登录屏幕(这是同一页面,实际上是一个表单,只是隐藏了)。我整天都在用 VBScript 做这个:

objExplorer.Document.GetElementsByTagName("area")(0).click

但是,使用 Watir-Webdriver,browser.area(:index, 0).click 什么都不做。

puts browser.area(:index, 0).shape
=>RECT

puts browser.area(:index, 0).coords
=>280,390,384,432

所以,我知道脚本可以“看到”区域元素并读取其属性。它只是对点击事件没有任何作用。

如果我在 href 本身上使用 browser.goto:

browser.goto("javascript:showLogin();")

登录变得可见,但我无法与元素交互(设置用户名和密码的文本字段)。我正在查看打开了开发人员工具窗口(以查看 HTML)的页面,它只是显示“正在加载...”。

这就是我卡住的地方。有趣的是,如果我使用登录表单的名称并执行以下操作:

browser.form(:name, "LoginForm").submit

我从表单中得到了用户名和密码为空的弹窗信息,所以还是有一些交互的。

当然,如果我手动输入用户名/密码,即使显示“正在加载...”,我也可以正常提交表单。

我了解“when_present.click”和其他等待浏览器的技巧;这些不起作用。我的困境是我无法点击该区域,如果我在 javascript 上使用 goto,浏览器就会忽略来自 Watir 的自动化。

感谢您的帮助。即使是“对不起,Watir 或 Webdriver 不会这样做”的答案我也可以接受。这将使我能够继续前进并寻找其他解决方案。

在 cmets 问题后编辑:

对不起,这个网站不是公开的,所以我不能发布链接。 至于在 Firefox 中工作,脚本工作得很好。 IE 有这个问题。 cmets 让我想到:第一次导航到该站点时,我确实收到“...证书不是由受信任的...”颁发的证书错误。在提交表单之前,我在 IE 中遇到的证书错误是否会导致某种与自动化断开连接?我使用我在 stackoverflow 上得到的一行来点击证书错误:

browser.goto("javascript:document.getElementById('overridelink').click()")

但现在我认为这可能是问题的一部分。我已经转到我的 IE(使用 IE 9)选项并取消选中用于检查证书的安全选项,但无济于事。如果这可能导致问题,我将不得不与基础架构团队协商生成证书,以便我们在每次构建新服务器时下载。

【问题讨论】:

  • 网站是公开的吗?链接到它会有所帮助。
  • 似乎支持。使用 Watir-Webdriver,单击带有href = "javascript:alert('test');" 的区域会按预期创建警报。也许您看到一些浏览器兼容性问题?例如,href = "javascript:alert();"(注意没有传递给 alert() 的参数),在 IE 中将显示没有消息的警报,而在 Firefox 中它什么也不做。在 Firefox 中手动单击该区域是否按预期工作?

标签: ruby watir watir-webdriver


【解决方案1】:

好的,我想在阅读了数百篇帖子和数小时的 Google 搜索后,我终于找到了解决问题的方法:browser.execute_script。

browser.execute_script("showLogin();")

就这么简单。使用 browser.goto 在加载页面时挂起并且 webdriver 超时。使用 execute_script 效果很好!

【讨论】:

  • 不错!我一直在寻找这样的东西。感谢您发布您的解决方案,我不知道.execute_script
猜你喜欢
  • 2011-08-13
  • 1970-01-01
  • 2011-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多