Python Selenium: send_keys 没有将实际路径发送到文件输入元素

Python Selenium: send_keys not sending the actual path to a file input element

我正在使用 Python Selenium 和 ChromeDriver 来检测带有上传文件输入的网页。根据我读过的所有文档和 Whosebug 答案,通过 send_keys 将完整的文件路径发送到输入元素应该会自动执行此操作(我什至有类似的东西用于简单的文本输入)。但是没用。

我将其分离为一个最小的例子:

HTML:

<input type="file" class="the_input">

Python:

import time

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys

options = Options()
options.add_argument('--user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/56.0.2924.75 Mobile/14E5239e Safari/602.1"')
options.add_argument('--window-size=375,812')
options.add_argument('user-data-dir=selenium')
browser = webdriver.Chrome(options=options)

browser.get('file:///xxxxx.html')
time.sleep(2)

input = browser.find_elements_by_class_name('the_input')[0]
print('attempting to change input')
input.clear()
print('input value:', input.get_attribute('value'))
input.send_keys('/Users/xxxxx/the_image.jpg')
print('input value:', input.get_attribute('value'))
input.send_keys(Keys.ENTER)

print('quitting')
browser.quit()

当 /Users/xxxxx/the_image.jpg 路径 无效 、运行 这将在第一个 'send_keys' 行(发送路径字符串):

attempting to change input
input value: 
Traceback (most recent call last):
...
selenium.common.exceptions.InvalidArgumentException: Message: invalid argument: File not found : /Users/xxxxx/the_image.jpg

这似乎是合理的。

但是,当 /Users/xxxxx/the_image.jpg 路径是 有效 、运行 时,第二个 'send_keys' 行(发送 ENTER):

attempting to change input
input value: 
input value: C:\fakepath\the_file.png
Traceback (most recent call last):
...
selenium.common.exceptions.InvalidArgumentException: Message: invalid argument: File not found : 

这让我大吃一惊:我的有效路径似乎被替换为虚假路径 C:\fakepath\the_file.png(我什至不在 Windows 上)。我猜这是介于 Selenium 和 ChromeDriver 之间的安全相关行为。但如果这是预期的行为,我错过了什么,其他人是如何做到这一点的?甚至可以像这样完全自动化上传流程吗?


UPDATE/ANSWER

这里有两个不同的问题:

send_keys 无需单击 enter 键盘按钮即可上传文件。当您点击 Enter 键盘时,用于文件类型输入的 send_keys 方法会将文件路径视为 empty 并且它将像您的情况一样失败。

因此您可以删除与按下 Enter 键相关的步骤,在这种情况下会导致不必要的问题。

C:\fakepath\ 路由是大多数浏览器实施的一项安全措施,用于防止网页对您的文件系统进行不必要的访问。

尝试在发送键输入中使用文件的完整路径:

input.send_keys('C:/.../Users/xxxxx/the_image.jpg')

如果这不起作用,我通常会在 C:/fakepath 中创建一个真正的 fakepath 目录来存储我的输入文件,但如果您将它们包含在您的存储库中以在虚拟环境中进行测试,则不建议这样做.