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

Автор и ведущий блога: Алексей Баранцев

После обновления Java-библиотеки Selenium до версии 3.3.1 пользователи, у которых были созданы свои собственные условия для явных ожиданий, заметили, что они перестали работать.

Что произошло? И, главное, что делать?

Обновите в своём проекте зависимость от Guava до версии 21 и проблема должна исчезнуть.

TL;DR

 

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

Все, кто использует Selenium, уже привыкли к тому, что браузер Internet Explorer самый медлительный из всех. Но распространяется ли это правило на браузер Edge, драйвер для которого делает непосредственно компания Microsoft?

Посмотрите, например, на эти результаты сравнения скорости работы различных локаторов в Edge, Chrome и Firefox.

Вот итоговая таблица с результатами (указано время выполнения 100 запросов различного типа к одной и той же странице):

Locator Firefox Chrome Edge
name 1377 ms 929 ms 204 ms
className 1795 ms 902 ms 199 ms
id 1600 ms 851 ms 262 ms
linkText 9056 ms 1522 ms 238 ms
xpath 2229 ms 919 ms 247 ms
cssSelector 1280 ms 809 ms 219 ms

Edge обгоняет конкурентов минимум в 3 раза по всем типам локаторов!

Ну а если он и на других типах операций окажется быстрее других браузеров... Вам не кажется, что начинается новый виток войны браузеров, сложившееся равновесие нарушено?

Не все знают, что внутри Java 8 спрятан браузер. Ну, не полноценный браузер, конечно, а движок. Он является частью библиотеки JavaFX, предназначенной для создания пользовательских интерфейсов, и позволяет реализовать WebView, то есть встроенные окна, в которых отрисовываются веб-страницы.

И это не какой-то самодельный движок с ограниченными возможностями, а самый настоящий WebKit!

Осталось только реализовать для него драйвер, и можно запускать тесты в headless-режиме, не устанавливая вообще ничего дополнительно -- только Java 8, Selenium и ваши тесты.

Спешу вас обрадовать, такой драйвер уже существует: jBrowserDriver

Правда ему пока всего три месяца от роду и в нём ещё наверное немало багов, но я бы всё равно предложил попробовать его как альтернативу драйверу для PhantomJS.

Писатели тестов на C# регулярно спрашивают -- вот для Java есть замечательный инструмент BrowserMob, который позволяет перехватывать запросы и делать всякие другие интересные штуки -- а нам, писателям тестов на C#, нам что использовать?

Раньше я обычно рекомендовал Fiddler Core. Это замечательный инструмент, но у него есть один большой недостаток -- бесплатная лицензия только для персонального использования, любое коммерческое использование требует приобретения другой лицензии. И проблема даже не в цене, а в необходимости всё это оформлять, проводить через бухгалтерию... Сразу как-то пропадает желание пользоваться инструментом.

Но во время очередного тренинга, когда мне снова задали этот вопрос, я внезапно погуглил -- и обнаружил новый инструмент!

Встречайте героя: Titanium Web Proxy, устанавливается в пару кликов с NuGet и распространяется под лицензией Apache 2.0.

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

Обычно на конференциях случаются всякие приятные анонсы -- новые продукты, новые технологии -- быстрее, выше, сильнее.

Увы, иногда бывает и наоборот.

SeleniumConf 2015 принёс печальную новость: Ivan De Marino, автор инструмента Ghostdriver, драйвера для PhantomJS, объявил о том, что он больше не имеет возможности продолжать работу над этим драйвером.

В связи с этим проект ищет нового хозяина, который сможет развивать инструмент дальше. В частности, необходимо привести его в согласие с новой недавно выпущенной версией PhantomJS 2.x с одной стороны, и с текущей версией стандарта W3C WebDriver с другой стороны.

Кому не безразлична судьба Ghostdriver -- записываться в добровольцы можно здесь.

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

Я предвижу, что этот вопрос может возникнуть у некоторых пользователей после выхода версии Selenium 2.48.

Потому что операция click с использованием синтезированных событий будет работать не так, как раньше. Лучше, естественно :) Но -- не так, как раньше. Она будет кликать по самому верхнему элементу.

Говоря технически более точно, когда у какого-то элемента вызывается метод click, драйвер сначала пытается проскроллировать страницу так, чтобы элемент оказался в области видимости, после этого он определяет положение и размер элемента, затем вычисляет координаты центра и кликает в эту точку. Но в браузере элементы располагаются "в несколько слоёв", это можно наглядно увидеть в браузере Firefox, используя режим 3D View. Поэтому в точке, куда выполняется click, вполне может находиться какой-то другой элемент. И тогда драйвер кликнет по этому вышележащему элементу, а не по тому, в котором вызывался метод click.

Раньше такого эффекта можно было добиться только с использованием нативных событий. Их больше нет. Но зато синтезированные становятся "более нативными".

Go to top