访问浏览器打印弹出窗口以进行测试

时间:2019-02-27 17:13:04

标签: ruby selenium capybara e2e-testing

我正在使用水豚来编写端到端测试。

我的应用程序内部具有打印功能,并且想要访问其DOM以便在打印的文档中声明不同的内容。

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

+断言后,如何以编程方式关闭打印弹出窗口?执行打印方法后,水豚似乎卡住了。

popup dom

ps:我正在使用无头Chrome。

1 个答案:

答案 0 :(得分:1)

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

由于chromedriver / chrome的工作方式,在关闭打印窗口之前,它不会从打开打印窗口的操作中返回。从技术上讲,可以通过异步触发打印窗口来解决此问题。但是随后您遇到了一个问题,即大多数打印窗口都位于Web驱动程序规范当前不提供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

很显然,所有这些调用都可以链接在一起,仅将中间元素拼写清楚,以便更清楚地了解正在执行的操作。