Selenium

IDE. Web Driver. Server. Grid. Gemini

Жигалов Сергей

Автотесты или ручное тестирование?

choice

Ручное тестирование

  • Интерфейс приложения часто меняется
  • Эффективно в краткосрочной перспективе
  • Меньше эффекта пестицида

Автотесты

  • проводить чаще регрессионное тестирование
  • отчет о состоянии продукта
  • обнаружить ошибки, которые были пропущены на стадии ручного тестирования

Selenium

это инструмент для автоматизированного управления браузерами
selenium

Selenium

selenium-ide Selenium IDE
selenium-web-driver Selenium WebDriver
selenium-server Selenium Server + Selenium Grid

Краткая история Selenium

В 2004 году, Джейсон Хаггис ... ядро было реализовано на JavaScript, многие вещи было невозможно осуществить из-за ограничений безопасности браузеров ... Selenium

Краткая история Selenium

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

Краткая история Selenium

В 2008 году, слияние Selenium и WebDriver ... Selenium 2 (или Selenium Webdriver)

Поддерживаемые браузеры и платформы

  • Google Chrome
  • Microsoft Internet Explorer
  • Microsoft Edge
  • Mozilla Firefox
  • Opera
  • HtmlUnit
  • PhantomJS
  • Android (with Selendroid or appium)
  • iOS (with ios-driver or appium)

Selenium IDE

(Integrated Development Environment, интегрированная среда разработки) — это инструмент, используемый для разработки тестовых сценариев.

Selenium IDE Установка

firefox
addons.mozilla.org

Selenium IDE Запуск

selenium-ide-run

Selenium IDE Интерфейс

selenium-ide-view

Selenium IDE Сценарий теста

lodash
open /docs/4.17.4
sendKeys css=input[type="search"] filter
click css=.react-menu-container li:not(.hidden)>a
assertLocation https://lodash.com/docs/4.17.4#filter

Selenium IDE Выполнение теста

selenium-ide-expert

Selenium IDE Сценарий теста

expert-hello-test
open /adv/expert/exam/hello
click css=.checkbox__control
clickAndWait link=Начать тестирование
click css=.radiobox__control
click //button[@type='button']
waitForText css=div.attempt-progress__text 9% пройдено
...
waitForText link=Вернуться на главную Сертификации Вернуться на главную Сертификации

Команды Selenium

  • Действия
  • Считывания
  • Проверки

Команды Selenium Действия

  • click
  • dragAndDrop
  • type
  • submit
  • sendKeys
  • ...

Команды Selenium ДействияAndWait

  • clickAndWait
  • dragAndDropAndWait
  • typeAndWait
  • submitAndWait
  • sendKeysAndWait
  • ...AndWait

Команды Selenium Считывания

Команда Цель Значение
storeСтепанname
storeElementPresent//div/formhasForm
storeText//h1title
storeEvalstoredVars['title'].toLowerCase()header

Команды Selenium Проверки

Команда Цель Значение
assertValue id=result 15120
verifyValue id=result 15120
waitForValue id=result 15120

Команды Selenium Аргументы

Команда Цель Значение
goBackAndWait  
verifyTextPresent Добро пожаловать на мою страницу
typeid=phone(555) 666-7066
typeid=address1${myVariableAddress}

Локатор

цель, идентифицирующая элемент на странице веб-приложения

Локатор Идентификатор

  • identifier=loginForm
  • id=loginForm
  • name=username
  • link=Начать тестирование

Локатор XPath

  • xpath=/html/body/form[1]
  • //form[1]
  • //form[@id='loginForm']/input[4]
  • //input[@name='continue'][@type='button']

Локатор DOM

  • dom=document.getElementById('loginForm')
  • dom=document.forms[0]
  • document.forms[0].elements[3]

Локатор CSS

  • css=form#loginForm
  • css=input[name="username"]
  • css=#loginForm input[type="button"]

Соответствия шаблону

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

Шаблоны Подстановка

  • glob:*кот*
  • glob:[0-9]

Шаблоны Регулярные выражения

  • regexpi:.*кот.*
  • regexp:\d

Шаблоны Точное совпадение

  • exact:котёнок

DEMO

Selenium IDE

    Автоматизация рутины

    Знакомство с командами Selenium

    Работает только в Firefox

Работа с Selenium из кода

Задача

  1. Открыть http://www.google.com
  2. Набрать `webdriver` в строке поиска
  3. Кликнуть по кнопке

selenium-webdriverjs


driver.get('http://www.google.com');
driver.findElement(webdriver.By.id('q')).sendKeys('webdriver');
driver.findElement(webdriver.By.id('btnG')).click();
        

WD.js


browser
    .get("http://www.google.com")
    .elementById('q')
    .sendKeys('webdriver')
    .elementById('btnG')
    .click()
        

webdriverio


client
    .url('http://google.com')
    .setValue('#q','webdriver')
    .click('#btnG')
        

webdriverio Standalone Mode

Для запуска скриптов

Установка selenium-server


# Загружаем selenium-server
curl -O http://selenium-release.storage.googleapis.com/3.0/selenium-server-standalone-3.4.0.jar

# Загружаем и распаковываем geckodriver
curl -L https://github.com/mozilla/geckodriver/releases/download/v0.16.0/geckodriver-v0.16.0-macos.tar.gz | tar xz

# Запускаем selenium-server
java -jar -Dwebdriver.gecko.driver=./geckodriver selenium-server-standalone-3.4.0.jar
        
difficult

Установка selenium-server


# Установка selenium-standalone
npm install selenium-standalone --save-dev

# Установка необходимых драйверов браузеров
./node_modules/.bin/selenium-standalone install

# Запуск сервера
./node_modules/.bin/selenium-standalone start
        

# Устанавливаем webdriverio
npm install webdriverio --save-dev
        

const webdriverio = require('webdriverio');
const options = {
    desiredCapabilities: {
        browserName: 'firefox'
    }
};
webdriverio
    .remote(options)
    .init()
    .url('http://www.google.com')
    .getTitle()
    .then(title => console.log('Title was: ' + title))
    .end();
        

# Запускаем google-script.js
node google-script.js
>  Title was: Google
        

webdriverio Standalone Mode

Автоматизированный запуск

Подходит только для скриптов

Promise-интерфейс

Не параллелится

Локально нет всех браузеров

webdriverio The WDIO Testrunner

Для запуска тестов

./node_modules/.bin/wdio config
        

// tests/google-test.js
const assert = require('assert');

describe('Google page', () => {
    it('should have correct title', () => {
        browser.url('http://www.google.com');

        const actual = browser.getTitle();
        assert.equal(actual, 'Google');
    });
});
        

./node_modules/.bin/wdio wdio.conf.js
        

const assert = require('assert');

describe('Converter page', () => {
    it('should convert value', () => {
        browser.url(
            'https://urfu-2016-convertor.herokuapp.com/convert.html');

        browser.setValue('#value', '1.5');
        browser.setValue('#from', 'week');
        browser.setValue('#to', 'min');
        browser.click('#send');
        browser.waitForValue('#result', 2000);

        const actual = browser.getValue('#result');
        assert.equal(actual, '15120');
    });
});
        

webdriverio The WDIO Testrunner

Автоматизированный запуск

Синхронный интерфейс

Параллельный запуск тестов

Локально нет всех браузеров

Selenium Grid

saucelabs-logo browserstack-logo testingbot-logo

saucelabs Переменные окружения

Use Environment Variables for Authentication Credentials

export SAUCE_USERNAME="your Sauce username"
export SAUCE_ACCESS_KEY="your sauce access key"
        

saucelabs Конфигурация


./node_modules/.bin/wdio config
        

saucelabs Таймауты


// wdio.conf.js
{
    mochaOpts: {
        timeout: 30000
    }
}
        

./node_modules/.bin/wdio wdio.conf.js
        

webdriverio GRID

Автоматизированный запуск

Синхронный интерфейс

Параллельный запуск тестов

Все браузеры

Тестирование скриншотами

Gemini

Gemini Установка


npm install gemini --save-dev
        

Gemini Конфигурация


module.exports = {
    rootUrl: 'https://urfu-2016-convertor.herokuapp.com',
    gridUrl: `http://${process.env.SAUCE_USERNAME}:${process.env.SAUCE_ACCESS_KEY}@ondemand.saucelabs.com:80/wd/hub`,

    browsers: {
        chrome: {
            desiredCapabilities: {
                browserName: 'chrome'
            }
        }
    }
};
        

Gemini Снимок


// gemini/converter-test.js

gemini.suite('Converter', (suite) => {
    suite.setUrl('/convert.html')
        .setCaptureElements('.container')
        .capture('enabled');
});
        

Gemini Снимок


// gemini/converter-test.js

gemini.suite('Converter', (suite) => {
    suite.setUrl('/convert.html')
        /* ... */
        .capture('disabled', (actions, find) => {
            const from = find('#from');
            actions.sendKeys(from, 'Invalid value');
        });
});
        

Gemini Запуск


# Создаём эталонные снимки
./node_modules/.bin/gemini update

# Тестируем
./node_modules/.bin/gemini test
        

Gemini gemini-gui


# Устанавливаем gemini-gui
npm install gemini-gui --save-dev

# Запускаем gemini-gui
./node_modules/.bin/gemini-gui
        

Gemini Удаляем символ


gemini.suite('Converter', (suite) => {
    suite.setUrl('/convert.html')
        /* ... */
        .capture('disabled', (actions, find) => {
            const from = find('#from');
            actions
                .sendKeys(from, gemini.BACK_SPACE)
                .sendKeys(from, 'Invalid value');
        });
});
        

Gemini Рекомендации

  • Проверять блоки, а не страницу
  • Не снимать динамические элементы
  • Тестировать все состояния

Почитать