我正在使用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之间某个与安全相关的行为。但是,如果这是预期的行为,那么我想念的是什么,其他人如何使它起作用呢?这样甚至可以完全自动化上传流程吗?
[send_keys
应该上传文件而无需单击enter
键盘按钮。当您按下Enter
键盘时,用于输入文件类型的send_keys
方法会将文件路径视为empty
,并且会像您遇到的情况一样失败。
因此,您可以执行与敲击Enter
键相关的步骤,在这种情况下,这将导致不必要的问题。
C:\fakepath\
路由是大多数浏览器实施的安全措施,目的是保护网页对文件系统的不必要访问。
尝试在发送键输入中使用文件的完整路径:
input.send_keys('C:/.../Users/xxxxx/the_image.jpg')
如果不起作用,我通常在C:/fakepath
中创建一个真实的fakepath目录来存储我的输入文件,但是如果将它们包含在存储库中以在虚拟环境中进行测试,则不建议这样做。