【发布时间】:2019-02-27 17:13:04
【问题描述】:
我正在使用 capybara 编写端到端测试。
我的应用程序中有一个打印功能,并且想访问它的 DOM 以便在我的打印文档上声明不同的内容。
如何使用 Capybara 访问弹出式 DOM?
+断言完成后如何以编程方式关闭打印弹出窗口? Capybara好像是在执行完print方法后卡住了。
ps:我使用的是无头 Chrome。
【问题讨论】:
标签: ruby selenium capybara e2e-testing
我正在使用 capybara 编写端到端测试。
我的应用程序中有一个打印功能,并且想访问它的 DOM 以便在我的打印文档上声明不同的内容。
如何使用 Capybara 访问弹出式 DOM?
+断言完成后如何以编程方式关闭打印弹出窗口? Capybara好像是在执行完print方法后卡住了。
ps:我使用的是无头 Chrome。
【问题讨论】:
标签: ruby selenium capybara e2e-testing
注意:此答案仅适用于将 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
显然,所有这些调用都可以链接在一起,中间元素只是为了更清楚地说明正在做什么。
【讨论】:
Capybara::WindowError: Capybara::WindowError: block passed to #window_opened_by opened 0 windows instead of 1 任何想法? @thomas-walpole
--enable-print-browser 命令行开关注册驱动程序(显示所有页面,就像它们正在打印一样)并使用该驱动程序检查您想要检查的内容.