【问题标题】:Capybara returns Argument error when attach the fileCapybara 在附加文件时返回参数错误
【发布时间】:2021-10-20 15:30:13
【问题描述】:

我正在研究浏览器自动化并尝试使用 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

我查看了文档和原始代码,但不明白问题所在。手动上传相同的文件有效。尝试更改定位器 - 没有结果。

按钮代码截图:

源代码:

【问题讨论】:

    标签: ruby capybara browser-automation


    【解决方案1】:

    当使用 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 似乎并未真正显示您尝试单击的按钮。

    【讨论】:

    • 您好,我更新了按钮 HTML 的图片。这不是输入字段,这就是我使用块版本的原因。我使用“全部”是因为 Capybara 找到了 2 个这种类型的按钮(我尝试了不同的选择器,仍然是 2 个按钮)。浏览器是 Capybara 会话。此外,如果我在 attach_file 块中放置一个撬动并尝试在控制台中手动单击按钮 - 它会单击它并打开一个对话框,我可以在其中选择文件。但这不会自动发生
    • 如果使用内联方法(例如您的第 2/3 个示例),我将无法找到在 #<:node::element tag="material-button 中未禁用的文件字段 nil " path="/HTML/BODY[1]/........."> (Capybara::ElementNotFound)
    • @NikitaBasharkin - 正确,input type="file" 元素不在material-button 元素中。从这个错误中,我假设您正在使用 within(...) 来确定范围(未在您的问题中显示) - 将范围更改为包含输入元素的 key-file-picker-section 元素
    【解决方案2】:

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

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-10
      • 2017-07-16
      • 2014-09-14
      • 1970-01-01
      • 1970-01-01
      • 2020-12-04
      • 1970-01-01
      相关资源
      最近更新 更多