Ruby-Selenium WebDriver 3.142.6: Unable to upload file due to "Selenium::WebDriver::Error::UnknownCommandError:"

Ruby-Selenium WebDriver 3.142.6: Unable to upload file due to "Selenium::WebDriver::Error::UnknownCommandError:"

无法在 Ruby

中使用 selenium-webdriver (3.142.6) gem 上传文件

技术栈:

selenium-webdriver (3.142.6)

Chrome Version : 77

Chrome driver: 77

错误信息:

Selenium::WebDriver::Error::UnknownCommandError: unknown command: unknown command: session/xxxsession_idXXX/se/file
Backtrace:
       Ordinal0 [0x00FDEB13+1501971]
       Ordinal0 [0x00F5F6D1+980689]
        Ordinal0 [0x00EE765F+489055]
        Ordinal0 [0x00E9618E+156046]
        Ordinal0 [0x00E95FF4+155636]
        Ordinal0 [0x00E7220E+8718]
  Ordinal0 [0x00E72626+9766]
  Ordinal0 [0x00E72C10+11280]
 Ordinal0 [0x00F78F37+1085239]
       GetHandleVerifier [0x0107D7ED+503293]
       GetHandleVerifier [0x0107D580+502672]
       GetHandleVerifier [0x010846AC+531644]
       GetHandleVerifier [0x0107DFFA+505354]
       Ordinal0 [0x00F70606+1050118]
       Ordinal0 [0x00F7047F+1049727]
       Ordinal0 [0x00E7204B+8267]
  Ordinal0 [0x00E71D7C+7548]
  GetHandleVerifier [0x013CD83C+3976780]
      BaseThreadInitThunk [0x755738F4+36]
 RtlUnicodeStringToInteger [0x77375E13+595]
  RtlUnicodeStringToInteger [0x77375DDE+542]

此版本 gem 的上传似乎已中断。

用于上传文件的代码(watir with cheezy)

@browser.file_field(xpath: "//*[contains(text(), 'Upload')]/input[@type='file']").set(complete_path_to_file)

根本原因: w3c 浏览器功能状态

解释:w3c:true selenium webdriver 抛出这个错误。这可能是因为 Selenium 3 不完全支持 w3c 实现。

解决方案 1: 如果您没有任何基于 w3c 功能的依赖项,那么简单的解决方案是 w3c:false

解决方案 2: 如果解决方案 1 不起作用,则必须更新 selenium-webdriver-3.142.6\lib\selenium\webdriver\remote\w3c\commands.rb 文件。检查下面的行然后更新它。

upload_file: [:post, 'session/:session_id/se/file']

将此行更新为

upload_file: [:post, 'session/:session_id/file']

结论: 在推出 Selenium 4 之前更喜欢解决方案 1。如果您使用解决方案 2,当您尝试在未推送此更改的机器上 运行 时,可能会测试失败/文件可能会被 bundle install 设置回原位。

你可以用直接的方法来解决,但我个人觉得太多了。

已将解决方案发布到SeleniumHQ,得到确认后将提交Pull Request到SeleniumHQ。这样你就不会在更高版本的 Selenium Ruby WebDriver 中遇到这个问题。