Я использую Python Selenium и ChromeDriver для инструментов веб-страницы со входом для загрузки файла. Согласно всей документации и ответам StackOverflow, которые я прочитал, отправка полного пути файла к элементу ввода через 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. Но если это ожидаемое поведение, что я упускаю, как у других это работает? Можно ли вообще полностью автоматизировать потоки загрузки, как этот?
ОБНОВЛЕНИЕ / ОТВЕТ
Здесь возникли две отдельные проблемы:
- Отправка клавиши ВВОД неверна. Простая отправка пути к файлу будет вести себя как ожидалось. Это эквивалентно тому, что пользователь открывает диалоговое окно выбора файла, выбирает файл и затем нажимает кнопку Открыть. Если после этого вы также отправите ENTER, это будет эквивалентно сбросу значения ввода на пустое (что объясняет ошибку «Файл не найден: », которую я видел).
- Если вы запрашиваете вход для его значения после отправки пути к файлу вы увидите ваше фактическое имя файла, но с поддельным путем ("C: \ fakepath \ correct_file_name.png"). Это мера безопасности, которая позволяет избежать утечки информации о вашей структуре каталогов. Вы можете игнорировать этот фиктивный путь, потому что правильный вход фактически отправляется на вход.