Как проверить скачивание нескольких файлов selenide
Перейти к содержимому

Как проверить скачивание нескольких файлов selenide

  • автор:

Селенид поддерживает Украину ����

Хорошие новости: вышла новая версия Selenide 2.15. На сей раз нас ждёт много нового. Садитесь поудобнее, начинаем обзор новинок!

Sizzle селекторы (CSS3)

Теперь в Selenide можно использовать CSS3 селекторы для поиска элементов!

$(":contains('Tere Martin!')").shouldBe(visible); $(":not(a#id)"); $$(":not(div,p)").shouldHave(size(3)); $("[value!='johnny']"); $("div:has(span)"); $(":input"); $(":text"); $(":checkbox"); $(":file"); $(":password"); $(":image"); $(":header"); $(":first"); $(":last"); $(":even"); 

Возможность пока новая и мало исследованная, поэтому по умолчанию она выключена. Включить её можно такой командой:

Configuration.selectorMode = Sizzle; 

Попробуете — расскажите, как получилось.

Загрузка многих файлов (multifile upload)

Теперь функции $.uploadFile() и $.uploadFileFromClasspath() могут принимать несколько аргументов. То есть с помощью Selenide можно загружать несколько файлов! В стандартном Selenium webdriver этой функции нет и в ближайшее время не предвидится, поэтому нам пришлось реализовать эту возможность с помощью чёрной магии и напильника. Попробуйте!

Поддержка BrowserMob proxy

Мы добавили в Selenide удобную возможность добавлять в вебдрайвер Proxy сервер. В первую очередь это было сделано, конечно, ради BrowserMob proxy — популярного среди тестировщиков инструмента. Он позволяет перехватывать http-запросы между веб-приложением и браузером, что даёт массу дополнительных возможностей, недоступных в чистом Selenium webdriver:

  • загрузка файлов с сервера,
  • работа с сайтами, требующими авторизации,
  • проверка кодов ответа на HTTP-запросы,
  • и т.д.

Подробнее о BrowserMob Proxy можно узнать в замечательном докладе Алексея Баранцева.

Пример использования BrowserMob Proxy в связке с Selenide можно найти в тесте ProxyServerUsageTest.java:

ProxyServer proxyServer = new ProxyServer(findFreePort()); proxyServer.start(); proxyServer.newHar("google-test"); WebDriverRunner.setProxy(proxyServer.seleniumProxy()); open("http://google.com"); ListHarEntry> harEntries = proxyServer.getHar().getLog().getEntries(); assertTrue(harEntries.get(0).getRequest().getUrl().equals("http://google.com")); 

Теперь можно зумить страницу!

Примеры использования, опять же, смотрим в тестах:

import static com.codeborne.selenide.Selenide.*; zoom(2.0); // Увеличить зум вдвое zoom(0.5); // Уменьшить зум вдвое 

Иногда полезно для тестирования responsive design.

Поддержка JSON и iCal

Теперь можно открывать не-html страницы.

Раньше Selenide грохался при попытке открыть не-HTML страницу. Теперь работает.

Это может быть полезно для тестирования json, iCal и т.п. ресурсов. Другой вопрос, что может, такие вещи лучше тестировать другими средствами, но иногда удобно.

assertThat(source(), containsString("DTSTART:20140409T090000")); 

Поддержка табов и фреймов

Теперь Selenide позволяет легко переключаться между вкладками и фреймами не только по заголовку (title), но и по индексу (0, 1, 2, …).

switchTo().frame(0); assertTrue(source().contains("Hello, WinRar!")); switchTo().defaultContent(); switchTo().frame(1); $("h1").shouldHave(text("Page with dynamic select")); 
switchToWindow(1); $("h1").shouldHave(text("Page with JQuery")); switchToWindow(2); $("h1").shouldHave(text("File uploads")); switchToWindow(3); $("h1").shouldHave(text("Page with alerts")); switchToWindow(0); $("h1").shouldHave(text("Tabs")); 

Поддержка Allure Framework

Добавилась функция для получения скриншота в виде файла:

import static com.codeborne.selenide.Screenshots.getScreenShotAsFile; File screenshot = getScreenShotAsFile(); 

Эта функция понадобится для интеграции с Allure Framework.

Обновились до Selenium 2.44.0.

  • Внимание, вместе с этим обновилась и версия библиотеки Google Guava до 18.0.
  • С этой версией перестал работать PhantomJS 🙁 Я уже сделал Pull Request в ghostdriver, теперь ждём, когда его зарелизят.

А что у вас новенького?

Селенид поддерживает Украину ����

Сегодня у нас в меню свеженький блестящий Selenide 7.1.0:

  • Скачивание файлов с помощью CDP
  • Условие animated
  • IF с таймаутом ¯¯_(ツ)_/¯¯
  • Можно кликать задизейбленные элементы
  • Метод $.unfocus()
  • Исправили page load timeout в мобилках
  • Можно добавлять прокси фильтр многократно
  • Обновили зависимости
  • Статистика

Скачивание файлов с помощью CDP

Не прошло и три года, как в Selenium завезли CDP, а мы уже сделали с помощью него скачивание файлов! Как вы знаете, скачивать файлы в селениде можно несколькими способами: HTTPGET , FOLDER , PROXY . Теперь к ним добавился ещё и CDP :

Configuration.fileDownload = CDP; File f = $.download(); 
File f = $.download(using(CDP)); 

Работает он примерно как FOLDER : кликает ссылку и ждёт, пока файл появится в списке скачанных. Только в отличие от FOLDER , CDP понимает, что загрузка завершена, не по дате файла, а по событию Browser.downloadProgress из CDP.

Конечно, этот метод скачивания работает только в Chromium-браузерах. И пока только на локальном браузере.

NB! Как контрибьютер, Сергей получает право рассказать вам о каком-то фонде на его выбор.

Призываю вас донатить фонду ANGRY CORGI.

Фонд Angry Corgi создан людьми из tech, чтобы усилить компьютерную инфраструктуру частей ПВО и ряду других частей Сил Обороны Украины.
Фонд постоянно принимает технику из разных стран мира, а также собирает деньги на закупку планшетов, телевизоров и другого коммуникационного оборудования.

Вот такая у нас теперь будет славная традиция. 🙂

Условие animated для окончания анимации

Анимированные элементы могут доставить автоматизаторам немало неприятных моментов. Твой тест пытается кликнуть элемент — а он в этот момент куда-то двигается, сжимается, расширяется — чёрти что. И клик попадает по другому элементу.

Теперь можно дождаться окончания анимации с помощью такой вот команды:

 $.shouldNotBe(animated); 

Надеемся, это поможет сделать ваши тесты более стабильными.

Вы спросите, а как же селенид понимает, что анимация закончилась? Загляните в пулреквест, это интересно. Если вкратце — с помощью JS функции requestAnimationFrame селенид спрашивает у браузера размеры и координаты элемента два раза подряд (в двух разных циклах отрисовки) и проверяет, что они не изменились. Хитро, а?

Добавили IF с таймаутом ¯¯_(ツ)_/¯¯

Много лет мы сопротивлялись, но всё-таки позволили этому случиться. 🙂

Мы добавили метод $.is(condition, timeout) , который возвращает boolean. Теперь в своих тестах вы сможете писать ифы без try/catch. Ворота в ад разверзлись.

 if ($("#banner").is(visible, Duration.ofSeconds(2)))  $("#banner .close").click(); > 

Логика этого ифа наверняка подпалит немало седалищ, так что будьте внимательны:

  1. Если элемент видимый, он сразу вернёт true .
  2. Если элемент невидимый, метод подождёт какое-то время (но не больше заданного таймаута), и если элемент появился — вернёт true .
  3. А вот если элемент так и не появился, в итоге вернёт false .

NB! Новый метод $.is(. Duration.ofSeconds(8)) может быть медленным! Результат false он всегда возвращает через 8 секунд! Это же убийственно долго для тестов. Постарайтесь не использовать такие условия.

Можно кликать задизейбленные элементы

Начиная с версии 6.15.0, селенид не позволяет кликнуть на disabled элемент. Но иногда это бывает надо (например, проверить, что клик по такому элементу ничего не делает). Теперь можно обойти все проверки и тупо кликнуть на какой угодно элемент с помощью параметра force :

 $("#disabledButton").click(usingDefaultMethod().force()); 

Метод $.unfocus()

Мы добавили метод $.unfocus() , который убирает фокус с элемента.

В общем-то это можно было сделать и раньше с помощью $.pressTab() , но у него могут быть нежелательные сайд-эффекты. Например, другой элемент неожиданно окажется в фокусе. А иногда по нажатию на TAB и вовсе сабмитится форма (например, при вводе OTP-кода).

А метод $.unfocus() в этом смысле безопасен: он просто убирает фокус с элемента. И вы можете проверить, что сработало автозаполнение, форматирование, подсказка и т.п.

 $("#card-number").sendKeys("1111-222-33-4444").unfocus(); $("#preview").shouldHave(text("Pay to 1111-***-**-***4 ?")); 

Исправили page load timeout в мобилках

Был у нас маленький косячок, из-за которого мы случайно выставляли Configuration.pageLoadTimeout в мобильных тестах. А Appium такую настройку не поддерживает. Из-за чего вы могли видеть такие логи:

NotImplementedError: Not implemented yet for pageLoad

Некритично, это всего лишь warning. Но больше вы его не увидите.

Можно добавлять прокси фильтр многократно

Стало чуть проще добавлять свои фильтры для селенидовского прокси. Теперь можно не проверять, что такой фильтр уже был добавлен ранее, а просто добавлять его каждый раз заново:

 private static final RequestFilter REQUEST_LOGGER = new RequestFilter() @BeforeEach final void setUp()  getSelenideProxy().addRequestFilter("request-logger", REQUEST_LOGGER); > 

Раньше селенид ругался, что такой фильтр уже есть. А теперь будет спокойненько работать дальше (но только если это реально тот же самый фильтр).

Обновили зависимости

  • bump JUnit from 5.10.1 to 5.10.2
  • bump TestNG from 7.8.0 to 7.9.0
  • Bump slf4jVersion from 2.0.11 to 2.0.12
  • Bump LittleProxy from 2.1.1 to 2.1.2

Статистика

Количество ежемесячных скачиваний Селенида перевалило за 911 тыщ!

И ещё один занимательный график.

Есть у Селенида один подпроект selenide-appium для написания автотестов для мобилок. Раньше он не особо пользовался спросом (по сравнению с самим Селенидом), но в этом году резко попёр вверх.

Не знаю, чем это объясняется, но это круто. 🙂

Селенид поддерживает Украину ����

На дворе декабрь, и в сегодняшнем посте рождественского календаря Selenide мы поговорим о том, какие возможности для скачивания файлов есть в Selenide.

UPD
Ниже описаны только два способа скачивания — HTTPGET и PROXY . Позже появился третий способ FOLDER . Возможно, вам нужен как раз он, если у вашей ссылки нет атрибута href , и прокси у вас не заводится.

Как я могу скачать файл в моём тесте?

В какой-то момент нашей карьеры каждый из нас сталкивается с необходимостью скачать какой-то файл в тесте.

Как мы помним, в Selenium это было непросто, потому что для разных браузеров требуются разные настройки.
Например, вот так выглядит создание профиля Firefox с нужными настройками:

profile.setPreference("browser.download.dir", downloadPath); profile.setPreference("browser.download.folderList", 2); profile.setPreference("browser.download.manager.showWhenStarting", false); profile.setPreference("browser.helperApps.alwaysAsk.force", false); profile.setPreference("browser.helperApps.neverAsk.saveToDisk", mimeTypes); profile.setPreference("browser.download.manager.focusWhenStarting",false); profile.setPreference("browser.download.manager.useWindow", false); profile.setPreference("browser.download.manager.showAlertOnComplete", false); profile.setPreference("pdfjs.disabled", true); 

А в Selenide

Проблема решается гораздо проще — методом $.download() .

Чтобы скачать файл, в Selenide достаточно просто вызвать метод:

File report = element.download(); 

И Selenide автоматически сделает всё, что надо. Вам не придётся возиться со всплывающим окошком, которое спрашивает, куда сохранить файл, и потом закрывать его.

Selenide сохранит скачанный файл в папку build/reports/tests . Это та же папка, где Gradle генерирует результаты прогона тестов, так что их как раз удобно видеть вместе.

Конечно, поменять эту папку тоже можно:

Configuration.downloadsFolder = desired location for downloaded files>; 

НО:

Таким образом можно скачивать файлы только со ссылкой с атрибутом “href”.

Но что, если у меня ссылки с атрибутом “href”? Так бывает, например, когда файл скачивается в результате сабмита формы. В этом случае можно скачивать файлы с помощью встроенного в селенид прокси-сервера.

Для начала нам нужно включить его (т.к. он по умолчанию выключен):

Configuration.proxyEnabled = true; Configuration.fileDownload = PROXY; 

После этого мы снова можем вызывать метод $.download() , но теперь он стал более могущественным и не требует наличия атрибута “href”:

File report = element.download(); 

Хозяйке на заметку:

Не забудьте увеличить таймаут, если собираетесь скачивать файл большого размера.

Файл будет скачан в папку по умолчанию (что-то типа C:\downloads and settings\downloads ).
Таким образом, скачанный файл окажется в двух местах: c:\downloads. и build/reports/tests .

Если это для вас проблема, можете в конце теста удалить ненужную папку, чтобы очистить место на диске:

FileUtils.deleteDirectory(new File(папка, подлежащая удалению>)); 

Узнать подробнее про механизмы скачивания файлов можно тут.

Maciej Grymuza (figrym@gmail.com)

Селенид поддерживает Украину ����

Лето не повод расслабляться! Мы выпустили релиз Selenide 5.13.0.

Будьте осторожны, он может сломать ваши тесты (если они были неаккуратно сделаны).

  • Запретили shouldHave(text(«»))
  • Убрали лишние логи из аллюра
  • Сообщение об ошибках для коллекций
  • Скачиваем файлы без
  • Скачиваем файлы с кавычками в имени
  • Пишем логи вебдрайвера в файл
  • Новый способ скачивания файлов FOLDER
  • Метод $.getWrappedElement() снова ждёт появления элемента
  • Статистика

Метод $.shouldHave(text(«»)) кидает ошибку

Возможно, самый популярный метод селенида — это $.shouldHave(text(«что-то»)) . Но даже если вы используете его каждый день, возможно, вы не подозреваете, что он проверяет подстроку. Т.е. проверка $(«h1»).shouldHave(text(«ello»)) сработает и для элемента

Hello World

.

Частный случай такой проверки — $(«h1»).shouldHave(text(«»)) . Такую проверку пройдёт любой элемент, ведь любая строка содержит пустую подстроку. То есть такая проверка просто бессмысленна.

Если вам нужно убедиться, что текст пустой, используйте $(«h1»).shouldHave(exactText(«»)) или $(«h1»).shouldBe(empty) .

Мы хотим вам помочь избежать этой типичной проблемы и избавиться от бессмысленных проверок. Для этого теперь селенид будет бросать ошибку, если вы попытаетесь передать в метод text(«») пустую строку или null.

Я попробовал Selenide 5.13.0 на своём рабочем проекте и внезапно нашёл тестов 20-30, которые падали с этой ошибкой. И это всё были логические ошибки в тестах! Вот какое полезное изменение вас ждёт. 🙂

UPD
Позже мы добавили настройку FULL_TEXT , заставляющую Selenide проверять строку целиком, на не подстроку.

Убрали лишние логи из аллюра

Внимательные аллюровцы заметили, что селенид логирует одно и то же действие дважды. Например, при вызове такой строки:

 $(bySelector).findAll(BySelector).filter(condtion); 

(на самом деле не только в аллюре, но и в обычном селенидовском TextReport )

Теперь мы убрали эти двойные логи. Пришло кое-чего порефакторить, некоторые сообщения об ошибках изменились.
Но вроде бы всё стало лучше. Если заметили ухудшение — смело сообщайте.

Улучшили сообщение об ошибках для коллекций

Ещё одна похожая история, где мы немного изменили формат ошибок при поиске элементов внутри коллекций.
По идее теперь должно быть понятнее, что внутри чего не удалось найти.

Починили загрузку файлов вне тэга

Как вы знаете, селенид позволяет загрузить одной командой несколько файлов:

 $("input").uploadFile( new File("a.txt"), new File("b.txt"), new File("c.txt") ); 

Для этой загрузки мы в своё время сделали в селениде хитрый JS хак. Оказалось, что этот хак предполагал, что для загрузки файла должен быть внутри тэга . Что как бы логично.
Но оказалось, что не у всех так.

В общем, теперь мы упростили хак и убрали зависимость от тэга .

Научились скачивать файлы с кавычками в имени

… и другими нехорошими символами.

Оказывается, есть и такие чудаки, которые генерируют файлы, в имени которых есть кавычки. Линукс и Мак вполне умеют сохранять такие файлы, а вот винда никак. Теперь селенид заменяет кавычки и другие нехорошие символы на подчёркивания (как делают все основные браузеры).

Научили вебдрайвер писать свои логи в файл

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

Теперь же селенид включает логи вебдрайвера. Логи пишутся в файлы вида build/reports/tests/webdriver.ts_pid_tid.log .
Полный путь к файлу вы можете узнать из лога, который пишет селенид каждый раз при открытии браузера:

INFO Write webdriver logs to: /andrei/build/reports/tests/webdriver.1594248139109_18125_1.log 

Когда в следующий раз будете изучать аномальное поведение вебдрайвера, не забудьте туда заглянуть.

Добавили новый способ скачивания файлов FOLDER

Как вы знаете, до сих пор в селениде было два способа скачивания файлов: HTTPGET и PROXY . См. пост в нашем блоге.

  • HTTPGET — самый простой и надёжный. Но умеет скачивать только файлы с ссылки вида .
  • PROXY — универсальный и мощный способ. Но при удалённом запуске требует доступа с машины браузера к машине тестов. Что порой вызывает сложности и поклонников Селеноида и Грида.

Теперь появился третий способ: FOLDER .

Чтобы его включить, просто пропишите в начале тестов:

Configuration.fileDownload = FileDownloadMode.FOLDER; 

Работает он просто:

  1. Кликает элемент
  2. Смотрит, какие новые файлы появились в папке build/downloads
  3. Если таких файлов несколько, пытается угадать, какой из них подходит лучше всего.

Рабочий пример всегда можно найти в тестах самого селенида.

P.S. Будем пока считать этот способ экспериментальным, поскольку есть нюансы:

  1. Работает надёжно при локальном запуске в один поток
  2. При параллельном запуске одновременные тесты могут скачивать файлы в одну и ту же папку, и тогда селенид не сможет определить, кому какой файл отдать.
  3. При удалённом запуске этот способ вообще пока не работает. Тесты-то здесь, а папка там!
  4. Поддерживаются Chrome, Firefox, Edge, Opera. Не поддерживаются IE и Safari (у в принципе нет возможности задать папку для скачивания файлов).

Мы будем работать над этим, а вы делитесь своими соображениями, как разрулить вышеозначенные проблемы.

UPD Позже этот метод скачивания был доработан, и теперь его смело можно использовать в проектах.

Метод $.getWrappedElement() снова ждёт появления элемента

Вряд ли вам это интересно, но упомянуть обязан. По сути мы откатили одно недавнее изменение.

Допустим, у вас есть такой код:

SelenideElement button = $("button"); executeJavascript("arguments[0].click()", button); 

где button , допустим, появляется на экране с задержкой.
Всю жизнь этот метод ждал появления кнопки, и лишь тогда кликал. В Selenide 5.11 нас укусила какая-то собака, и мы сделали так, чтобы не ждал. Никто почему-то не жаловался, а вот в моём рабочем проекте несколько тестов упали.

В общем, теперь мы вернули обратно старое поведение. Теперь снова ждёт.

Обновились до BrowserUpProxy 2.1.1

Обновляйтесь, пробуйте, делитесь впечатлениями!

Статистика

И моё любимое: статистика скачиваний селенида.
Мы пробили потолок в 160 тысяч в месяц!

и 31+ тысяча уникальных айпишников:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *