суббота, 24 октября 2015 г.

Selenium + Python: скачивание файлов и использование готового профиля

На днях меня посетила гениальная идея в ходе Selenium-тестов проверять также содержимое отчетов, скачиваемых с тестируемого сайта. Как работать с файлами .xlsx в Python, я еще подробно не разбиралась. А вот с проблемой скачивания файлов во время работы Selenium я столкнулась очень быстро. Гугление показало, что я не первая наступаю на эти грабли, некоторые даже советуют обходить их стороной. Но мы же не ищем легких путей.


Проблема в том, что при скачивании файлов появляется системное диалоговое окно, которое 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)

Комментариев нет:

Отправить комментарий