На днях меня посетила гениальная идея в ходе Selenium-тестов проверять также содержимое отчетов, скачиваемых с тестируемого сайта. Как работать с файлами .xlsx в Python, я еще подробно не разбиралась. А вот с проблемой скачивания файлов во время работы Selenium я столкнулась очень быстро. Гугление показало, что я не первая наступаю на эти грабли, некоторые даже советуют обходить их стороной. Но мы же не ищем легких путей.
Проблема в том, что при скачивании файлов появляется системное диалоговое окно, которое Selenium неподвластно. Решение заключается в настройках профиля Firefox, который будет использоваться в ходе тестов, так, чтобы файлы скачивались автоматически и без вопросов, причем желательно в определенную папку. Я нашла два понятных мне способа сделать это. Правда, один способ не сработал, но я все равно его опишу, в будущем может пригодиться.
Этот тот, который не сработал :)
Вот готовый код, который дублируется на множестве форумов:
И немножко описания к нему:
profile.set_preference ('browser.download.folderList', 2) - настройка типа выбора папки для скачиваемых файлов. 2 обозначает настраиваемую папку (1 - папку для загрузки по умолчанию.
profile.set_preference('browser.download.dir', '/tmp') можно установить, если значение предыдущей настройки - 2. Это путь к кастомной папке для загрузки.
profile.set_preference('browser.helperApps.neverAsk.saveToDisk', 'text/csv') запрещает появление диалогового окна для файлов MIME-типа, заданного во втором аргументе. MIME-тип файла можно определить с помощью этого сайта (или почитав статью в Википедии).
Есть и более простой способ настройки профиля. Можно вручную создать профиль, настроить его и использовать в ходе тестов. Для новичка, как я, это просто находка. Ведь позволяет настраивать не только способ скачивания файлов, но и многое-многое другое.
Шаг 1. Создание профиля.
Как создать профиль, подробно описано в инструкциях Firefox. Скажу только, что менеджер профилей запускается из консоли командой firefox -P на Linux (на Windows - firefox.exe -P или с указанием полного пути) и он имеет вполне очевидный интерфейс. Есть возможность установить папку, где будет храниться новый профиль. Сам профиль я назвала Webdriver.
Шаг 2. Настройка профиля.
Запустить Firefox с новым профилем можно с помощью того же менеджера профилей в консоли. Если не убрать галочку в чекбосе "Использовать выбранный профиль, не спрашивая при запуске", то профиль будет использоваться автоматически при каждом запуске Firefox. Если убрать, то при каждом запуске будет предлагаться выбор.
Итак, запускаем Firefox с нашим новым профилем. Идем на тестируемый сайт и инициируем скачивание подопытного файла. В появившемся диалоговом окне выбираем "Сохранить файл" и ставим галочку для "Do this automatically for files like this from now on" (или как там это по-русски?). Можно проверить или изменить эту настройку в Preferenses => Applications, где в Actions настраиваются способы обращения с файлами различных форматов. Важно знать, что некоторых типов файлов в списке может не быть, но они появятся, когда мы в первый раз скачаем соответствующий файл. Также можно выбрать папку для скачивания файлов (вкладка "Основное" в Preferenses).
Я также настроила автоматическое удаление истории в браузере после окончания сессии. Ведь при использовании в тестах одного и того же профиля приходится думать об управлении куками и кешем, которые тоже сохраняются в профиле. По умолчанию Selenium каждый раз при запуске создает новый профиль, то есть запускается с чистой историей. Хочется и с кастомным профилем начинать все с чистого листа.
Шаг 3. Подключение профиля в Selenium.
Делается это элементарно просто в коде настроек запуска браузера:
fp = webdriver.FirefoxProfile("/home/Firefox Profile") (пример моего пути для Linux)
driver = webdriver.Firefox(fp)
Для Windows то же самое, и, что интересно, слеш обычный, не обратный.
fp = webdriver.FirefoxProfile('D:/tests/Firefox Profile')
driver = webdriver.Firefox(fp)
Проблема в том, что при скачивании файлов появляется системное диалоговое окно, которое Selenium неподвластно. Решение заключается в настройках профиля Firefox, который будет использоваться в ходе тестов, так, чтобы файлы скачивались автоматически и без вопросов, причем желательно в определенную папку. Я нашла два понятных мне способа сделать это. Правда, один способ не сработал, но я все равно его опишу, в будущем может пригодиться.
Способ 1: настройка профиля в коде тестов
Этот тот, который не сработал :)
Вот готовый код, который дублируется на множестве форумов:
profile = webdriver.FirefoxProfile()
profile.set_preference('browser.download.folderList', 2)
profile.set_preference('browser.download.manager.showWhenStarting', False)
profile.set_preference('browser.download.dir', '/tmp')
profile.set_preference('browser.helperApps.neverAsk.saveToDisk', 'text/csv')
browser = webdriver.Firefox(profile)
И немножко описания к нему:
profile.set_preference ('browser.download.folderList', 2) - настройка типа выбора папки для скачиваемых файлов. 2 обозначает настраиваемую папку (1 - папку для загрузки по умолчанию.
profile.set_preference('browser.download.dir', '/tmp') можно установить, если значение предыдущей настройки - 2. Это путь к кастомной папке для загрузки.
profile.set_preference('browser.helperApps.neverAsk.saveToDisk', 'text/csv') запрещает появление диалогового окна для файлов MIME-типа, заданного во втором аргументе. MIME-тип файла можно определить с помощью этого сайта (или почитав статью в Википедии).
Способ 2: использование готового профиля
Есть и более простой способ настройки профиля. Можно вручную создать профиль, настроить его и использовать в ходе тестов. Для новичка, как я, это просто находка. Ведь позволяет настраивать не только способ скачивания файлов, но и многое-многое другое.
Шаг 1. Создание профиля.
Как создать профиль, подробно описано в инструкциях Firefox. Скажу только, что менеджер профилей запускается из консоли командой firefox -P на Linux (на Windows - firefox.exe -P или с указанием полного пути) и он имеет вполне очевидный интерфейс. Есть возможность установить папку, где будет храниться новый профиль. Сам профиль я назвала Webdriver.
Шаг 2. Настройка профиля.
Запустить Firefox с новым профилем можно с помощью того же менеджера профилей в консоли. Если не убрать галочку в чекбосе "Использовать выбранный профиль, не спрашивая при запуске", то профиль будет использоваться автоматически при каждом запуске Firefox. Если убрать, то при каждом запуске будет предлагаться выбор.
Итак, запускаем Firefox с нашим новым профилем. Идем на тестируемый сайт и инициируем скачивание подопытного файла. В появившемся диалоговом окне выбираем "Сохранить файл" и ставим галочку для "Do this automatically for files like this from now on" (или как там это по-русски?). Можно проверить или изменить эту настройку в Preferenses => Applications, где в Actions настраиваются способы обращения с файлами различных форматов. Важно знать, что некоторых типов файлов в списке может не быть, но они появятся, когда мы в первый раз скачаем соответствующий файл. Также можно выбрать папку для скачивания файлов (вкладка "Основное" в Preferenses).
Я также настроила автоматическое удаление истории в браузере после окончания сессии. Ведь при использовании в тестах одного и того же профиля приходится думать об управлении куками и кешем, которые тоже сохраняются в профиле. По умолчанию Selenium каждый раз при запуске создает новый профиль, то есть запускается с чистой историей. Хочется и с кастомным профилем начинать все с чистого листа.
Шаг 3. Подключение профиля в Selenium.
Делается это элементарно просто в коде настроек запуска браузера:
fp = webdriver.FirefoxProfile("/home/Firefox Profile") (пример моего пути для Linux)
driver = webdriver.Firefox(fp)
Для Windows то же самое, и, что интересно, слеш обычный, не обратный.
fp = webdriver.FirefoxProfile('D:/tests/Firefox Profile')
driver = webdriver.Firefox(fp)
Комментариев нет:
Отправить комментарий