Python Selenium: send_keys не отправляет фактический путь к элементу ввода файла - PullRequest
0 голосов
/ 31 марта 2020

Я использую 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"). Это мера безопасности, которая позволяет избежать утечки информации о вашей структуре каталогов. Вы можете игнорировать этот фиктивный путь, потому что правильный вход фактически отправляется на вход.

Ответы [ 2 ]

0 голосов
/ 31 марта 2020

Маршрут C:\fakepath\ - это мера безопасности, применяемая большинством браузеров для защиты нежелательного доступа к вашей файловой системе через веб-страницу.

Попробуйте использовать полный путь к файлу при вводе ключей отправки:

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

Если это не сработает, я обычно создаю настоящий каталог fakepath в C:/fakepath для хранения моих входных файлов, но это не рекомендуется, если вы включаете их в свой репозиторий для тестирования в виртуальной среде. окружающая среда.

0 голосов
/ 31 марта 2020

send_keys должен загрузить файл без нажатия кнопки enter на клавиатуре. Когда вы нажмете на Enter клавиатуру, метод send_keys для ввода типа файла будет рассматривать путь к файлу как empty, и он потерпит неудачу, как это было в вашем случае.

Таким образом, вы можете выполнить шаг связанных с нажатием клавиши Enter, которая в данном случае вызывает ненужную проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...