我正在使用水豚来编写端到端测试。
我的应用程序内部具有打印功能,并且想要访问其DOM以便在打印的文档中声明不同的内容。
如何使用Capybara访问弹出式DOM?
+断言后,如何以编程方式关闭打印弹出窗口?执行打印方法后,水豚似乎卡住了。
ps:我正在使用无头Chrome。
答案 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
很显然,所有这些调用都可以链接在一起,仅将中间元素拼写清楚,以便更清楚地了解正在执行的操作。