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

问题描述 投票:0回答:2

我正在使用Python Selenium和ChromeDriver来对网页进行检测,并带有输入以上传文件。根据我读过的所有文档和StackOverflow答案,通过send_keys将完整文件路径发送到input元素应该可以自动执行此操作(对于简单的文本输入,我什至也有类似的工作)。但这不起作用。

我已经将其隔离为一个最小的示例:

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路径为valid时,运行相同的操作将在第二个“ 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之间某个与安全相关的行为。但是,如果这是预期的行为,那么我想念的是什么,其他人如何使它起作用呢?这样甚至可以完全自动化上传流程吗?

python selenium selenium-chromedriver browser-automation
2个回答
0
投票

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

因此,您可以执行与敲击Enter键相关的步骤,在这种情况下,这将导致不必要的问题。


0
投票

C:\fakepath\路由是大多数浏览器实施的安全措施,目的是保护网页对文件系统的不必要访问。

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.