Введение

Как вы могли узнать из “Краткой истории проекта Selenium”, Selenium RC долгое время был основным проектом Selenium, до тех пор пока в результате слияния WebDriver и Selenium не появился Selenium 2, новый и более мощный инструмент.

Selenium 1 все еще активно поддерживается (в основном в режиме сопровождения) и обеспечивает некоторые возможности, которых все еще нет в Selenium 2, в их числе поддержка нескольких языков программирования (Java, Javascript, PRuby, HP, Python, Perl и C#) и поддержка практически всех существующих браузеров.

Как работает Selenium RC

Для начала мы опишем, как устроены компоненты Selenium RC, и роль каждого из них в работе ваших тестовых сценириев.

Компоненты RC

Selenium RC включает следующие компоненты:

  • Selenium Server, который запускает и закрывает браузеры, интерпретирует и выполняет команды языка Selenium передаваемые ему тестовой программой и выполняет роль HTTP-proxy, перехватывая и проверяя сообщения HTTP, пересылаемые между браузером и тестируемым приложением.
  • Клиентские библиотеки, обеспечивающие интерфейс между каждым из языков программирования и сервером Selenium RC.

На этой диаграмме упрощенно изображена архитектура Selenium RC:

../_images/chapt5_img01_Architecture_Diagram_Simple1.png

На диаграмме видно, что клиентские библиотеки связываются с Selenium Server, передавая ему на исполнение каждую команду языка Selenium. Затем сервер, используя операторы JavaScript ядра Selenium, отправляет команды на выполнение браузеру. Браузер, используя свой интерпретатор JavaScript, исполняет эти команды, совершая определенное действие или проверку, заданные вами в тестовом сценарии.

Сервер Selenium

Сервер Selenium принимает команды из вашего теста, интерпретирует их, и возвращает вашей программе результаты их выполнения.

Сервер RC собирает ядро Selenium и автоматически внедряет его в браузер. Это происходит в тот момент, когда ваша тестовая программа открывает браузер (с помощью функции API клиентской библиотеки). Ядро Selenum – это программа на JavaScript, фактически представляющая собой набор функций JavaScript, которые интерпретируют и выполняют Selenese-команды, используя встроенный в браузер интерпретатор JavaScript.

Сервер получает Selenese-команды из вашей тестовой программы, используя простые HTTP GET/POST запросы. Это значит, что для автоматизации ваших тестов вы можете использовать любой язык программирования, который может посылать HTTP-запросы.

Клиентские библиотеки

Клиентские библиотеки позволяют использовать для написания тестовых сценариев языки программирования, что дает возможность запуска команд Selenium из программы собственного написания. Для каждого из поддерживаемых языков существует своя клиентская библиотека. Клиентская библиотека Selenium предоставляет вам программный интерфейс (API), т. е. набор функций, с помощью которых можно вызывать Selenese-команды из вашей программы. В API каждой клиентской библиотеки определены функции для каждой команды Selenium.

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

Таким образом, для создания теста вам всего лишь нужно написать программу, которая запускает определенный набор команд Selenium, используя API клиентской библиотеки. Кроме того, если у вас уже есть тестовые сценарии, созданные в Selenium IDE, вы легко можете сгенерировать код Selenium RC. Selenium IDE позволяет перевести (используя пункт меню Export) написанные в ней команды в вызовы функций клиентской библиотеки для вашего языка. См. раздел о Selenium-IDE для получения более подробной информации об экпорте кода в RC.

Установка

“Установка” – это не совсем корректный термин в случае с Selenium. В Selenuim есть набор библиотек для нескольких языков программирования на ваш выбор. Вы можете скачать их со страницы загрузки

После того, как вы выберете язык для работы, вам просто нужно будет:

  • Установить Selenium RC Server.
  • Настроить рабочий проект с использованием клиентского драйвера для выбранного вами языка программирования.

Установка Selenium Server

Selenium RC Server - это просто jar файл (selenium-server-standalone-<version-number>.jar), который не требует никакой специальной установки. Достаточно скачать zip файл и распаковать его в желаемую директорию.

Запуск Selenium Server

Перед запуском каких-либо тестов вам необходимо запустить сервер. Перейдите в директорию, в которой расположен сервер Selenium RC и запустите его следующей командой из консоли:

java -jar selenium-server-standalone-<version-number>.jar

Этот процесс можно упростить путем создания исполняемого файла batch или shell (.bat в Windows и .sh в Linux), содержащего указанную выше команду. Затем вынести ярлык на рабочий стол и в дальнейшем запускать сервер двойным щелчком по нему.

Для запуска сервера на вашей машине должна быть установлена Java и корректно прописана переменная окружения для запуска из консоли. Проверить, установлена ли на вашей машине Java нужной версии, можно введя в консоли следующее:

java -version

Если результатом будет номер версии (которая должна быть 1.5 или выше), вы готовы приступить к использованию Selenium RC.

Использование клиентского драйвера Java

  • Скачайте zip-архив с драйвером Java со страницы загрузки SeleniumHQ.
  • Достаньте из архива файл selenium-java-<номер-версии>.jar.
  • Откройте Java IDE, в которой вы предпочитаете работать (Eclipse, NetBeans, IntelliJ, Netweaver, и т. п.).
  • Создайте java-проект.
  • Подключите к вашему проекту файлы selenium-java-<номер-версии>.jar
  • Добавьте в project classpath файл selenium-java-<номер-версии>.jar.
  • Экспортируйте скрипт из Selenium IDE в Java-файл и подключите его к вашему Java-проекту или напишите ваш Selenium тест на Java, используя selenium-java-client API. API описан ниже в этом разделе. Вы также можете использовать JUnit или TestNg для запуска вашего теста или же написать свою простую программу main(). Описание этих методов будет дальше в руководстве.
  • Запустите Selenium Server из консоли.
  • Запустите ваш тест из Java IDE или из командной строки.

Чтобы получить более подробную информацию о настройке тестового проекта Java, см. приложение, разделы ”Настройка клиентского драйвера для Java” и “Настройка Selenium-RC в IntelliJ”.

Использование клиентского драйвера Python

  • Установите Selenium с помощью PIP, инструкции есть на странице загрузки SeleniumHQ.
  • Напишите Selenium тест на Python, или экспортируйте скрипт из Selenium IDE в файл python.
  • Запустите сервер Selenium из консоли.
  • Выполните ваш тест из консоли или из Python IDE.

Чтобы узнать подробнее о настройке клиентского драйвера Python, см. приложение, раздел “Настройка клиентского драйвера для Python”.

Использование клиентского драйвера .NET

  • Скачайте Selenium RC со страницы загрузки SeleniumHQ.
  • Распакуйте папку.
  • Скачайте и установите NUnit (Примечание: вы можете использовать NUnit в качестве тестовой платформы. Если вы не знакомы с NUnit, вы можете сами написать простую функцию main() для запуска ваших тестов; однако NUnit очень хорошо подходит как тестовая платформа).
  • Откройте предпочитаемую .Net IDE (Visual Studio, SharpDevelop, MonoDevelop).
  • Создайте библиотеку классов (.dll).
  • Добавьте ссылки на следующие библиотеки: nmock.dll, nunit.core.dll, nunit. framework.dll, ThoughtWorks.Selenium.Core.dll, ThoughtWorks.Selenium.IntegrationTests.dll и ThoughtWorks.Selenium.UnitTests.dll.
  • Напишите ваш тест на языке .Net (C#, VB.Net), или экспортируйте скрипт из Selenium IDE как файл C# и скопируйте этот код в только что созданный вами файл классов.
  • Напишите свою простую функцию main() или подключите к вашему проекту NUnit для запуска тестов. Эти способы описаны подробнее далее в этой главе.
  • Запустите сервер Selenium из консоли.
  • Запустите ваш тест или из IDE, из NUnit GUI, или из командной строки.

Для подробной информации о настройке клиентского драйвера .NET и Visual Studio, см. приложение, раздел ”Настройка клиенского драйвера для .NET”.

Использование клиентского драйвера Ruby

  • Если у вас еще не установлен RubyGems, установите его из RubyForge.
  • Выполните gem install selenium-client.
  • В начале вашего тестового скрипта добавьте require "selenium/client".
  • Напишите тестовый скрипт используя любую тестовую оболочку Ruby (например, Test::Unit, Mini::Test или RSpec).
  • Запустите сервер Selenium RC из консоли.
  • Запустите ваш тест способом, которым вы обычно запускаете Ruby-скрипты.

Чтобы узнать подробнее о настройке клиентского драйвера Ruby, см. Приложение “Настройка клиенского драйвера для Ruby” (вставить перевод названия)

От языка Selenium к Программе

Основной целью использования Selenium RC является перевод с языка Selenese на программный код. В этом разделе мы приведем несколько примеров для разных языков программирования.

Пример тестового сценария

Начнем с примера тестового сценария на языке Selenese. Предположим, с помощью Selenium IDE был записан следующий тест:

open /  
type q selenium rc
clickAndWait btnG  
assertTextPresent Results * for selenium rc  

Примечание: этот пример будет работать на странице http://www.google.com.

Selenese как программный код

Здесь представлен тот же тестовый скрипт, экспортированный (с помощью Selenium IDE) в каждый из поддерживаемых языков. Если вы имеете хотя бы базовые знания объектно-ориентированного языка программирования, вы поймете, как Selenium запускает команды Selenese, прочитав один из этих примеров. Для просмотра примера на нужном вам языке, нажмите соответствующую кнопку.

using System;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using NUnit.Framework;
using Selenium;

namespace SeleniumTests
{
 [TestFixture]
    public class NewTest
    {
        private ISelenium selenium;
        private StringBuilder verificationErrors;

 [SetUp]
        public void SetupTest()
        {
            selenium = new DefaultSelenium("localhost", 4444, "*firefox", "http://www.google.com/");
            selenium.Start();
            verificationErrors = new StringBuilder();
        }

 [TearDown]
        public void TeardownTest()
        {
            try
            {
                selenium.Stop();
            }
            catch (Exception)
            {
                // Игнорировать ошибки, если невозможно закрыть браузер
            }
            Assert.AreEqual("", verificationErrors.ToString());
        }

 [Test]
        public void TheNewTest()
        {
            selenium.Open("/");
            selenium.Type("q", "selenium rc");
            selenium.Click("btnG");
            selenium.WaitForPageToLoad("30000");
            Assert.AreEqual("selenium rc - Google Search", selenium.GetTitle());
        }
    }
}
/** Чтобы этот пример работал, добавьте фреймворк
* JUnit в ваш classpath, если еще этого не сделали.
*/

 package com.example.tests;

  import com.thoughtworks.selenium.*;
  import java.util.regex.Pattern;

  public class NewTest extends SeleneseTestCase {
      public void setUp() throws Exception {
          setUp("http://www.google.com/", "*firefox");
      }
        public void testNew() throws Exception {
            selenium.open("/");
            selenium.type("q", "selenium rc");
            selenium.click("btnG");
            selenium.waitForPageToLoad("30000");
            assertTrue(selenium.isTextPresent("Results * for selenium rc"));
      }
  }
use strict;
use warnings;
use Time::HiRes qw(sleep);
use Test::WWW::Selenium;
use Test::More "no_plan";
use Test::Exception;

my $sel = Test::WWW::Selenium->new( host => "localhost",
                                    port => 4444,
                                    browser => "*firefox",
                                    browser_url => "http://www.google.com/" );

$sel->open_ok("/");
$sel->type_ok("q", "selenium rc");
$sel->click_ok("btnG");
$sel->wait_for_page_to_load_ok("30000");
$sel->is_text_present_ok("Results * for selenium rc");
<?php

require_once 'PHPUnit/Extensions/SeleniumTestCase.php';

class Example extends PHPUnit_Extensions_SeleniumTestCase
{
  function setUp()
  {
    $this->setBrowser("*firefox");
    $this->setBrowserUrl("http://www.google.com/");
  }

  function testMyTestCase()
  {
    $this->open("/");
    $this->type("q", "selenium rc");
    $this->click("btnG");
    $this->waitForPageToLoad("30000");
    $this->assertTrue($this->isTextPresent("Results * for selenium rc"));
  }
}
?>
from selenium import selenium
import unittest, time, re

class NewTest(unittest.TestCase):
    def setUp(self):
        self.verificationErrors = []
        self.selenium = selenium("localhost", 4444, "*firefox",
                "http://www.google.com/")
        self.selenium.start()

    def test_new(self):
        sel = self.selenium
        sel.open("/")
        sel.type("q", "selenium rc")
        sel.click("btnG")
        sel.wait_for_page_to_load("30000")
        self.failUnless(sel.is_text_present("Results * for selenium rc"))

    def tearDown(self):
        self.selenium.stop()
        self.assertEqual([], self.verificationErrors)
require "selenium"
require "test/unit"

class NewTest < Test::Unit::TestCase
  def setup
    @verification_errors = []
    if $selenium
      @selenium = $selenium
    else
      @selenium = Selenium::SeleniumDriver.new("localhost", 4444, "*firefox", "http://www.google.com/", 10000);
      @selenium.start
    end
    @selenium.set_context("test_new")
  end

  def teardown
    @selenium.stop unless $selenium
    assert_equal [], @verification_errors
  end

  def test_new
    @selenium.open "/"
    @selenium.type "q", "selenium rc"
    @selenium.click "btnG"
    @selenium.wait_for_page_to_load "30000"
    assert @selenium.is_text_present("Results * for selenium rc")
  end
end

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

Программирование вашего теста

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

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

Дополнительно вы можете применять тестовую платформу, такую как JUnit или TestNG для Java, или NUnit для .NET, если вы используете один из этих языков.

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

Java

Для тестов на Java в качестве тестовой платформы используют JUnit или TestNG. Некоторые среды разработки, такие как Eclipse, имеют прямую поддержку этих фреймворков через плагины, что еще больше упрощает дело. Описание работы с JUnit или TestNG выходит за рамки этого документа, однако материалы для их изучения можно найти в интернете. Если ваша контора уже напоминает кофейню, наверняка вашим разработчикам знаком один из этих фреймворков.

Скорее всего, вы захотите переименовать тестовый класс из “NewTest” во что-нибудь другое на ваш выбор. Также, вам необходимо будет изменить параметры запуска браузера в выражении:

selenium = new DefaultSelenium("localhost", 4444, "*iehta", "http://www.google.com/");

Код, сгенерированный Selenium-IDE, будет выглядить примерно так (для большей ясности в пример были вручную добавлены комментарии):

package com.example.tests;
// Определяем пакет для наших тестов

import com.thoughtworks.selenium.*;
// Это импорт драйвера. Вы будете использовать его для создания экземпляров
// браузера и выполнения ими необходимых действий.

import java.util.regex.Pattern;
// Selenium-IDE добавляет модуль Pattern, т.к. иногда он используется для
// проверок по регулярным выражениям. Вы можете удалить этот модуль,
// если не используете их в вашем тестовом сценарии.

public class NewTest extends SeleneseTestCase {
// Создаем наш тестовый сценарий Selenium

      public void setUp() throws Exception {
        setUp("http://www.google.com/", "*firefox");
             // Создаем экземпляр браузера и запускаем его
      }

      public void testNew() throws Exception {
           selenium.open("/");
           selenium.type("q", "selenium rc");
           selenium.click("btnG");
           selenium.waitForPageToLoad("30000");
           assertTrue(selenium.isTextPresent("Results * for selenium rc"));
           // Это реальные тестовые шаги
     }
}

C#

Клиентский драйвер .NET работает на платформе Microsoft.NET. Его можно использовать с любыми фреймворками тестирования для .NET, например NUnit или the Visual Studio 2005 Team System.

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

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

selenium = new DefaultSelenium("localhost", 4444, "*iehta", "http://www.google.com/");

Сгенерированный код будет выглядить примерно так.

using System;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using NUnit.Framework;
using Selenium;

namespace SeleniumTests

{
 [TestFixture]

    public class NewTest

    {
    private ISelenium selenium;

    private StringBuilder verificationErrors;

 [SetUp]

    public void SetupTest()

    {
        selenium = new DefaultSelenium("localhost", 4444, "*iehta",
        "http://www.google.com/");

        selenium.Start();

        verificationErrors = new StringBuilder();
    }

 [TearDown]

    public void TeardownTest()
    {
        try
        {
        selenium.Stop();
        }

        catch (Exception)
        {
        // Игнорировать ошибки, если не удалось закрыть браузер
        }

        Assert.AreEqual("", verificationErrors.ToString());
    }
 [Test]

    public void TheNewTest()
    {
        // Открыть поисковую систему Google.
        selenium.Open("http://www.google.com/");

        // Проверить заголовок страницы.
        Assert.AreEqual("Google", selenium.GetTitle());

        // Ввести поисковый запрос "Selenium OpenQA"
        selenium.Type("q", "Selenium OpenQA");

        // Прочитать введенный запрос и проверить его.
        Assert.AreEqual("Selenium OpenQA", selenium.GetValue("q"));

        // Нажать кнопку поиска.
        selenium.Click("btnG");

        // Ждать загрузки страницы.
        selenium.WaitForPageToLoad("5000");

        // Проверить, что "www.openqa.org" присутствует в результатах поисковой выдачи.
        Assert.IsTrue(selenium.IsTextPresent("www.openqa.org"));

        // Проверить, что заголовой страницы это - "Selenium OpenQA - Google Search"
        Assert.AreEqual("Selenium OpenQA - Google Search",
                     selenium.GetTitle());
    }
    }
}

Вы можете позволить NUnit управлять выполнением ваших тестов. Или вы можете сами написать простую функцию main(), которая создаст экземпляры тестовых объектов и по очереди запустит каждый из трех методов - SetupTest(), TheNewTest() и TeardownTest().

Python

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

Базовая структура:

from selenium import selenium
# Это импорт драйвера. Вы будете использовать его для создания экземпляров
# браузера и выполнения ими необходимых действий.

import unittest, time, re
# Это базовые импортируемые модули, добавляемые Selenium-IDE по умолчанию.
# Вы можете удалить эти модули, если они не используются в вашем скрипте.

class NewTest(unittest.TestCase):
# Создаем наш тестовый сценарий unittest

    def setUp(self):
        self.verificationErrors = []
        # Это пустой массив, куда мы будем сохранять любые ошибки,
        # обнаруженные нашим тестом

        self.selenium = selenium("localhost", 4444, "*firefox",
                "http://www.google.com/")
        self.selenium.start()
        # Создаем экземпляр браузера и запускаем его

    def test_new(self):
        # Это код теста. Сюда вы должны поместить все действия, которые должен
        # выполнить браузер в тестовом сценарии.

        sel = self.selenium
        # Мы присваиваем браузеру переменную "sel" (просто чтобы не вводить
        # "self.selenium" каждый раз, когда мы хотим обратиться к браузеру).

        sel.open("/")
        sel.type("q", "selenium rc")
        sel.click("btnG")
        sel.wait_for_page_to_load("30000")
        self.failUnless(sel.is_text_present("Results * for selenium rc"))
        # Это реальные тестовые шаги

    def tearDown(self):
        self.selenium.stop()
        # закрываем браузер (Я бы рекомендовал вам закомментировать эту строку
        # на время создания и отладки ваших тестов)

        self.assertEqual([], self.verificationErrors)
        # Отмечаем тест проваленным, если видим, что хоть одна проверка
        # обнаружила ошибку

Ruby

Selenium IDE генерирует приемлемый Ruby-код, но требует старого Selenium gem-пакета. Это проблема, т.к. официальный драйвер Ruby для Selenium это Selenium-Client gem, а не старый Selenium gem. Фактически, Selenium gem уже даже не разрабатывается.

Поэтому желательно обновить все скрипты Ruby, сгенерированные IDE, следующим образом:

  1. В строке 1, измените require "selenium" на require "selenium/client"
  2. В строке 11, измените Selenium::SeleniumDriver.new на Selenium::Client::Driver.new

Возможно, вы также захотите изменить имя класса с “Untitled” на нечто более информативное, а также изменить имя тестового метода на что-то отличное от “test_untitled”.

Это простой пример, созданный описанным выше путем изменения кода Ruby, сгенерированного Selenium IDE.

# загрузка Selenium-Client gem
require "selenium/client"

# загрузка Test::Unit, стандартной тестовой оболочки Ruby 1.8
# Если вы предпочитаете RSpec, посмотрите примеры в документации
# Selenium-Client.
require "test/unit"

class Untitled < Test::Unit::TestCase

  # Метод setup вызывается перед каждым тестом.
  def setup

    # Этот массив используется для фиксации ошибок и вывода их
    # по завершении выполнения теста.
    @verification_errors = []

    # Создание нового экземпляра драйвера Selenium-Client.
    @selenium = Selenium::Client::Driver.new \
      :host => "localhost",
      :port => 4444,
      :browser => "*chrome",
      :url => "http://www.google.com/",
      :timeout_in_second => 60

    # Запуск сессии браузера
    @selenium.start

    # Вывод сообщения в лог и строку состояния браузера
    # (опционально).
    @selenium.set_context("test_untitled")

  end

  # Метод teardown вызывается после каждого теста.
  def teardown

    # Остановка сессии браузера.
    @selenium.stop

    # Вывод массива сообщений об ошибках, если были зафиксированы.
    assert_equal [], @verification_errors
  end

  # Это основная часть вашего теста.
  def test_untitled

    # Открыть корень сайта, определенного нами выше, при создании
    # нового экземпляра драйвера.
    @selenium.open "/"

    # Ввести 'selenium rc' в поле с названием 'q'
    @selenium.type "q", "selenium rc"

    # Кликнуть кнопку с названием "btnG"
    @selenium.click "btnG"

    # Дождаться загрузки страницы с результатами поиска.
    # Обратите внимание, что нам не нужно устанавливать таймаут здесь, т.к. он
    # был задан, когда мы создавали новый экземпляр браузера, выше.
    @selenium.wait_for_page_to_load

    begin

       # Проверить, содержится ли в результатах поиска искомый текст.
       # Обратите внимание, что звездочка (*) - символ, соответствующий любому количеству
       # символов.
       assert @selenium.is_text_present("Results * for selenium rc")

    rescue Test::Unit::AssertionFailedError

       # Если проверка не пройдена, добавить сообщение в массив ошибок.
       @verification_errors << $!

    end
  end
end

Perl, PHP

Участники команды документации никогда не использовали Selenium RC с Perl или PHP. Если вы используете Selenium RC с одним из этих двух языков, пожалуйста, свяжитесь с разработчиками документации (см. главу о содействии). Нам хотелось бы включить сюда некоторые примеры из вашего опыта, для поддержки пользователей Perl и PHP.

Изучение API

Selenium RC API использует такую систему именования, что, если вы знакомы с языком команд Selenium, то большая часть API будет понятна вам сама по себе. Здесь, однако, мы поясним наиболее важные и, возможно, не столь очевидные аспекты.

Запуск браузера

selenium = new DefaultSelenium("localhost", 4444, "*firefox", "http://www.google.com/");
selenium.Start();
setUp("http://www.google.com/", "*firefox");
my $sel = Test::WWW::Selenium->new( host => "localhost",
                                    port => 4444,
                                    browser => "*firefox",
                                    browser_url => "http://www.google.com/" );
$this->setBrowser("*firefox");
$this->setBrowserUrl("http://www.google.com/");
self.selenium = selenium("localhost", 4444, "*firefox",
                         "http://www.google.com/")
self.selenium.start()
@selenium = Selenium::ClientDriver.new("localhost", 4444, "*firefox", "http://www.google.com/", 10000);
@selenium.start

Каждый их этих примеров запускает браузер и присваивает открытый экземпляр переменной. Эта программная переменная затем используется для вызова методов из браузера. Эти методы выполняют команды Selenium, т.е. такие команды, как open или type или verify.

Обязательными параметрами при создании экземпляра браузера являются:

хост Определяет IP-адрес компьютера, где расположен сервер. Как правило, это та же машина, где запущен клиент, поэтому в данном случае передается значение localhost. В некоторых клиентах этот параметр не обязателен.

порт Задает сокет TCP/IP, на котором сервер ожидает соединения с клиентом. Этот параметр также является необязательным в некоторых клиентских драйверах.

браузер Браузер, в котором вы хотите запустить тесты. Это обязательный параметр.

url Базовый урл тестируемого приложения. Его указания требуют все клиентские библиотеки, эта информация обязательна для запуска соединения “браузер-прокси-тестируемое приложение”.

Обратите внимание, что некоторые клиентские библиотеки требуют, чтобы браузер был запущен явным вызовом его метода start().

Запуск комманд

Как только браузер инициализирован и присвоен переменной (как правило, называемой “selenium”) вы можете выполнять команды Selenese, вызывая соответствующие методы переменной браузера. Например, вызов метода type объекта selenium:

selenium.type(“field-id”,”что печатать”)

Браузер в фоновом режиме будет выполнять действие type (ввод текста), которое практически идентично вводу данных пользователем, используя локатор и строку, заданную вами при вызове метода.

Вывод результатов

Selenium RC не имеет собственного механизма для вывода результатов тестирования. Конечно, он позволяет вам создать свою, отвечающую любым вашим требованиям, систему отчетов, с помощью выбранного вами языка программирования. Это замечательно, но что если вы просто хотите быстро использовать что-то готовое? Часто существующие библиотеки или тестовые оболочки могут удовлетворить ваши нужды быстрее, чем написание кода вашей собственной системы отчетов.

Инструменты создания отчетов фреймворка тестирования

Тестовые фреймворки существуют для большинства языков программирования. Они, помимо своей основной задачи по предоставлению гибкой тестовой платформы для выполнения ваших тестов, дают также возможность использования своих библиотек для вывода отчетов. Например, Java имеет два широко используемых тестовых фреймворка, JUnit и TestNG. В .NET также имеется свой, NUnit.

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

Библиотеки отчетов тестирования

Также существуют сторонние библиотеки на выбранном вами языке, специально разработанные для вывода отчетов по тестированию. Они часто поддерживают разнообразные форматы, такие как HTML или PDF.

Какой подход лучше?

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

Примеры тестовых отчетов

Для примера, мы покажем вам несколько реальных инструментов на разных языках программирования, поддерживаемых Selenium. Перечисленные здесь инструменты весьма распространены и хорошо знакомы (а потому и рекомендованы) авторам этого руководства.

Тестовые отчеты на Java

  • Если тесты Selenium были разработаны с помощью JUnit, то вы можете использовать для генерации тестовых отчетов JUnit Report. Посетите сайт`JUnit Report`_ для подробного ознакомления.
  • Если тесты Selenium разрабатывались с использованием TestNG, то не требуется никаких дополнительных инструментов для создания отчета о тестировании. Фреймворк TestNG генерирует HTML-отчет, где содержится детальные сведения о прохождении теста. См. TestNG Report для получения подробной информации.
  • ReportNG это плагин создания HTML-отчетов для фреймворка TestNG. Он заменяет HTML-отчет, создаваемый в TestNG по умолчанию. ReportNG использует в отчете цветовое оформление, что делает отчет простым для понимания. См. ReportNG для получения подробной информации.
  • Также, для создания красивой сводки по результатам тестирования, попробуйте использовать TestNG-xslt. Отчет, созданный с помощью TestNG-xslt выглядит примерно так.

    ../_images/chapt5_TestNGxsltReport1.png

См. TestNG-xslt для получения подробной информации.

Логирование команд языка Selenium

  • “Logging Selenium” может использоваться для генерации отчета со всеми командами, составляющими ваш тест, с информацией об успешном или неуспешном выполнении каждой из них. “Logging Selenium” дополняет клиентский драйвер Java, добавляя возможность логирования операторов языка Selenium. Для подробного ознакомления посетите сайт Logging Selenium.

Тестовые отчеты на Python

  • Если вы пользуетесь клиентским драйвером Python, для генерации отчета о тестировании можно использовать HTMLTestRunner. Подробнее: HTMLTestRunner.

Тестовые отчеты на Ruby

  • Если при написании тестовых сценариев на Ruby вы использовали фреймворк RSpec, то для генереции тестового отчета можно использовать его HTML-отчет. Обратитесь к сайту RSpec Report для ознакомления.

Добавим тестам изюминку

Теперь вернемся к главной, по сути, задаче Selenium RC, к добавлению в тесты программной логики. Она не отличается от таковой в любой другой программе. Ход выполнения программы управляется условными выражениями и циклами. Кроме того, вы можете сообщать о ходе исполнения теста, используя вводвывод. В этом разделе мы покажем несколько примеров того, как конструкции языка программирования могут быть совмещены с командами Selenium для решения общих задач тестирования.

При переходе от простых тестов проверяющих наличие элементов на странице к тестированию динамической функциональности, с участием нескольких веб-страниц и изменяющихся данных, вы поймете, что для проверки ожидаемых результатов вам необходима программная логика. Сам по себе Selenium IDE не поддерживает циклы и условные выражения. Вы можете создавать некоторые условия путем внедрения javascript в параметры команд, однако использование циклов невозможно, и большинство условий реализуются на языке программирования намного проще. Кроме того, вам может понадобится создание исключений для обработки ошибок. По этой и другим причинам, мы написали этот раздел, иллюстрирующий использование общих техник программирования, дающих вам больше возможностей для автоматизации тестирования.

Примеры из этого раздела написаны на C# и Java, однако код прост и может быть легко адаптирован к любому из поддерживаемых языков. Если у вас есть некоторые базовые знания объектно-ориентированного языка программирования, у вас не должно быть проблем с пониманием этого раздела.

Циклы

Цикл - одна из самых распространенных управляющих конструкций, используемых в тестах. Например, вам может понадобиться выполнить поиск несколько раз. Или, возможно, для проверки ваших тестовых результатов вам необходимо будет обработать выборку данных, полученную из базы данных.

Используя тот же пример поиска в Google , что мы использовали ранее, проверим результаты поискового запроса “Selenium”. Этот тест может содержать следующие команды Selenese:

open /  
type q selenium rc
clickAndWait btnG  
assertTextPresent Results * for selenium rc  
type q selenium ide
clickAndWait btnG  
assertTextPresent Results * for selenium ide  
type q selenium grid
clickAndWait btnG  
assertTextPresent Results * for selenium grid  

Для запуска одинаковых действий код повторяется трижды. Однако дублирование кода – не лучшая практика программирования, поскольку увеличивает трудоемкость сопровождения кода. Используя ЯП, мы сможем обработать поисковую выдачу циклом, что приведет к гораздо более гибкому и сопровождаемому коду.

In C#:

// массив строковых значений.
String[] arr = {"ide", "rc", "grid"};

// обработка каждой строки массива 'arr' в цикле
foreach (String s in arr) {
    sel.open("/");
    sel.type("q", "selenium " +s);
    sel.click("btnG");
    sel.waitForPageToLoad("30000");
    assertTrue("Expected text: " +s+ " is missing on page."
    , sel.isTextPresent("Results * for selenium " + s));
 }

Условные выражения

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

selenium.type("q", "selenium " +s);

В случае отсутствия элемента ‘q’ на странице, выдается ошибка:

com.thoughtworks.selenium.SeleniumException: ERROR: Element q not found

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

Разумнее было бы сначала проверить, находится ли элемент на странице, и в случае его отсутстия выполнить альтернативные действия. Давайте рассмотрим пример на Java.

// Если элемент присутствует на странице, выполнить команду type.
if(selenium.isElementPresent("q")) {
    selenium.type("q", "Selenium rc");
} else {
    System.out.printf("Элемент: " +q+ " отсутствует на странице.")
}

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

Выполнение JavaScript из вашего теста

На JavaScript очень удобно реализовывать задачи, не поддерживаемые Selenium напрямую. Для исполнения JavaScript в Selenium RC можно использовать метод Selenium API getEval.

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

public static String[] getAllCheckboxIds () {
             String script = "var inputId = new Array();";// создание массива на javascript.
             script += "var cnt = 0;"; // счетчик для ID чекбоксов.
             script += "var inputFields = new Array();"; // создание массива на javascript.
             script += "inputFields = window.document.getElementsByTagName('input');"; // получение элементов input
             script += "for(var i=0; i<inputFields.length; i++) {"; // Цикл для каждого полученного элемента.
             script += "if(inputFields[i].id !=null " +
             "&& inputFields[i].id !='undefined' " +
             "&& inputFields[i].getAttribute('type') == 'checkbox') {"; // Если поле ввода имеет тип checkbox и его id не равен null,
             script += "inputId[cnt]=inputFields[i].id ;" + // сохраняем ID чекбокса в массив inputId.
             "cnt++;" + // увеличение счетчика.
             "}" + // конец if.
             "}"; // конец for.
             script += "inputId.toString();" ;// Преобразование массива в строку.
             String[] checkboxIds = selenium.getEval(script).split(","); // Разделение строки.
             return checkboxIds;
 }

Подсчет изображений на странице:

selenium.getEval("window.document.images.length;");

Не забывайте в DOM-выражениях явно использовать объект window, поскольку по умолчанию обращение направлено к окну Selenium, а не к тому, в котором запущено тестируемое приложение.

Параметры запуска сервера

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

Напомним, сервер запускается следующей командой:

$ java -jar selenium-server-standalone-<version-number>.jar

Чтобы просмотреть список параметров запуска, запустите сервер с опцией -h.

$ java -jar selenium-server-standalone-<version-number> -h

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

Настройка прокси

Если тестируемое приложение находится за HTTP-прокси, требуещей аутентификации, вам следует указать http.proxyHost, http.proxyPort, http.proxyUser и http.proxyPassword, как в следующей команде.

$ java -jar selenium-server-standalone-<version-number>.jar -Dhttp.proxyHost=proxy.com -Dhttp.proxyPort=8080 -Dhttp.proxyUser=username -Dhttp.proxyPassword=password

Многооконный режим

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

../_images/chapt5_img26_single_window_mode1.png

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

../_images/chapt5_img27_multi_window_mode1.png

Для версий Selenium до 1.0 необходимо явно задавать использование многооконного режима с помощью параметра:

-multiwindow

Начиная с версии 1.0 для запуска тестов в одиночном фрейме (то есть, как в более ранних версиях Selenium) необходимо казать при запуске Selenium Server параметр

-singlewindow

Указание профиля Firefox

Этот раздел относится к версиям Selenium меньше 1.0.

Вы не сможете запустить более обного экземпляра Firefox одновременно, если вы не определите отдельный профиль для каждого из экземпляров. Selenium версии 1.0 и выше запускает каждый Firefox с отдельным профилем автоматически. При работе с более поздней версией Selenium для использования особенного профиля для ваших тестов (например, с добавленным HTTPS-сертификатои или установленными дополнениями), вам необходимо явно его указывать.

Сначала, для создания отдельного профиля Firefox, выполните следующее. Откройте меню “Пуск”, выберите пункт “Выполнить” и выполните любую из следующих команд:

firefox.exe -profilemanager
firefox.exe -P

Создайте новый профиль с помощью появившегося диалога. Затем, при запуске Selenium Server, с помощью параметра командной строки сервера -firefoxProfileTemplate укажите путь к файлам этого профиля.

-firefoxProfileTemplate "расположение профиля"

Более подробную информацию о профилях Firefox можно найти в Базе знаний Mozilla

Запуск тестов на языке Selenium непосредственно на сервере с использованием -htmlSuite

Вы можете выполнить тесты на языке команд Selenium (сохраненные из Selenium IDE в виде HTML-файлов) на сервере Selenium путем указания HTML-файла в командной строке сервера. Например:

java -jar selenium-server-standalone-<version-number>.jar -htmlSuite "*firefox"
"http://www.google.com" "c:\absolute\path\to\my\HTMLSuite.html"
"c:\absolute\path\to\my\results.html"

Сервер автоматически запустит ваш набор HTML-тестов, выполнит все тесты и сохранит красивый HTML-отчет с результатами.

Эта команда очень длинная, потому будьте внимательны при наборе. Обратите внимание, она требует передачи HTML-файла тестового наборе, а не одного теста. Также имейте в виду, что параметр -htmlSuite несовместим с параметром -interactive. Вы не можете использовать их одновременно.

Журналирование действий Selenium сервера

Журналирование со стороны сервера Selenium

При запуске сервера Selenium можно использовать параметр -log для включения записи полезной отладочной информации от сервера в текстовый файл.

java -jar selenium-server-standalone-<version-number>.jar -log selenium.log

Этот файл содержит больше информации, чем выводится на консоль (он включает в себя сообщения уровня DEBUG). Файл журнала также включает в себя имя отправителя сообщения и идентификатор потока, записавшего его. Например:

20:44:25 DEBUG [12] org.openqa.selenium.server.SeleniumDriverResourceHandler -
Browser 465828/:top frame1 posted START NEW

Формат сообщения:

ВРЕМЯ(HH:mm:ss) УРОВЕНЬ [ПОТОК] ОТПРАВИТЕЛЬ - СООБЩЕНИЕ

Сообщение может быть многострочным.

Журналирование со стороны браузера

JavaScript на стороне браузера (Selenium Core) также сохраняет важные сообщения; во многих случаях они могут оказаться полезнее конечным пользователям, чем журнал сервера Selenium. Для включения журналирования на стороне браузера укажите параметр **- browserSideLog ** при запуске сервера Selenium.

java -jar selenium-server-standalone-<version-number>.jar -browserSideLog

Параметр - browserSideLog следует использовать в сочетании с параметром -log для сохранения сообщений браузера (и остальных сообщений уровня DEBUG) в файл.

Указание пути к конкретному браузеру

Вы можете указать Selenium RC путь к конкретному браузеру. Это полезно если у вас есть разные версии одного и того же браузера, и вы хотите использовать определенную. Кроме того, указание пути используется для запуска тестов в не поддерживаемом Selenium RC напрямую браузере. При указании режима запуска используйте спецификатор *custom, после которого следует полный путь к браузеру:

*custom <путь к браузеру>

Архитектура Selenium RC

Чтобы узнать в подробностях о том, как работает сервер Selenium, почему он использует технику внедрения прокси и режимы работы с повышенными привилегиями, вы должны сначала понять `правило ограничения домена (the same origin policy)`_.

Правило ограничения домена

Основное ограничение, с которым сталкивается Selenium, это ограничение домена. Эта политика безопасности применяется всеми современными браузерами и ее цель – гарантировать, что содержимое сайта никогда не будет доступно скрипту с другого сайта. Она заключается в ограничении доступной для любых действий области javascript кода тем сайтом, с которого он был загружен. Он не может выполнть никаких действий с сайтом на другом домене. Например, если браузер скачивает JavaScript при загрузке www.mysite.com, он не запустит этот же код на www.mysite2.com, даже если этот сайт является другим вашим сайтом. Если бы это было возможно, скрипт с любого открытого вами веб-сайта смог бы считать информацию о вашем банковском счете, если бы страница вашей учетной записи была бы открыта в другой вкладке браузера. Это называется XSS (“Cross-site Scripting”, межсайтовый скриптинг).

Чтобы обойти это ограничение, Selenium Core (вместе со всеми JavaScript командами) должен быть расположен по тому же адресу, что и тестируемое приложение.

Исторически Selenium Core был ограничен этим правилом, поскольку он реализован на JavaScript. Однако Selenium RC свободен от этого ограничения. Для обхода этой проблемы он использует Selenium сервер в качестве прокси. По сути, он заставляет поверить браузер тому, что тот работает с одним сайтом, предоставляемым ему сервером Selenium.

Note

Дополнительную информацию можно найти в википедии на страницах, посвященных Same Origin Policy и XSS.

Внедрение прокси

Первым способом, который использовался в Selenium для обхода правила ограничения домена, было внедрение прокси. В режиме внедрения прокси сервер Selenium действует как сконфигурированный клиентом [1] HTTP прокси [2], находящийся между браузером и тестируемым приложением. Он прячет тестируемое приложение под вымышленный URL и внедряет Selenium Core и набор тестов так, словно они находятся на том же домене.

[1] Прокси - третье лицо, выступающее в роли посредника при передаче данных. Выступает в роли “веб-сервера”, с которого загружается тестируемое приложение. То есть то, что сервер Selenium является прокси, дает ему возможность “врать” о настоящем URL тестируемого приложения.
[2] Браузер запускается сконфигурированным на использование адреса localhost:4444 в качестве HTTP-прокси. Вот почему все HTTP-запросы, отправляемые браузером, так же как и ответы, идут через сервер Selenium, а не напрямую от реального сервера.

Вот схема архитектуры:

../_images/chapt5_img02_Architecture_Diagram_11.png

После запуска тестового набора, написанного на выбранном вам языке, происходит следующее:

  1. Клиент/драйвер устанавливает соединение с сервером Selenium.
  2. Сервер Selenium запускает браузер (или использует уже запущенный) с URL, внедряющим Selenium Core в загружаемую браузером веб-страницу.
  3. Клиент/драйвер передает серверу команду языка Selenium.
  4. Сервер интерпретирует команду и затем вызывает соответствующий JavaScript, исполняющий команду в браузере.
  5. Selenim Core дает браузеру команду выполнить первую инструкцию, обычно это открытие страницы тестируемого приложения.
  6. Браузер получает запрос на открытие и запрашивает содержимое веб-сайта у сервера Selenium (используемого браузером как HTTP-прокси).
  7. Сервер Selenium связывается с веб-сервером, запрашивая страницу. Получив ее, сервер Selenium отправляет страницу браузеру, маскируя источник таким образом, чтобы он выглядел так, будто страница пришла от того же сервера, что и Selenium Core (благодаря чему Selenium Core соблюдается правило ограничения домена).
  8. Браузер получает веб-страницу и отображает в зарезервированном для нее фрейме/окне

Режим повышенных привилегий

Данный подход очень похож на метод внедрения прокси, но основное отличие заключается в том, что браузеры запускаются в специальном режиме, называемом режимом повышенных привилегий, который позволяет веб-сайтам делать обычно не дозволенные вещи (такие, как XSS). При использовании такого режима, Selenium Core может сразу открыть тестируемое приложение и взаимодействовать с его содержимым без необходимости посылать все запросы через сервер Selenium.

Вот схема архитектуры:

../_images/chapt5_img02_Architecture_Diagram_21.png

После запуска тестового набора, написанного на выбранном вам языке, происходит следующее:

  1. Клиент/драйвер устанавливает соединение с сервером Selenium.
  2. Сервер Selenium запускает браузер (или использует уже запущенный) с URL, внедряющим Selenium Core в загружаемую браузером веб-страницу.
  3. Selenium Core получает первую инструкцию от клиента/драйвера (с помощью ещё одного HTTP-запроса к серверу Selenium RC).
  4. Selenium Core выполняет первую инструкцию, обычно это открытие страницы тестируемого приложения.
  5. Браузер получает запрос на открытие и запрашивает страницу у веб-сервера. Как только браузер получает веб-страницу, он отображает ее в зарезервированном для нее фрейме/окне.

Обработка HTTPS и всплывающих окон безопасности

Многие приложения переключаются с HTTP на HTTPS, когда им необходимо передать зашифрованную информацию, например пароли или информацию о кредитной карте. Сегодня это широко распространено среди веб-приложений. В Selenium RC есть поддержка этого.

Чтобы гарантировать что сайт HTTPS является подлинным, браузеру необходим сертификат безопасности. Иначе, когда браузер получает доступ к тестируемому приложению по HTTPS, он станет полагать его не заслуживающим доверия, что выозовет появление всплывающих окон безопасности, которые невозможно закрыть с помощью Selenium RC.

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

Для Selenium 1.0 версии бета 2 и новее используйте *firefox или *iexplore для включения такого режима. В более ранних версиях, включая Selenium RC 1.0 beta 1, используйте *chrome или *iehta для включения режима. Используя эти режимы работы вам не потребуется устанавливать никаких специальных сертификатов безопасности; Selenium RC сделает это за вас.

Для версии 1.0 рекомендуются рабочие режимы *firefox или *iexplore. Однако есть дополнительные режимы:*iexploreproxy и *firefoxproxy. Они предусмотрены только для обеспечения обратной совместимости и должны использоваться только для старых тестов. Их использование приводит к ограничению возможностей по обработке сертификатов безопасности и использованию нескольких окон.

В более ранних версиях Selenium RC рабочие режимы *chrome и *iehta поддерживали HTTPS и обработку всплывающих окон безопасности. Они считались экспериментальными несмотря на то, что были довольно стабильными и многие люди использовали их. Если вы используете Selenium 1.0, то не следует пользоваться этими старыми режимами.

Несколько слов о сертификатах безопасности

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

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

Другой метод, используемый более ранними версиями Selenium, заключался в установке сертификата безопасности Cybervillians, поставляемого вместе с инсталяцией Selenium. Большинство пользователей больше в этом не нуждается. Но если вы запускаете Selenium в режиме внедрения прокси, вам необходимо установить этот сертификат безопасности.

Поддержка дополнительных браузеров и конфигураций браузеров

Помимо Internet Explorer и Mozilla Firefox, Selenium работает и с другими браузерами. Список поддерживаемых браузеров можно найти на SeleniumHQ.org. Кроме того, когда браузер напрямую не поддерживается, вы все равно можете запускать в нем свои Selenium тесты используя ключ “*custom” (вместо *firefox или *iexplore) при запуске браузера тестовым приложением. С его помощью передается путь к исполняемому фалу браузера в вызове API. Это также может быть сделано из сервера в интерактивном режиме.

cmd=getNewBrowserSession&1=*custom c:\Program Files\Mozilla Firefox\MyBrowser.exe&2=http://www.google.com

Выполнение Тестов с различными конфигурациями браузера

Обычно Selenium RC автоматически настраивает браузер. Но если вы запускаете браузер, используя режим выполнения “*custom”, Selenium запустит его “как есть”, без автоматического конфигурирования.

Например вы можете запустить Firefox следующим образом:

cmd=getNewBrowserSession&1=*custom c:\Program Files\Mozilla Firefox\firefox.exe&2=http://www.google.com

Обратите внимание на то, что при запуске браузера подобным образом, следует вручную настроить браузер на использование Selenium Server в качестве прокси. Обычно для этого вам следует открыть свойства браузера и указать “localhost:4444” в качестве HTTP-прокси. Конкретные шаги зависят от использумого вами браузера. Ознакомтесь с документацией своего браузера для получения дополнительной информации.

Имейте в виду, что браузеры Mozilla могут отличаться запуском и завершением работы. Для некоторых необходимо установить переменную окружения MOZ_NO_REMOTE, чтобы сделать их поведение более предсказуемым. Пользователи Unix должны избегать запуска браузера с помощью shell скрипта; лучше использовать непосредственно исполняемый файл (например, firefox-bin).

Поиск и устранение типичных проблем

При начале работы с Selenium RC пользователи часто сталкиваются с некоторыми типичными проблемами. Мы опишем их здесь наряду с решениями.

Невозможно подключиться к серверу

Когда ваша тестовая программа не может подключиться к Selenium Server, вашей тестовой программой будет выдан ошибка. На экран будет выведено сообщение вроде этого:

"Unable to connect to remote server (Inner Exception Message:
 No connection could be made because the target machine actively
 refused it )"

    (using .NET and XP Service Pack 2)

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

Начиная работать с Selenium RC большинство людей запускают тестовые программы (вместе с клиентской библиотекой Selenium) и Selenium Server на одном и том же компьютере. При этом следует использовать в качестве параметра соединения “localhost”. Мы рекомендуем ничнать именно с этого, поскольку в этом случае меньше потенциальных проблем с сетью, с которыми вы можете столкнуться. При том условии, что в вашей ОС сеть и TCP/IP настроены обычным образом, вы не столкнетесь с особыми трудностями. На самом деле, множество людей предпочитает запускать тесты таким образом.

Однако, если вы хотите запустить Selenium Server на удаленной машине, связь должна быть хорошей и TCP/IP соединение между двумя машинами должно быть надежным.

Если у вас возникают трудности, вы можете использовать распространенные сетевые инструменты как ping, telnet, ifconfig(Unix)/ipconfig(Windows) и т. д., чтобы убедиться, что ваше сетевое соединение работает. Если вы не знакомы с ними, вам может помочь вам системный администратор.

Не удается запустить браузер

Да, не самое дружественное сообщение об ошибке, но если Selenium Server не сможет загрузить браузер, скорее всего вы увидите это:

(500) Internal Server Error

Это может быть вызвано следующими причинами.

  • Firefox (до Selenium Server 1.0) не может запустить браузер, потому что он уже открыт, и вы не указали отдельный профиль. См. раздел про профили Firefox в главе Параметры запуска сервера Selenium.
  • Режим запуска, который вы используете, не соответствует ни одному из браузеров на вашей машине. Проверьте параметры которые вы передаете Selenium, когда ваша программа открывает браузер.
  • Вы определили путь к браузеру явно (используя “*custom”, см. выше), но путь является неправильным. Убедитесь, что путь верный. Также посетите пользовательскую группу Selenium, чтобы убедиться, что нет никаких известных проблем с вашим браузером и “*custom” параметрами.

Selenium не может найти тестируемое приложение

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

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

Firefox отказывается завершать работу при подготовке профиля

Чаще всего это происходит тогда, когда вы тестируете с помощью Firefox, но у вас уже есть его запущенные сессии и вы не указали отдельный профиль при запуске сервера Selenium. Ошибка выглядит следующим образом:

Error:  java.lang.RuntimeException: Firefox refused shutdown while
preparing a profile

Вот полное сообщение об ошибке от сервера:

16:20:03.919 INFO - Preparing Firefox profile...
16:20:27.822 WARN - GET /selenium-server/driver/?cmd=getNewBrowserSession&1=*fir
efox&2=http%3a%2f%2fsage-webapp1.qa.idc.com HTTP/1.1
java.lang.RuntimeException: Firefox refused shutdown while preparing a profile
        at org.openqa.selenium.server.browserlaunchers.FirefoxCustomProfileLaunc
her.waitForFullProfileToBeCreated(FirefoxCustomProfileLauncher.java:277)
...
Caused by: org.openqa.selenium.server.browserlaunchers.FirefoxCustomProfileLaunc
her$FileLockRemainedException: Lock file still present! C:\DOCUME~1\jsvec\LOCALS
~1\Temp\customProfileDir203138\parent.lock

Чтобы решить эту проблему, см. раздел “Указание отдельного профиля Firefox”

Проблемы, связанные несовместимостью версий

Убедитесь, что ваша версия Selenium поддерживает версию браузера. Например, Selenium RC 0.92 не поддерживает Firefox 3. Иногда вам может повезти (мне везло). Но не забывайте проверять, какими версиями Selenium какие версии браузеров поддерживаются. В случае сомнений, используйте последнюю версию Selenium с наиболее широко используемой версиией браузера.

Сообщение об ошибке: “(Unsupported major.minor version 49.0)” при запуске сервера

Эта ошибка говорит о том, что вы используете слишком старую версию Java. Selenium требует Java версии 1.5 или выше.

Чтобы проверить какую версию Java вы используете, запустите из командной строки

java -version

Вы должны увидеть сообщение, показывающее версию Java.

java version "1.5.0_07"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_07-b03)
Java HotSpot(TM) Client VM (build 1.5.0_07-b03, mixed mode)

Если вы видите более старый номер версии, возможно, потребуется обновить JRE, или просто добавить его в переменную окружения PATH.

Ошибка 404 при выполнении команды getNewBrowserSession

Если вы получаете сообщение об ошибке 404 при попытке открыть страницу “http://www.google.com/selenium-server/”, причиной этому может быть неправильная конфигурация Selenium сервера в качестве прокси. Каталога “selenium-server” нет на google.com; он появится только тогда, когда должным образом будет сконфигурирован прокси. Настройка прокси во многом зависит от того, как запускается браузер: с помощью *firefox, *iexplore, *opera, или *custom.

  • *iexplore: Если браузер запущен с помощью *iexplore, то проблема может быть связана с настройками прокси для Internet Explorer. Selenium пытается сконфигурировать глобальные настройки прокси в панели настроек Internet Explorer. Вам следует убедиться, что настройки правильно сконфигурированы, после запуска браузера сервером Selenium. Откройте панель настроек Internet Explorer в запущенном браузере. Перейдите на вкладку “Соединения” и проверьте “Настройки LAN”.
    • Если вам необходимо использовать прокси, чтобы получить доступ к тестируемому приложению, вы должны запустить Selenium сервер с параметром “-Dhttp.proxyHost”; см. Настройка прокси для более подробной информации.
    • Вы можете также попытаться сконфигурировать свой прокси вручную и затем запустить браузер в режиме *custom, или *iehta.
  • *custom: Используя *custom вы должны правильно (вручную) сконфигурировать прокси, иначе вы получите ошибку 404. Убедитесь в том что настройки прокси сконфигурированы правильно. Для проверки правильности настроек прокси попытайтесь преднамеренно сконфигурировать браузер неправильно. Попытайтесь настроить браузер так, чтобы он использовал неправильное имя хоста прокси-сервера или неправильный порт. Если вам это удалось, браузер не сможет подключиться к Интернету, что является единственным способом убедиться в том, что браузер устанавливает соответствующие настройки.
  • Для других браузеров (*firefox, *opera) настройки прокси определяются полностью автоматически, на текущий момент не существует известных проблем с данной функциональностью. Если вы все же столкнулись с ошибкой 404 и тщательно следовали этому руководству пользователя, напишите об этом в группу пользователей для получения помощи от сообщества.

Ошибка “В доступе отказано”

Наиболее распространенной причиной этой ошибки является то, что ваша сессия пытается нарушить правило ограничения домена, пересекая доменные границы (например, сначала получает доступ к странице http://domain1, а затем пытается получить доступ к странице http://domain2), или пытается изменять протоколы (меняя http://domainX на https://domainX).

Эта ошибка может также произойти когда JavaScript пытается найти объекты пользовательского интерфейса, которые еще не доступны (прежде, чем страница полностью загрузится), или уже не доступны (после того, как страница начала выгружаться). Чаще всего это происходит со страницами, использующими AJAX, на которых части страницы и вложенные фреймы загружаются и/или перезагружаются независимо от всей страницы.

Эта ошибка может быть плавающей. Часто невозможно воспроизвести проблему, используя отладчик, потому что она связана с условиями динамичного выполнения, которые невозможно воспроизвести когда когда дебаггер подключен к системе. Проблемы доступа немного описаны в руководстве. См. разделы Правило ограничения домена, Внедрение прокси.

Обработка всплывающих окон браузера

Есть несколько видов всплывающих окон, с которыми вы можете столкнуться во время тестирования с помощью Selenium. Иногда вы не сможете закрыть эти всплывающие окна, выполняя команды Selenium, если они инициируются браузером, а не вашим тестируемым приложением. Вам необходимо знать, как управлять ими. К каждому типу всплывающих окон необходимо подходить по-разному.

  • диалоговые окна стандартной HTTP аутентификации: эти диалоговые окна запрашивают имя пользователя и пароль для входа на сайт. Чтобы войти на сайт, который требует стандартную HTTP аутентификацию, используйте имя пользователя и пароль в URL, как описанно в RFC 1738, например: open(“http://имя:пароль@myexample.com/blah”).
  • предупреждения SSL сертификатов: когда Selenium RC включен как прокси, он автоматически пытается принимать SSL сертификаты; см. больше в разделе, посвященном HTTPS. Если ваш браузер сконфигурирован правильно, вы никогда не увидите предупреждений об SSL сертификатах, но возможно вам понадобится настроить ваш браузер доверять нашим опасным “CyberVillains” SSL сертификатам. Обратитесь к разделу, посвященному HTTPS, чтобы узнать, как это сделать.
  • модальные диалоговые окна предупреждений/подтверждений/запросов JavaScript: Selenium пытается скрыть от вас такие диалоговые окна (подменяя функции window.alert, window.confirm и window.prompt), чтобы они не останавливали выполнение кода на вашей странице. Если вы видите предупреждающее всплывающее окно, это, вероятно, потому, что оно возникло во время загрузки страницы, что обычно слишком рано для того, чтобы Selenium успел это предовратить. Язык Selenium содержит команды для проверки предупреждающих и подтверждающих всплывающих окон. См. разделы по этим темам в Главе 4.

Почему сессия браузера Firefox не закрывается на Linux?

В Unix/Linux надо напрямую ссылаться на “firefox-bin”, чтоб быть уверенными, что исполняемый файл будет найден. Если Firefox выполняется через shell-скрипт, когда приходит время остановить браузер, Selenium остановит shell-скрипт, оставив браузер работать. Вы можете указать путь к firefox-bin напрямую:

cmd=getNewBrowserSession&1=*firefox /usr/local/firefox/firefox-bin&2=http://www.google.com

Firefox в режиме *chrome не работает с пользовательским профилем

Проверьте папку профиля Firefox -> prefs.js -> user_pref(“browser.startup.page”, 0); Закомментируйте строку “//user_pref (“browser.startup.page ”, 0);” и попробуйте снова.

Нормально ли загружать пользовательские всплывающие окна во время загрузки родительской страницы (т. е. до выполнения javascript функции window.onload() родительской страницы)?

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

IE и атрибут style

Если вы запускаете тесты в Internet Explorer, вы можете столкнуться с проблемами при поиске элементов, используя атрибут style. Например:

//td[@style="background-color:yellow"]

Это будет прекрасно работать в Firefox, Opera или Safari, но не в IE. IE интерпретирует ключи в @style в верхнем регистре. Таким образом, даже если исходный код в нижнем регистре, вы должны использовать:

//td[@style="BACKGROUND-COLOR:yellow"]

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

Произошла ошибка - “Не удается преобразовать объект в примитивное значение” с остановкой браузера *googlechrome

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

selenium.start("commandLineFlags=--disable-web-security");

Где я могу задать вопросы на которые здесь нет ответа?

Попробуйте посетить нашу пользовательськую группу

Спонсоры перевода








Go to top