Получение идентификатора или другого дескриптора для диалогового окна выбора файлов в Selenium - PullRequest
0 голосов
/ 13 января 2019

В SO много сообщений о том, как работать с селектором файлов в Selenium, но все они, кажется, думают, что у вас есть ссылка на элемент, представляющий диалог выбора файлов, часто потому, что вы знаете идентификатор элемента. Как вы это нашли? Мой обычный метод, использующий «Inspect Element», не работает, потому что нет способа включить Inspect Element при включенном диалоге выбора файлов.

Страница, о которой идет речь, - images.bing.com. Выбор файла появляется, когда вы нажимаете на камеру («Поиск с использованием изображения»), а затем нажимаете кнопку Обзор.

Вот что я пробовал. Я написал эту функцию, чтобы получить список всех видимых элементов, чтобы я мог посмотреть, какие элементы видны после того, как я нажму на ссылку, чтобы открыть средство выбора файлов, но не раньше. Этот процесс идентифицирует три таких элемента, но ни один из них не имеет идентификатора, когда я запускаю elem.get_attribute("id") или elem.get_property("id").

def get_visible_elements(self):
    result = set()
    for elem in self.driver.find_elements_by_css_selector("*"):
        try:
            if elem.is_displayed():
                result.add(elem)
        except StaleElementReferenceException:
            pass
    return result

Ответы [ 3 ]

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

Выбор файла - это собственный OS * . Таким образом, Selenium не сможет взаимодействовать с окном File Chooser Dialog , и даже через Inspect Element вы не сможете его найти.

Ссылка на элементы, представляющие диалоговое окно выбора файла, действительна только в том случае, если элемент является тегом <input>, а атрибут type установлен как file следующим образом:

<input type="file" name="myFile" accept="image/jpeg, image/png">

Решение

Для взаимодействия с родной ОС Диалоговое окно выбора файла вам необходимо найти решение на основе AutoIt .

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

Вот код, который работает на основе ответа @ mblakesley. Мне пришлось использовать Javascript, чтобы сделать рассматриваемый элемент видимым, чтобы избежать ElementNotInteractableException, когда я позвонил send_keys.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Firefox()
driver.get("http://www.bing.com/images")

WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, "sbi_b")))
driver.find_element_by_id("sbi_b").click()

WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, "sb_brtext")))
driver.find_element_by_id("sb_brtext").click()

fileinput = driver.find_element_by_id('sb_fileinput')
driver.execute_script(
    'arguments[0].style = ""; arguments[0].style.display = "block"; arguments[0].style.visibility = "visible";',
    fileinput)
WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, "sb_fileinput")))
fileinput.send_keys("/sample.jpg")
0 голосов
/ 14 января 2019

Следуя инструкциям , приведенным в этом руководстве по Selenium , чтобы загрузить файл, вы ищете не сам элемент диалога, а элемент HTML * * 1003, который его генерирует.

Чтобы найти это, обычно вы можете проверить кнопку, которая вызывает диалог выбора файла. Если нет, осмотрите что-нибудь рядом с ним и посмотрите на ближайший HTML.

В этом случае для images.bing.com я проверил кнопку с надписью "Drag an image here or browse", а рядом нашел элемент, который должен работать:

<input id="sb_fileinput" class="fileinput" type="file" accept="image/gif, image/jpeg, image/png, image/webp">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...