Введение

Довольно просто дополнить Selenium своими проверками, действиями и локаторами. Это делается с помощью JavaScript, добавлением методов к прототипам объектов Selenium и PageBot. Во время загрузки Selenium автоматически просматривает методы этих прототипов используя шаблоны имен для определения того, что из является действием, что проверкой, а что локатором. Ниже приведены примеры того, как Selenium может быть расширен с помощью JavaScript.

Действия

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

Пример: Добавление действия “typeRepeated” в Selenium, которое будет дважды печатать текст в текстовое поле.

Selenium.prototype.doTypeRepeated = function(locator, text) {
        // Все стратегии поиска автоматически обрабатываются
        // с помощью "findElement"
        var element = this.page().findElement(locator);
        // Создает текст для заполнения поля
        var valueToType = text + text;
        // Заменяет содержание текстового поля новым текстом
        this.page().replaceText(element, valueToType);
};

Считыватели и Проверки

Все getFoo и isFoo методы в прототипе Selenium добавляются как считыватели (storeFoo). Для каждого считывателя также регистрируются “assertFoo”, “verifyFoo” и “waitForFoo”. Метод проверки может принимать до двух параметров, которые будут записаны в тест как значения второй и третьей колонки. Также можно создать свои собственные проверки как простые методы “assert”, которые также автоматически сгенерируют команды “verify” и “waitFor”.

Пример: добавление проверки “valueRepeated”, которая проверяет, что значение элемента содержит указанный текст дважды. В тестах также будут доступны команды “assertValueRepeated” и “verifyValueRepeated”.

Selenium.prototype.assertValueRepeated = function(locator, text) {
        // Все стратегии поиска автоматически обрабатываются
        // с помощью "findElement"
        var element = this.page().findElement(locator);
        // Определяется текст для проверки
        var expectedValue = text + text;
        // Получается фактическое значение элемента
        var actualValue = element.value;
        // Проверяется, совпадает ли фактическое значение с ожидаемым
        Assert.matches(expectedValue, actualValue);
};

Автоматически доступные методы storeFoo, assertFoo, assertNotFoo, waitForFoo и waitForNotFoo для каждого getFoo

Все getFoo и isFoo методы в прототипе Selenium автоматически добавляют “storeFoo”, “assertFoo”, “assertNotFoo”, “verifyFoo”, “verifyNotFoo”, “waitForFoo” и “waitForNotFoo” команды. Например, при добавлении метода “getTextLength()” автоматически станут доступны команды: “storeTextLength”, “assertTextLength”, “assertNotTextLength”, “verifyTextLength”, “verifyNotTextLength”, “waitForTextLength” и “waitForNotTextLength”.

Selenium.prototype.getTextLength = function(locator, text) {
        return this.getText(locator).length;
};

Также стоит заметить, что метод “assertValueRepeated”, описанный выше, можно было реализовать с помощью “isValueRepeated”, который также бы добавил автоматически дополнительно сгенерированные “assertNotValueRepeated”, “storeValueRepeated”, “waitForValueRepeated” и “waitForNotValueRepeated”.

Локаторы

Все методы “locateElementByFoo” в прототипе PageBot добавляются как локаторы. Они принимают два параметра: первый - это строка поиска (без префикса), и второй - документ, в котором необходимо произвести поиск.

Пример: добавление локатора “valuerepeated=”, который находит первый элемент, у которого значение аттрибута value равно дважды повторенному указанному значению.

// "inDocument" - документ, в котором происходит поиск
PageBot.prototype.locateElementByValueRepeated = function(text, inDocument) {
        // создает текст для поиска
        var expectedValue = text + text;
        // Проходит по всем элементам в поиске того,
        // значение которого равняется ожидаемому значению
        var allElements = inDocument.getElementsByTagName("*");
        for (var i = 0; i < allElements.length; i++) {
                var testElement = allElements[i];
                if (testElement.value && testElement.value === expectedValue) {
                        return testElement;
                }
        }
        return null;
};

Использование пользовательских расширений с Selenium IDE

Пользовательские расширения можно легко использовать с Selenium IDE.

  1. Создайте свое пользовательское расширение и сохраните его как “user-extensions.js”. Такое имя не является технической необходимостью, но использование однообразных имен - хорошая практика.
  2. Откройте Firefox и Selenium IDE.
  3. Нажмите Tools, затем Options.
  4. В Selenium Core Extensions нажмите Browse и найдите файл “user-extensions.js”. Нажмите OK.
  5. Закройте и перезапустите Selenium IDE, чтобы загрузить свое пользовательское расширение.
  6. Создайте новую команду в своем тесте. Ваше пользовательское расширение должно быть теперь доступно в меню Commands.

Использование пользовательских расширений с Selenium RC

Если искать в Google “Selenium RC user-extension” десять раз, можно найти десять разных способов как их использовать. Ниже приведен официально предлагаемый Selenium подход.

Пример

C#

  1. Положите свое пользовательское расширение в директорию с Selenium Server.
  2. Если вы используете клиентский код, сгенерированный с помощью Selenium IDE, вам нужно сделать несколько небольших правок. Сначала нужно создать объект “HttpCommandProcessor” в границах класса (вне метода “SetupTest”, сразу после “private StringBuilder verificationErrors;”)
HttpCommandProcessor proc;
  1. Затем создайте объект “HttpCommandProcessor” таким же образом, как и объект “DefaultSelenium”. Это можно сделать в методе SetupTest.
proc = new HttpCommandProcessor("localhost", 4444, "*iexplore", "http://google.ca/");
  1. Создайте объект “DefaultSelenium” используя созданный объект “HttpCommandProcessor”.
selenium = new DefaultSelenium(proc);
  1. Теперь можно использовать пользовательское расширение в коде тестов с помощью вызова метода “DoCommand()” объекта “HttpCommandProcessor”. Этот метод принимает два аргумента. Первый аргумент - это строка, которая является названием метода пользовательского расширения, который вы хотите использовать. Второй аргумент - это массив строк, который передает аргументы метода. Обратите внимание, что первая буква имени метода должна быть в нижнем регистре, независимо от того, в каком регистре находится первая буква оригинального имени метода пользовательского расширения. Selenium автоматически это делает, чтобы соблюдать соглашение об именах в JavaScript. Поскольку JavaScript - регистрозависимый язык, ваш тест завершится неудачей, если первая буква имени будет заглавной. inputParams - это массив параметров, которые вы хотите передать методу пользвательского JavaScript расширения. В данном примере передается только одна строка в массиве, поскольку метод принимает только один параметр. Для более длинного массива каждый его элемент будет передан в соответсвующий параметр метода. Помните, что пользовательские расширения для Selenium IDE могут принимать лишь до двух параметров.
string[] inputParams = {"Hello World"};
proc.DoCommand("alertWrapper", inputParams);
  1. Запустите ваш тестовый сервер используя аргумент “-userExtensions” и передайте файл “user-extensinos.js” в значении аргумента.
java -jar selenium-server.jar -userExtensions user-extensions.js
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;
                private HttpCommandProcessor proc;

 [SetUp]
                public void SetupTest()
                {
                        proc = new HttpCommandProcessor("localhost", 4444, "*iexplore", "http://google.ca/");
                        selenium = new DefaultSelenium(proc);
                        //selenium = new DefaultSelenium("localhost", 4444, "*iexplore", "http://google.ca/");
                        selenium.Start();
                        verificationErrors = new StringBuilder();

                }

 [TearDown]
                public void TeardownTest()
                {
                        try
                        {
                                selenium.Stop();
                        }
                        catch (Exception)
                        {
                                // Ignore errors if unable to close the browser
                        }
                        Assert.AreEqual("", verificationErrors.ToString());
                }

 [Test]
                public void TheNewTest()
                {
                        selenium.Open("/");
                        string[] inputParams = {"Hello World",};
                        proc.DoCommand("alertWrapper", inputParams);
                }
        }
}

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








Go to top