0,0
рейтинг
28 сентября 2012 в 13:14

Разработка → Что такое Selenium?

Время от времени мне приходится распутывать терминологические хитросплетения, связанные с употреблением словосочетаний, в которых встречается слово Selenium – Selenium 2.0, Selenium IDE, Selenium RC, Selenium WebDriver, Selenium Server, Selenium Grid.

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

Selenium


Selenium – это проект, в рамках которого разрабатывается серия программных продуктов с открытым исходным кодом (open source):
  • Selenium WebDriver,
  • Selenium RC,
  • Selenium Server,
  • Selenium Grid,
  • Selenium IDE.

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

Selenium WebDriver


Selenium WebDriver – это программная библиотека для управления браузерами. Часто употребляется также более короткое название WebDriver.

Иногда говорят, что это «драйвер браузера», но на самом деле это целое семейство драйверов для различных браузеров, а также набор клиентских библиотек на разных языках, позволяющих работать с этими драйверами.

Это основной продукт, разрабатываемый в рамках проекта Selenium.

Selenium WebDriver называется также Selenium 2.0, причина этого будет объяснена ниже.

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



В рамках проекта Selenium разрабатываются драйверы для браузеров Firefox, Internet Explorer и Safari, а также драйверы для мобильных браузеров Android и iOS. Драйвер для браузера Google Chrome разрабатывается в рамках проекта Chromium, а драйвер для браузера Opera (включая мобильные версии) разрабатывается компанией Opera Software. Поэтому они формально не являются частью проекта Selenium, распространяются и поддерживаются независимо. Но логически, конечно, можно считать их частью семейства продуктов Selenium.

Аналогичная ситуация и с клиентскими библиотеками – в рамках проекта Selenium разрабатываются библиотеки для языков Java, .Net (C#), Python, Ruby, JavaScript. Все остальные реализации не имеют отношения к проекту Selenium, хотя, возможно, в будущем, какие-то из них могут влиться в этот проект.

Selenium RC


Selenium RC – это предыдущая версия библиотеки для управления браузерами. Аббревиатура RC в названии этого продукта расшифровывается как Remote Control, то есть это средство для «удалённого» управления браузером.

Эта версия с функциональной точки зрения значительно уступает WebDriver. Сейчас она находится в законсервированном состоянии, не развивается и даже известные баги не исправляются. А всем, кто сталкивается с ограничениями Selenium RC, предлагается переходить на использование WebDriver.

Иногда Selenium RC называется также Selenium 1.0, тогда как WebDriver называется Selenium 2.0. Хотя на самом деле дистрибутив версии 2.0 включает в себя одновременно обе реализации – и Selenium RC, и WebDriver. А вот когда выйдет версия 3.0 – в ней останется только WebDriver.

С технической точки зрения WebDriver не является результатом эволюционного развития Selenium RC, они построены на совершенно разных принципах и у них практически нет общего кода. Объединяет их лишь тот факт, что обе реализации были сделаны в рамках проекта Selenium. Ну, или если быть совсем точным, WebDriver сначала был самостоятельным проектом, но в 2008 году произошло слияние и сейчас WebDriver представляет собой основной вектор развития проекта Selenium.

Selenium Server


Selenium Server – это сервер, который позволяет управлять браузером с удалённой машины, по сети. Сначала на той машине, где должен работать браузер, устанавливается и запускается сервер. Затем на другой машине (технически можно и на той же самой, конечно) запускается программа, которая, используя специальный драйвер RemoteWebDriver, соединяется с сервером и отправляет ему команды. Он в свою очередь запускает браузер и выполняет в нём эти команды, используя драйвер, соответствующий этому браузеру:



Selenium Server поддерживает одновременно два набора команд – для новой версии (WebDriver) и для старой версии (Selenium RC).

Selenium Grid


Selenium Grid – это кластер, состоящий из нескольких Selenium-серверов. Он предназначен для организации распределённой сети, позволяющей параллельно запускать много браузеров на большом количестве машин.

Selenium Grid имеет топологию «звезда», то есть в его составе имеется выделенный сервер, который носит название «хаб» или «коммутатор», а остальные сервера называются «ноды» или «узлы». Сеть может быть гетерогенной, то есть коммутатор и узлы могут работать под управлением разных операционных систем, на них могут быть установлены разные браузеры. Одна из задач Selenium Grid заключается в том, чтобы «подбирать» подходящий узел, когда во время старта браузера указываются требования к нему – тип браузера, версия, операционная система, архитектура процессора и ряд других атрибутов.

Ранее Selenium Grid был самостоятельным продуктом. Сейчас физически продукт один – Selenium Server, но у него есть несколько режимов запуска: он может работать как самостоятельный сервер, как коммутатор кластера, либо как узел кластера, это определяется параметрами запуска.

Selenium IDE


Selenium IDE – плагин к браузеру Firefox, который может записывать действия пользователя, воспроизводить их, а также генерировать код для WebDriver или Selenium RC, в котором выполняются те же самые действия. В общем, это «Selenium-рекордер».

Тестировщики, которые не умеют (или не хотят) программировать, используют Selenium IDE как самостоятельный продукт, без преобразования записанных сценариев в программный код. Это, конечно, не позволяет разрабатывать достаточно сложные тестовые наборы, но некоторым хватает и простых линейных сценариев.

Вот, кажется, и всё.

Если я забыл рассказать про какой-то термин – напишите в комментариях, и я постараюсь добавить его в этот мини-словарик.
Алексей Баранцев @barancev
карма
92,2
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (30)

  • +4
    А продолжение будет? Хотелось бы почитать статьи в таком же стиле о том как запустить много браузеров для 5 одновременных независимых тестов например.
    • –1
      Про продолжение обещать не буду, заглядывайте на сайт, посвященный selenium (ссылка у меня в профиле), более технические статьи я обычно публикую там.

      А на второй вопрос вкратце отвечу. Именно для этой цели предназначен Selenium Grid. Делаем кластер с пятью узлами. Для запуска тестов используем фреймворк, который умеет запускать тесты в параллельных потоках. Нацеливаем тесты на кластер — профит!

      Если свой кластер строить не хочется — можно запускать тесты в облаках.
  • +1
    Хотелось бы увидеть цикл статей по этой теме. Вчера немного повозился с ним, возникла масса вопросов. К примеру — как подключить chromium? можно ли не запускать браузер каждый раз заного, а подключиться к уже запущенному? А то слишком уж долго грузится Firefox. Есть ли для python-драйвера метод, который позволил бы дождаться полной загрузки страницы, и не использовать time.sleep(0.5)? Беглый поиск выдал только это — документация для python.
    • +1
      1) code.google.com/p/selenium/wiki/ChromeDriver
      и в частности
      code.google.com/p/selenium/wiki/ChromeDriver#Overriding_the_Chrome_binary_location

      2) Драйвер для Firefox при каждом запуске создаёт новый чистый профиль, поэтому долго стартует. Запустите браузер один раз, и используйте полученный инстанс драйвера во всех тестах.

      3) WebDriver автоматически дожидается загрузки страницы. Но если у вас AJAX — это не помогает. Ожидайте появления нужного элемента, прежде чем с ним работать. Не используйте sleep!

      4) Официальная документация для питона находится тут: selenium.googlecode.com/svn/trunk/docs/api/py/index.html
  • 0
    Жаль, что закрыли для паблика CI Selenium. Или он просто переехал? Поделитесь ссылкой?

    Вы не в курсе, планируется ли драйвер для firefox сделать частью проекта firefox?

    Были ли проблемы, связанные с тем, что драйвер для chrome реализует не команда Selenium? Или наоборот, это сплошные преимущества?

    • 0
      Интерфейс сервера непрерывной интеграции теперь здесь: ci.seleniumhq.org:8080/
      Кроме того, имеется альтернативный интерфейс: dashboard.ci.seleniumhq.org/

      Про драйвер Firefox можно почитать вот тут: selenium2.ru/news/59-marionette-is-the-future-of-firefoxdriver.html

      Передача драйверов в ведение компаний-вендоров имеет как плюсы, так и минусы. Плюсы в основном технические — они всё-таки лучше разбираются во внутренностях браузеров. Минусы в основном организационные, например — нецентрализованный баг-трекер, у каждого свой, это весьма неудобно.
  • +1
    Отличная статья, спасибо!
  • 0
    Есть ли возможность запускать тесты от лица разных пользователей Active Directory?
    • 0
      Это не имеет прямого отношения к инструментам семейства Selenium, задача запуска тестов как правило решается силами серверов сборки и непрерывной интеграции (Jenkins, TeamCity, TFS или ещё какого-нибудь). Поэтому вопрос к вашему серверу непрерывной интеграции — может ли он запускать тесты от лица разных пользователей?

      С другой стороны, не так важно, под каким пользователем запускаются тесты. Гораздо важнее, от лица какого пользователя запускается браузер. Поэтому — строим Selenium Grid, а в его узлах запускаем сервера Selenium от лица нужных пользователей. Теперь стартуем тесты, и они выполняются в браузерах, которые работают под нужной учёткой.
  • 0
    А как работают тесты: окошко браузера открывается и там начинается магия — двигается курсор, заполняются поля форм и все без моего участия, и я все это вижу на экране монитора? Или там все происходит в фоне как у phantomjs?
    • 0
      Первый вариант
      • 0
        Только курсор не двигается — его не видно. Но некий виртуальный курсор есть.
        Сделать на Selenium можно практически все, что и юзер.
    • +1
      Оба можно. В рамках проекта Selenium помимо драйверов для реальных браузеров разрабатывается также драйвер для HtmlUnit, который, конечно, работает без всяких окошек.

      Кроме того, есть проект GhostDriver, который представляет собой независимую реализацию интерфейса WebDriver как раз для PhantomJS. Есть вероятность того, что в какой-то момент он войдёт в состав проекта Selenium. На данный момент GhostDriver проходит успешно чуть более 90% официальных тестов для WebDriver (последняя цифра, которую я видел, была 91.64%).

      Чем это лучше? Почему нельзя просто использовать PhantomJS? Можно, конечно. Вся фишка Selenium — в едином интерфейсе. Хотите — запускаете тесты в реальном браузере, хотите — запускаете те же самые тесты в PhantomJS через GhostDriver.
  • +1
    Большое спасибо, о Селениуме я узнал с хабра. Было тут пару статей, но не было ни одной статьи, где объяснялась вся эта мешанина в названиях.
    Из-за глюка в браузере Firefox, приходится иногда использовать Chrome, но есть проблема с запуском на маке. В документации сказано, что нужно положить гугловский драйвер в любое место в системе, запустить его и пропишется путь к нему. На деле же выяснилось, что в винде надо его класть в папку в python (я на нем программирую). А на маке мне так и не удалось запустить драйвер для Хрома. Все равно не находится этот путь.
    Еще мне не нравится, что иногда в документации не всё прописано. Я уже глубоко копаю, дошел до API. В нем описана опция, как сграбить все линки, я перепробовал кучу вариантов, в результате пришлось цикл писать. Теперь у меня вопрос, как послать команду на сохранения страницы? Не хотелось бы опять прописывать всю логику.
    Получение исходного кода вебстраницы — это команду я нашел где-то в дебрях интернета, но не на официальном сайте.
    Также у них есть большое сообщество поддержки на Google Groups, но как выяснилось в интернете в целом Селениум очень любят джависты. Очень много примеров на Java и совсем мало для Python.
    • 0
      1. Про «глюк»: попробуйте использовать новую экспериментальную стратегию ожидания, про неё написано внизу этой странички — code.google.com/p/selenium/wiki/FirefoxDriver

      2. С маками не помогу, не имею опыта работы с этой системой.

      3. Чтобы «сграбить все линки» достаточно использовать простейший поиск: driver.findElements(By.tagName(«a»)). Или Вы что-то иное имеете в виду? Загрузить все страницы, на которые ведут ссылки? Ну так это уже не задача Selenium, а Ваша задача — написать «граббер», используя библиотеку Selenium WebDriver.

      4. Метода для сохранения страницы нет. Есть метод для получения кода страницы — driver.getPageSource(). Только имейте в виду, что это уже будет не то, что было написано в оригинальном коде, а что-то типа «дампа DOM».
      • 0
        3. Это вы уже привели начало цикла. Я про другое говорил, у них в API было get_all_links. Сейчас посмотрел, они исправили документацию, убрали устаревшие функции. Теперь проще будет.

        4. А можно ли послать последовательность команд Shift+S? Я видел пример на php, кто-то умудрился такое сделать. У него страницы сохранялись. Пытался для Python переписать, застрял на keys.chain
        На каком языке вы программируете? Это PHP?
        • 0
          А расскажите, зачем вам потребовалось сохранять страницу?
          Можно же сделать скриншот…
          • 0
            Я так и поступил. Размер одного скриншота составляет 50мб. Это очень длинные, большие страницы, где много картинок.
        • 0
          1. В рамках проекта Selenium клиент для языка PHP не разрабатывается. Есть целых пять независимых разработок, они описаны вот в этой статье: element34.ca/blog/a-survey-of-the-php-and-selenium-landscape, но ни одна из них не является «официально рекомендованной».

          Я обычно пишу на Java, иногда на Ruby, изредка на Python. Поэтому про PHP вряд ли смогу помочь советом.

          2. Отправить последовательность команд Control-S можно (я думаю, Вы имели в виду именно это сочетание клавиш?) — driver.findElement(By.tagName(«body»)).sendKeys(Keys.CONTROL + «s»), но после этого появится диалоговое окно, с которым Selenium WebDriver уже работать не умеет, и придётся привлекать дополнительные библиотеки, с помощью которых можно ввести в это окно нужное имя файла и подтвердить сохранение.
          • 0
            Мне показалось, что вы программируете на php, я его сам фактически не знаю и не нужен он мне. Поэтому помощь мне тут не нужна. Просто для себя уточнил ваш язык программирования. А почему джависты так любят Селениум? Для них это единственный инструмент парсинга?

            Вот тут решение вопроса, как можно автоматизировать нажатие кнопки save. Я вижу на stackoverflow постоянно встречаются вопросы, как закачать файл и многие советуют для этого Селениум.
            • 0
              >>> Для них это единственный инструмент парсинга?

              Что Вы имеете в виду? Ещё раз: Selenium WebDriver — это драйвер браузера. Взаимодействие с веб-сервером, парсинг, рендеринг страниц, интерпретацию JavaScript-кода — всё это делает браузер. А Selenium всего лишь предоставляет интерфейс для управления браузером.

              >>> А почему джависты так любят Селениум?

              Правильнее спросить наоборот — почему те, кто разрабатывают тесты на Selenium, предпочитают Java?

              Причин как минимум две. Во-первых, реализация всех новых фич в Selenium сначала делается на Java, отлаживается, тестируется, и только после этого фича реализуется в клиентах на других языках. Почему в качестве основного языка выбран Java? Так исторически сложилось :)

              Во-вторых, для языка Java разработано больше разных расширений и надстроек над Selenium. Хотя для Ruby, скажем, их тоже немало.
              • 0
                Я тоже на каждом углу говорю всем, что Selenium WebDriver — это исключительно инструмент тестирования. Чтобы не пугать некоторых, а то они начинают нервничать. Но для меня это больше, чем просто тестирование. При помощи Selenium WebDriver я решил глобальную проблему над которой долго бился. Мне нужен был автоматический терминал, который постоянно заполняет формы. Нужно каждый раз вводить имя-фамилию, адрес — это терминал оплаты. Раньше я это делал все ручками и чуть с ума не сходил от такой работы, постоянно ошибался и получал большую попа-боль от начальства за свои ошибки.
                А сейчас я всю информацию загоняю в текстовой файл, далее уже начинается работа Selenium WebDriver.

                Насчет сохранения вебстраниц. Я решил удалить свой жж, но перед этим захотел сохранить всю свою писанину. Для этого я задействовал sqlite, чтобы WebDriver мог помнить по каким страницам он ходил. За 10 минут мой дневничок с сотнями постов полностью сохранился со всеми комментариями пользователей. Правда в виде скриншотов. Но и на том спасибо, я спокойно удалил свой жж.
                • 0
                  может на базе этого сделать сервис?
                  Получи дамп своего жж / своей станицы соц сети.
                  Или не своей :)
                  • 0
                    Я еще пока не такой хороший программист и для дампа не стал бы использовать Селениум. Например, есть еще такой супер инструмент как grab. Просто это то, что пока я знаю. Кстати, возможно жж специально не делает такую фичу, как сохранения дневника, чтобы пользователям было сложней соскочить. Так что возможно они такой сервис заблокируют. А вот liveInternet.ru наоборот такую фичу предоставляет, но наверное это потому что на этом сервисе куча школоблогеров.
            • 0
              >>> Вот тут решение вопроса, как можно автоматизировать нажатие кнопки save.

              Вы не путаете сохранение кода страницы и загрузку файла? Однако и то и другое выходит за пределы возможностей Selenium, поэтому…

              >>> Я вижу на stackoverflow постоянно встречаются вопросы, как закачать файл и многие советуют для этого Селениум.

              … те, кто даёт такие советы — лучше бы не давали. Желающим рекомендую ознакомиться вот с этой статьёй: How To Download Files With Selenium And Why You Shouldn’t @ Lazery Reflections. В ней описаны не все возможные способы загрузки файлов, но всё таки это наиболее удачное описание проблемы и способов её решения.
              • 0
                ок, ладна, пасиба, проще свою логику написать :)
  • 0
    Пробовал использовать, но при использовании более 3-5 окон браузера одновременно,
    зависали окна браузеров, причём и ИЕ и Хром и Файрфокс.
    Вы сталкивались с этим?
    Как ведёт себя Селениум при стресс тестах?
    • 0
      1. Используйте Selenium Grid. Если не хочется разворачивать кластер самостоятельно — запускайте в облаках.

      2. IE пока не получается запускать больше двух экземпляров на одной машине, это известная проблема. Мы надеемся, что когда разработчики из MS подключатся к проекту, удастся это решить.

      Браузеры Firefox и Chrome без особых проблем могут работать в количестве 5-10 штук на одной машине. Некоторые запускают и больше. У нас в баг-трекере есть даже жалоба на то, что «не удается запустить больше 200 браузеров на одной машине, пожалуйста, уберите это ограничение!» :)

      Зависаний при этом быть никаких не должно. Но некоторые штуки типа выпадающих меню и прочей динамики могут работать некорректно. Частично по вине Selenium, частично потому, что если браузер не в фокусе, то события срабатывают иначе, чем тогда, когда он в фокусе. Например, onblur вообще не срабатывает, это правильное документированное поведение браузера. Так что если есть AJAX — см. совет под номером 1.
  • 0
    А еще вопрос, а можно сделать так, чтобы Firefox запускался с установленными плагинами? У меня стоит adblock и flashblock, они блокируют всякие рекламные модули, и страница грузится намного быстрей.
    • 0
      нашел, через кастомный профайл делается.

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