Как автоматически загружать файлы из всплывающего диалогового окна с помощью selenium-python

Я пытаюсь автоматически загружать файлы из всплывающего диалогового окна, используя selenium-python.

Всплывающие окна firefox выглядят так:

enter image description here

Я хочу симулировать нажатие "ОК"

Я нашел этот ответ. Как захватить всплывающее окно в Selenium 2 python, который отправил меня в документы https://selenium-python.readthedocs.org/en/latest/navigating.html?highlight=popup#popup-dialogs

Я пробовал это

    alert = driver.switch_to_alert()
    #alert.send_keys(Keys.RETURN) #No alert is present

и это

    alert = driver.switch_to_alert()
    alert.accept()  #no alert is present

Если я запустил pprint.pprint(driver.window_handles) он печатает только один GUID - показывая, что присутствует только одно окно.

Поэтому, если не присутствует предупреждение, и есть только одно окно - как загрузить эти файлы?

Ответ 1

В Python, но это будет работать и в Java, потому что настройки Firefox - это JavaScript:

profile.set_preference("browser.download.panel.shown", False)
profile.set_preference("browser.helperApps.neverAsk.openFile","text/csv,application/vnd.ms-excel")
profile.set_preference("browser.helperApps.neverAsk.saveToDisk", "text/csv,application/vnd.ms-excel")
profile.set_preference("browser.download.folderList", 2);
profile.set_preference("browser.download.dir", "c:\\firefox_downloads\\")
browser = webdriver.WebDriver(firefox_profile=profile)

это работает для файлов CSV, измените его для любого типа загружаемого файла.

Ответ 2

Основываясь на ответе Амей 1) и, конечно, блоге Yi Zeng (в рубине), цитируя саму Selenium, он не взаимодействует с такими диалогами на системном уровне, как это, а также с документацией, здесь представлен питон фрагмент для решения проблемы

from selenium import webdriver
from selenium.webdriver.firefox.firefox_profile import FirefoxProfile

profile = FirefoxProfile()
profile.set_preference("browser.helperApps.neverAsk.saveToDisk", 'application/pdf')
driver = webdriver.Firefox(firefox_profile=profile)

driver.get(target_url)
#specific to target_url
driver.find_element_by_css_selector('a[title="Click to Download"]').click()

Ответ 3

У вас есть два варианта:

1) Создайте собственный профиль firefox с настройками, где предварительно определено местоположение загрузки, и Firefox не запрашивает подтверждение для загрузки. Просто googled и нашел блог, в котором объясняется, как это сделать

2) Используйте sikuli, чтобы автоматизировать клики по диалоговому окну загрузки. Blog объяснение - как использовать Sikuli

P.S. - Не читайте блоги, но я уверен, что они дадут вам подсказку.

Ответ 4

Благодаря моему использованию и тестированию в моем тесте автоматизации Selenium UI настройка профиля Firefox стала более стабильной, чем класс роботов. Например. Отключите отображение диалогового окна "Загрузка/сохранение" на странице без системы.

FirefoxProfile prof = new FirefoxProfile();

ffprofile.setPreference("browser.download.panel.shown", false);
ffprofile.setPreference("browser.helperApps.neverAsk.saveToDisk","application/zip");

//ffprofile.setPreference("browser.download.folderList", 1);  // Default to /home/user/Downloads in Linux.
ffprofile.setPreference("browser.download.folderList", 2); 
ffprofile.setPreference("browser.download.dir", "/tmp");

Ответ 5

FirefoxProfile fxProfile = new FirefoxProfile();
 fxProfile.SetPreference("browser.download.panel.shown", false);
 fxProfile.SetPreference("browser.helperApps.neverAsk.openFile", "text/csv,application/vnd.ms-excel");
 fxProfile.SetPreference("browser.helperApps.neverAsk.saveToDisk", "text/csv,application/vnd.ms-excel");
 fxProfile.SetPreference("browser.download.folderList", 2); 
 fxProfile.SetPreference("browser.download.dir", "c:\\mydownloads");
 IwebDriver driver = new FirefoxDriver(fxProfile);

Ответ 6

Большинство браузеров (в моем случае Firefox) по умолчанию выбирают кнопку OK. Так что мне удалось решить эту проблему с помощью следующего кода. Это в основном нажимает ввод для вас, и файл загружается.

Robot robot = new Robot();

// A short pause, just to be sure that OK is selected
Thread.sleep(3000);

robot.keyPress(KeyEvent.VK_ENTER);

Ответ 7

открытый класс DemoFileDownload {

FirefoxProfile prof = new FirefoxProfile(); prof.setpreference("browser.helperApps.neverAsk.SaveToDisk", "mimetype_of_file"); prof.setpreference( "browser.download.folderlist", int_value); prof.setpreference("browser.download.dir," folder_path ");//если вышеуказанное значение int_value равно 2//int_value может иметь следующие значения://1 - папка загрузок //0 - рабочий стол //2 - пользовательская папка } получить MIME-тип с сайта ниже: www.sitepoint.com/mimetypes-complete-list/

для браузера chrome используйте chromeoptions вместо firefoxprofile