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
这里有两个不同的问题:
- 发送回车键错误。简单地发送文件路径将按预期运行。相当于用户打开文件选择对话框,选择一个文件,然后点击打开。如果您之后还发送 ENTER,则相当于将输入的值重置为空(这解释了我看到的 "File not found : " 错误)。
- 如果您在发送文件路径后查询输入的值,您将看到您的实际文件名,但带有虚假路径 ("C:\fakepath\correct_file_name.png")。这是一种安全措施,可避免泄露有关目录结构的信息。你可以忽略这个伪造的路径,因为正确的路径实际上被发送到输入。
send_keys
无需单击 enter
键盘按钮即可上传文件。当您点击 Enter
键盘时,用于文件类型输入的 send_keys
方法会将文件路径视为 empty
并且它将像您的情况一样失败。
因此您可以删除与按下 Enter
键相关的步骤,在这种情况下会导致不必要的问题。
C:\fakepath\
路由是大多数浏览器实施的一项安全措施,用于防止网页对您的文件系统进行不必要的访问。
尝试在发送键输入中使用文件的完整路径:
input.send_keys('C:/.../Users/xxxxx/the_image.jpg')
如果这不起作用,我通常会在 C:/fakepath
中创建一个真正的 fakepath 目录来存储我的输入文件,但如果您将它们包含在您的存储库中以在虚拟环境中进行测试,则不建议这样做.
我正在使用 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
这里有两个不同的问题:
- 发送回车键错误。简单地发送文件路径将按预期运行。相当于用户打开文件选择对话框,选择一个文件,然后点击打开。如果您之后还发送 ENTER,则相当于将输入的值重置为空(这解释了我看到的 "File not found : " 错误)。
- 如果您在发送文件路径后查询输入的值,您将看到您的实际文件名,但带有虚假路径 ("C:\fakepath\correct_file_name.png")。这是一种安全措施,可避免泄露有关目录结构的信息。你可以忽略这个伪造的路径,因为正确的路径实际上被发送到输入。
send_keys
无需单击 enter
键盘按钮即可上传文件。当您点击 Enter
键盘时,用于文件类型输入的 send_keys
方法会将文件路径视为 empty
并且它将像您的情况一样失败。
因此您可以删除与按下 Enter
键相关的步骤,在这种情况下会导致不必要的问题。
C:\fakepath\
路由是大多数浏览器实施的一项安全措施,用于防止网页对您的文件系统进行不必要的访问。
尝试在发送键输入中使用文件的完整路径:
input.send_keys('C:/.../Users/xxxxx/the_image.jpg')
如果这不起作用,我通常会在 C:/fakepath
中创建一个真正的 fakepath 目录来存储我的输入文件,但如果您将它们包含在您的存储库中以在虚拟环境中进行测试,则不建议这样做.