Capybara Selenium 导航到 URL 在 Safari 上挂起弹出警报

Capybara Selenium Navigate To URL Hangs With Popup Alert on Safari

在我的测试结束时,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 上导航命令挂起,我认为是因为弹出窗口。有人知道这个的解决方法吗?

您可以尝试这样确认,我认为这应该可以跨浏览器工作

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

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

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

有办法,但并不容易,而且没有人做到。

您需要使用 Cocoa。

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

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

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