【问题标题】:Capybara Selenium Navigate To URL Hangs With Popup Alert on SafariCapybara Selenium 导航到 URL 挂起并在 Safari 上弹出警报
【发布时间】:2016-02-28 22:24:11
【问题描述】:

在我的测试结束时,Capybara 会自动导航到“about:blank”,以便设置下一个测试。有时,如果用户离开页面(这是预期的),我正在测试的应用程序会引发弹出警报。我有一些代码来处理这个:

  begin
    page.driver.browser.navigate.to("about:blank")
    page.driver.browser.switch_to.alert.accept
  rescue Selenium::WebDriver::Error::NoAlertPresentError
    # No alert was present. Don't need to do anything
  end

这在 Firefox、Chrome 和 IE 上运行良好。但是由于某种原因,在 Safari 上导航命令挂起,我认为是因为弹出窗口。有人知道解决方法吗?

【问题讨论】:

    标签: selenium rspec safari capybara safaridriver


    【解决方案1】:

    目前在任何版本的 Selenium 语言绑定中都没有简单的解决方法。这是 Selenium 团队没有兴趣解决的已知问题。从根本上说,这是由于 Safari 的架构以及 Safari 驱动程序的架构造成的。

    Safari 驱动程序扩展的 JavaScript 不知道大多数显示为模态 Cocoa 层窗口的警报、弹出窗口和对话框。 它也无法与他们互动。

    有一种方法,但并不容易,而且没人做过。

    你需要使用 Cocoa。

    所以在这种情况下你会想要使用 RubyCocoa。 (或 PyObjC,如果你使用 Python) 然后,您可能还想要一个实际用 Objective-C 编写的 sidecar 应用程序。 诀窍是使用 AX(可访问性 API)和一个单独的进程来观察是否存在作为前窗口的警报,并戳它的标签和按钮的文本,以使 AX API 可见。 AX API 可能通过 ScriptingBridge 在 RubyCocoa 中公开。 但是,您需要将您的“应用程序”添加到安全首选项窗格的允许控制计算机的列表中。

    这样,您就可以检测到窗口并处理它。

    它在网站上可能相当脆弱,但如果构建良好,您可以处理预期的情况。

    【讨论】:

      【解决方案2】:

      您可以尝试这样确认,我认为它应该可以跨浏览器使用

      # click ok to confirm
      page.evaluate_script('window.confirm = function() { return true; }')
      

      【讨论】:

      • 感谢您的建议,但这不适用于这种情况:(我可以在导航命令之前运行它(因为警报尚不存在,它什么也不做)或者我可以运行它在导航命令之后(因为导航挂起而永远无法到达)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多