RSPEC+Capybara + poltergeist :How to send keys to windows 从浏览器打开弹出对话框

RSPEC+Capybara + poltergeist :How to send keys to windows pop up dialgue opened from browser

我想使用 Capybara 将密钥发送到 FileUpload window。 JavaScript Driver : 闹鬼。

UI : File Upload Window

click_button 'BrowseBtn'
sleep(1)
popup = page.driver.browser.window_handles.last
page.within_window(popup) do
page.find('body').native.send_key(pathToInvalidTestLicenseFile.to_s)
page.find('body').native.send_key(:Enter)
end

我不确定以下事情。 a) 如何验证单击浏览按钮后是否打开了弹出对话框?我在点击浏览按钮后截屏了,但是在截屏中浏览 window 没有出现?这是预期的吗? b) 如何验证弹出对话框是否收到密钥?

您无法send_keys进入系统文件选择对话框,您必须使用文件输入元素的标识符调用#attach_file。鉴于 html 喜欢

<input type='file' id='my_file_input' name='my_file_input>

你会做类似的事情

attach_file('my_file_input', pathToInvalidTestLicenseFile)

在你的测试中。文件字段经常出现的一个问题是它们通常隐藏在页面上,并被另一个可设置样式的元素替换。在那种情况下,您需要使用 execute_script 修改文件输入的 css 以使其在调用 attach_file 之前可见。您需要更改的 css 取决于元素的隐藏方式,但是如果它只是设置为 opacity: 0 那么类似于

page.execute_script("$('#my_file_input').css('opacity', 1);")
page.attach_file('my_file_input', pathToInvalidTestLicenseFile)

应该可以工作(假设您在页面上使用 jQuery - 如果没有则换成标准 DOM 方法)。

===========================

作为第二个问题 - 当您确实有打开另一个 window 的代码时,您应该使用类似

的方法而不是使用特定于驱动程序的方法和手动休眠
popup = window_opened_by { click_button 'BrowseBtn' }

这在这种情况下不起作用,因为您没有打开新的浏览器 window,而是触发系统对话框的打开。