【问题标题】:Access browser print popup for testing purposes访问浏览器打印弹出窗口以进行测试
【发布时间】:2019-02-27 17:13:04
【问题描述】:

我正在使用 capybara 编写端到端测试。

我的应用程序中有一个打印功能,并且想访问它的 DOM 以便在我的打印文档上声明不同的内容。

如何使用 Capybara 访问弹出式 DOM?

+断言完成后如何以编程方式关闭打印弹出窗口? Capybara好像是在执行完print方法后卡住了。

ps:我使用的是无头 Chrome。

【问题讨论】:

    标签: ruby selenium capybara e2e-testing


    【解决方案1】:

    注意:此答案仅适用于将 Selenium 驱动程序与 non-deadless chrome 一起使用,一旦您进入 shadowDOM,您只能使用 CSS 选择器,这意味着您不能使用任何涉及 Capybaras 构建的 Capybara 方法-in 选择器('fill_in'、'select' 等)。这也可能与任何版本的 Chrome 或 chromedriver 中断。

    由于 chromedriver/chrome 的工作方式,在关闭打印窗口之前,它不会从您打开打印窗口所做的任何操作返回。技术上可以通过异步触发打印窗口来解决这个问题。但是随后您会遇到这样一个问题,即大部分打印窗口都位于 WebDriver 规范当前未提供 API 的阴影 DOM 元素内。但是,您可以使用evaluate_script 解决这个问题。

    因此打开然后关闭打印窗口会是这样的

    print_window = page.window_opened_by do
      page.execute_script('window.setTimeout(function(){ window.print();}, 50)')
    end
    
    page.within_window(print_window) do
       print_app = page.find('print-preview-app')
       print_app_shadow = print_app.evaluate_script('this.shadowRoot')
       print_header = print_app_shadow.find('print-preview-header')
       print_header_shadow = print_header.evaluate_script('this.shadowRoot')
       print_header_shadow.find('.cancel-button').click
    end
    

    显然,所有这些调用都可以链接在一起,中间元素只是为了更清楚地说明正在做什么。

    【讨论】:

    • 它似乎可以在非无头 chrome 中工作,但不能在无头中工作:Capybara::WindowError: Capybara::WindowError: block passed to #window_opened_by opened 0 windows instead of 1 任何想法? @thomas-walpole
    • @user2462805 哎呀——忘记了 Chrome 在无头模式下禁用打印(部分原因是它挂起执行的方式)。您必须在浏览器可见的情况下测试此功能,或者您可以尝试使用--enable-print-browser 命令行开关注册驱动程序(显示所有页面,就像它们正在打印一样)并使用该驱动程序检查您想要检查的内容.
    • 我被无头 Chrome 卡住了。你能告诉我更多关于注册司机的信息吗?我应该如何进行?再次感谢您的帮助
    • @user2462805 要注册您自己的驱动程序,请参阅 github.com/teamcapybara/capybara#configuring-and-adding-drivers 并查看 Capybara 对其默认注册的驱动程序所做的事情 - github.com/teamcapybara/capybara/blob/master/lib/…
    • @ThomasWalpole,这个答案对我帮助很大 - 虽然我能够操作 print_window,但在 Mac 上,选择保存后会弹出一个系统对话框窗口,确认保存文档的位置不管默认值。知道如何避免系统对话窗口吗?你以前遇到过这种情况吗?截图在这里:ibb.co/j8Qsjnv
    猜你喜欢
    • 2015-05-05
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 2015-07-28
    • 1970-01-01
    • 2013-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多