使用Capybara / Selenium Webdriver测试HTML5文件上传 – Ruby

我有一个简单的模态,其中显示用户显示浏览按钮以添加要上载的文件。 由于一个未知的问题,因此它是一个HTML5文件输入因此浏览器添加自己的function,这已成为一个痛苦的测试。

在我的页面上,我有:

 

Capybara提供开箱即用的解决方案:

  attach_file <>, <> 

在幕后执行send_keys命令将file_path推送到此输入的路径容器中,但是这对我的设置无效。 我在Windows 8上运行Firefox 25.0.1。我尝试了相对路径和该文件的完整路径,包括前向和反斜杠组合。

当我的意思是它不起作用时,我的意思是当我的ajax脚本通过点击旁边的“上传”按钮执行时,它不会在参数中发送任何文件对象。

我甚至尝试使用capybara直接发送文件路径:

  find_field(<>).native.send_keys(<>) 

接下来,是尝试使用selenium将其推入使用:

  element = driver.find_element(:id, <>) element.send_keys <> 

然后我尝试执行脚本以确保元素可见,然后设置它:

  element = page.execute_script( "document.getElementById('#{<>}').style.visibility = 'visible'; document.getElementById('#{<>}').style.height = '20px'; document.getElementById('#{<>}').style.width = '60px'; document.getElementById('#{<>}').style.opacity = 1; return document.getElementById('#{<>}')") find_field(field_locator).native.send_keys(<>) 

这也不起作用。 现在我完全卡住了。 所有这里的帮助和谷歌指向使用上述,但它只是不适用于我的设置。

我可以看到我的选择是使用Windows自动化脚本并跳出水豚,运行脚本,然后继续,或者直接从capybara使用post调用上传URL或调用当前的js ajax可以。

所以我已经解决了它,它并不太难看。 我通过AutoIT使用了自动化路线。 你用AutoIT下载的软件包包括一个脚本到exe转换器并使用下面的脚本(我不能相信脚本)我创建了一个exe:

 Local Const $dialogTitle = $CmdLine[2] Local Const $timeout = 5 Local $windowFound = WinWait($dialogTitle, "", $timeout) $windowFound = WinWait($dialogTitle, "", $timeout) Local $windowHandle If $windowFound Then $windowHandle = WinGetHandle("[LAST]") WinActivate($windowHandle) ControlSetText($windowHandle, "", "[CLASS:Edit; INSTANCE:1]", $CmdLine[1]) ControlClick($windowHandle, "", "[CLASS:Button; TEXT:&Open]") Else MsgBox(0, "", "Could not find window.") Exit 1 EndIf 

在我的水豚脚本中,我只是运行:

 find_field(<>).click system("<>\\file_upload.exe \"#{<>}\" \"File Upload\"") 

它完美无缺! 事实上,我认为我更喜欢它完全模仿用户将要做的事情。