水豚 returns 附加文件时出现参数错误

Capybara returns Argument error when attach the file

我正在研究浏览器自动化并尝试使用 Capybara 软件附加文件。通过单击我的脚本应该开始上传文件,我有一个按钮。 它已经在同一个网站的一个地方为我工作,所以我正在尝试再次实施它。

我的做法:

$private_key_path = '/Users/user1/Desktop/my_file.zip'

upload_generated_zip_btn = browser.all(:element, 'material-button', text: 'Upload generated ZIP')

browser.attach_file($private_key_path) do
  upload_generated_zip_btn[0].click
end

但实际上我的脚本只是点击按钮,然后出现弹出窗口,我可以在其中手动选择文件。几秒钟后脚本失败并出现以下错误:

ArgumentError: Capybara was unable to determine the file input you're attaching to

我查看了文档和原始代码,但不明白这个问题。手动上传相同的文件是可行的。试图更改定位器 - 没有结果。

按钮代码截图:

源代码:

当使用 attach_file 的块版本时,Capybara 会附加一个用于点击 <input type="file"> 元素的侦听器,并使用它来确定要将文件附加到哪个输入。因为它没有找到它,所以它没有触发点击,或者您的代码结构方式隐藏了 Capybara 的点击。首先我会问你为什么使用 allelement 选择器类型来查找按钮而不是建议(假设浏览器是 Capybara 会话??)

browser.attach_file($private_key_path) do
  browser.find('material-button', text: 'Upload generated ZIP').click
end

很难说这是否正确,因为您实际上并没有在您的问题中为带有该文本的按钮显示 HTML。如果这仍然不起作用,那么您将需要实际定位文件输入元素并使用 attach_file 的非块版本。像

attach_file($private_key_path, make_visible: true)

或者自己先找到文件输入

browser.find('input[type="file"]', visible: false).attach_file($private_key_path, make_visible: true)

同样很难确定,因为您的 HTML 似乎并未实际显示您尝试点击的按钮。

水豚不与不可见元素互动。因此,尝试删除隐藏属性并使文件选择可见 试试这个:

selector = {Selector} # selector for material button
Capybara.current_session.execute_script("document.querySelector('#{selector}').removeAttribute('hidden')")
expect(page).to have_content(file_upload", visible: true)
page.attach_file(
            find('material-button', text: 'Upload generated ZIP'),
            Rails.root.join($private_key_path)