【问题标题】:How to upload a file through the input tag using Selenium Safari and Python如何使用 Selenium Safari 和 Python 通过输入标签上传文件
【发布时间】:2020-07-15 14:31:56
【问题描述】:

我有一个适用于 chrome 和 firefox 的 selenium 脚本。我需要添加对 safari (13) 的支持。这是通过 LambdaTest 工作的硒网格。

我遇到了 Safari 文件上传问题。以下是适用于其他浏览器的代码:

file_input = self.driver1.find_elements_by_css_selector("input[type='file']")[0]
time.sleep(2)
file_input.send_keys(DIR_PATH + r"/snap1.jpg")
time.sleep(2

使用 safari 我收到以下错误消息:

selenium.common.exceptions.InvalidArgumentException: Message: One or more files could not be selected.

此错误源于 send_keys() 行。 DIR_PATH 定义为 os.path.dirname(os.path.realpath(__file__))snap1.jpg 是一个 jpg 文件,与我的 selenium 测试位于同一目录中。

我无法找到有关此特定错误的任何信息。有什么建议吗?

【问题讨论】:

标签: python selenium safari selenium-grid safaridriver


【解决方案1】:

此错误消息...

selenium.common.exceptions.InvalidArgumentException: Message: One or more files could not be selected.

...暗示 SafariDriver 无法将字符序列发送到 <input> 字段。


深入研究

@jmleyba 在他的comment 中明确提到:

SafariDriver 是在 JS 中实现的,没有操作元素所需的权限。因此,SafariDriver 不支持文件上传。

@jmleyba 进一步在另一个comment 中添加:

您不能设置<input type="file"> 元素的值(浏览器应上传的文件的路径)。该行为当前未定义。 SafariDriver 可能会在元素上生成一系列关键事件,但没有明显的效果。当目标是文件元素时,我们可能会产生错误。

但是 @mangaroo 提出了一种解决方法:

我想对于那些真正想为 SafariDriver 进行文件上传的人来说,解决方法不是通过 SafariDriver 本地进行,而是使用外部代码库通过 HTTP/HTTPS (POST) 请求执行上传(结合任何其他表单数据除了正在上传/发送的文件),然后获取响应并检查上传是否成功,然后返回 SafariDriver 代码并导航到下一页以检查上传成功与否,和/或从那里继续下一个自动化步骤。

这种方法类似于使用外部 HTTP 请求的文件下载方法,在 WebDriver 和 Selenium 用户 Google 组的各种帖子中都提到过。在这里,正好相反,上传而不是下载。

虽然如果上传需要会话(cookie),那么您可以提取 Selenium 会话 cookie 并与 HTTP 请求一起使用。或者,如果会话与会话 ID 一起存储在 URL 中,则将其提取并与 HTTP 请求一起传递。


结论

SafariDriver 不支持通过<input type="file"> 上传文件。另一种方法是使用 HTTP/HTTPS 方法(通常通过 HTTP/HTTPS POST 请求将文件作为 POST 正文发送)通过 Safari 上传文件。

【讨论】:

    【解决方案2】:

    最新版本的 SafariDriver 可以使用 sendKeys 上传文件。

    检查您的文件输入并确保它接受的文件类型与您尝试上传的文件类型相同。

    例如

    <input type="file" accept="image/jpeg" >

    这将在 ChromeDriver 或 GeckoDriver 中有效,即使您要上传 .png 文件(但在 SafariDriver 中无效)。

    【讨论】:

      猜你喜欢
      • 2017-12-23
      • 1970-01-01
      • 2019-01-30
      • 1970-01-01
      • 1970-01-01
      • 2020-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多