Как мне заставить Selenium обновить фотографию профиля в Facebook - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь заставить веб-драйвер Selenium (под управлением Firefox) обновить изображение профиля учетной записи Facebook, в которую он вошел. Я использовал типичное предложение, чтобы найти файл input и send_keys путь к моему файлу, вот что я получил:

image.find_element_by_xpath("//input[contains(@title,'Choose a file to upload')]").send_keys(os.getcwd()+'test.png')

В любом случае, вот ошибка, которую я получаю:

Traceback (последний вызов был последним): Файл "C: /Users/maste/PycharmProjects/accountGenerator/accountGenerator.py", строка 136, в
image.find_element_by_xpath ("// input [содержит (@ title, 'Выберите файл для загрузки')]"). send_keys (os.getcwd () + 'test.png')
Файл "C: \ Users \ maste \ Anaconda3 \ lib \ site-packages \ selenium \ webdriver \ remote \ webelement.py", строка 479, в send_keys 'значение': keys_to_typing (значение)})
Файл "C: \ Users \ maste \ Anaconda3 \ lib \ site-packages \ selenium \ webdriver \ remote \ webelement.py", строка 628, в _execute вернуть self._parent.execute (команда, params)
Файл "C: \ Users \ maste \ Anaconda3 \ lib \ site-packages \ selenium \ webdriver \ remote \ webdriver.py", строка 320, в исполнении self.error_handler.check_response (ответ)
Файл "C: \ Users \ maste \ Anaconda3 \ lib \ site-packages \ selenium \ webdriver \ remote \ errorhandler.py", строка 242, в check_response повысить исключение_класса (сообщение, экран, трассировка стека)
selenium.common.exceptions.ElementNotInteractableException: Сообщение: Элемент << input id = "js_h" class = "_ n _5f0v" type = "file" >> не доступен с клавиатуры

Это <> равно <input id="js_h" class="_n _5f0v" type="file">, я вообще не могу его найти нигде в HTML. У кого-нибудь есть идеи?

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Исключение ElementNotInteractableException возникает, когда элемент найден, но вы не можете выполнять над ним никаких действий. Например, вы можете нажать или вызвать ключи отправки, но в конечном итоге операция не будет выполнена.

Такая ситуация может возникнуть по нескольким причинам:

  • Элемент не отображается / отображается не полностью
  • Элемент за кадром
  • Элемент, скрывающийся за другими элементами или скрытый сам
  • Требуется какое-то действие, чтобы выполнить его, чтобы включить это.

В таких случаях вы можете попробовать следующие подходы: -

1. Подождите, пока элемент не станет видимым или кликабельным

WebDriverWait letsWait = new WebDriverWait(driver, timeout);
letsWait.until(ExpectedConditions.visibilityOf(item)); 
letsWait.until(ExpectedConditions.elementToBeClickable(item));

2. Прокручивайте, пока элемент не появится под дисплеем

Actions act = new Actions(driver);
act.moveToElement(item);

3. Используйте JavaScript для обработки элемента DOM

JavascriptExecutor jScript = (JavascriptExecutor) driver;
jScript.executeScript("var item = document.querySelector('locator'); item.value = 'your choice';")

Однако вы также можете прочитать эту ветку GitHub об этой проблеме, поскольку некоторые другие сталкиваются с ней также в своих соответствующих сценариях: https://github.com/SeleniumHQ/selenium/issues/5037

Кстати, здесь есть объяснение обработки загрузки файлов с использованием Selenium , вы можете проверить другой подход или попробовать Java вместо Python.

0 голосов
/ 15 января 2019

Вы можете использовать Autoit и его редактор для таких действий по загрузке файлов, что вам нужно сделать, просто найти кнопку элемента, на которую вы должны загрузить файл, и по действию кнопки вам нужно запустить файл autoit, что просто будет Для этого просто запустите команду нажатия на кнопку, выберите файл, который вы описали, и загрузите его.

У меня есть ссылка ниже, чтобы вы могли легко понять

https://www.softwaretestingmaterial.com/upload-file-using-autoit/

...