AT.info ПОСИДЕЛКИ  vKontakte   facebook группа  
HTML

RoutineBot

Поставщик: 
AKS-Labs
Распространение: 
Платный
Цена: 
$495

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

Ключевые преимущества:

  • Позволяет автоматизировать визуальное тестирование двумя методами - разрабатывая скрипты как вручную, так и посредством записи.  
  • Поддерживает Pascal, JavaScript и Basic языки программирования.
  • Может автоматизировать большое количество событий - события мышки(нажатие, передвижение), клавиатуры(ввод текста), делать скриншоты, загружать и сохранять данные, скачивать файлы, работать с приложениями и окнами.
  • Поддериживает широкое количество функций для логирования событий(генерация html лога с предоставление скриншотов)

Поддерживаемые технологии: 
Windows Forms, Flex, SilverLight, HTML, Ajax, Pascal, JavaScript и Basic
Поддерживаемые ОС: 
Windows
Язык тестов: 
Pascal
Язык тестов: 
JavaScript
Язык тестов: 
Basic
Тестируемые приложения: 
Windows Forms, Flex, SilverLight, HTML, Ajax

GUIdancer

Поставщик: 
Bredex
Распространение: 
Платный
Цена: 
200.00 ?
GUIdancer это мощный Eclipse-based инструмент для автоматизации функционального тестирования через графический интерфейс(GUI). 
Инструмент основан на проекте Jubula, чтобы увеличить продуктивность и комфорт в работе.

Что умеет Jubula:

  • Test specification
  • Test execution
  • Test analysis
  • Continuous integration
    Поддерживаемые технологии: 
    Swing, SWT/RCP, GEF, HTML, Java
    Поддерживаемые ОС: 
    Windows
    Поддерживаемые ОС: 
    Linux
    Поддерживаемые ОС: 
    MacOS X
    Язык тестов: 
    Keyword-driven
    Тестируемые приложения: 
    Swing, SWT/RCP, GEF, HTML, Firefox, Safari, InternetExplorer

Автоматизация приемочного тестирования с помощью Robot Framework: обзор Robot Framework

часть 1

Пример: ROBOT FRAMEWORK

В этом разделе представлен короткий пример Robot Framework, который использует систему, над которой мы работали много лет назад. При самой разработке не использовались A-TDD или Robot Framework, то есть пример – новый, система – старая. Это система среднего размера (большие продукты с более сложных или незнакомых доменов сложно использовать в качетсве примера на нескольких страницах.), но, все же, этот пример демонстрирует принципиальные моменты, которые будут актуальными и для среды большего размера.

Robot Framework –фреймворк для автоматизации, использующий keyword-driven подход, созданный Pekka Kl?rck (Ранее Pekka Laukkanen)  в Nokia Siemens Networks в 2005. Одной из его ранних целей была поддержка A-TDD. Он стал бесплатным в 2008 г. и доступен на www.robotframework.org.

Продукт, используемый в нашем случае – информационная система для конференций, разработанная для конференц-центра. Доступ к системе можно получить через «информационные стойки», расположенные по всему конференц-центру.

Senior QA Engineer

International company is looking for Senior QA Engineer to expand its team in Kiev office.

REQUIREMENTS:

  • More than 3 years practical experience in Quality Assurance in IT industry;
  • More than 2 years experience in testing web applications;
  • Excellent knowledge of Internet / Web technologies including web browsers, HTTP, HTML and XML;
  • Good knowledge of SQL;
  • Experience with development / coding is a plus;
  • Excellent analytical skills;
  • English: Upper-intermediate level.

COMPANY OFFERS:

  • High salary and attractive compensation package;
  • External and internal training programs including English courses;
  • An opportunity for business trips;
  • Office in the center of Kiev.

Компания: 
IT Recruitment Solutions
Город: 
Киев (Kiev)
Страна: 
Украина
Инструменты: 
SilkTest, QTP, TestComplete, Visual Studio
Ориентировочная зарплата: 
1,300-2,500 USD в месяц
Контакт: 
Please, send your CV marked «Senior QA Engineer» in the subject via e-mail: resume@itrs.com.ua, Tel.: +38 (044) 228-7618

Разработчик автоматических тестов

Ищу разработчика автоматических тестов\Test automation Developer:

Основные требования:

  • Высшее техническое образование;
  • Опыт разработки .NET приложений около двух лет;
  • Общий опыт создания автоматических тестов;
  • Опыт создания автоматических тестов веб приложений;
  • Опыт создания автоматических тестов SOAP веб сервисов;
  • Опыт в тестировании производительности и масштабируемости;
  • Понимание тестирования (процесса, подходов, методологий, цикла разработки ПО);
  • Базовые навыки в HTML, JavaScript;
  • Базовые навыки в базах данных, знание основ SQL;
  • Опыт работы с инструментами тестирования в Visual Studio 2008, 2010.

Функциональные обязанности:

  • Дизайн архитектуры и создание модульного решения автоматического тестирования;
  • Разработка и автоматизация функциональных тестов;
  • Разработка и автоматизация тестов веб UI;
  • Разработка и автоматизация тестов SOAP веб сервисов;
  • Разработка тестов производительности и нагрузочных тестов;
  • Разработка и документирование методологии автоматизации тестирования;
  • Запуск автоматических тестов и создание отчетов по результатам;
  • Создание детальных отчетов об ошибках обнаруженных автоматическими тестами.

Компания: 
hr-maverick.com
Город: 
Киев (Kiev)
Страна: 
Украина
Инструменты: 
Visual Studio 2008
Ориентировочная зарплата: 
от 1,800 USD в месяц
Контакт: 
twitter: nikavika, skype:vprydatko, icq:315164564

Selenium RC: Дружим с XPath

При работе с Selenium доступ к объектам осуществляется через локаторы - строки, идентифицирующие объект, над которым проводится то или иное действие. Наиболее удобными и наиболее быстрыми являются локаторы, определенные по ID объекта ( у каждого объекта на HTML странице может быть определен атрибут ID, причем он должен быть уникальным ). Ну уж если не определен ID, то как минимум для элементов форм есть атрибуты Name, через которые тоже достаточно удобно и просто работать. Но в общем случае, приходится работать с большим многообразием объектов, причем и действия приходится делать самые разнообразные. Например: 

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

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

  1. Во-первых, данный способ задания местоположения объекта оперирует с фактическими HTML-тегами, что дает возможность формировать локаторы исходя из непосредственно HTML-кода страницы, который можно просмотреть.
  2. Во-вторых, есть возможность задать некоторую иерархию объектов, при этом пропустить варьируемые элементы (удобно, когда надо вычислить элемент внутри таблицы, не привязываясь к конкретным ячейкам).
  3. В-третьих, элемент можно задать используя как теги, так и определенные значения атрибутов, причем можно проверить на частичное соответствие (удобно, когда элемент уникально идентифицируется обработчиком некоторого события). 
  4. В-четвертых, в Selenium есть отдельный метод, который позволит нам узнать количество элементов, удовлетворяющих заданному XPath, а такде возможность использовать индексы, что позволяет выделить и перебирать целую коллекцию элементов.

А теперь перейдем к практической составляющей. Допустим, у нас есть набор различных графиков в виде bar-chart или pie-chart, причем при клике на каждый элемент происходит переход на некоторую страницу. Реализация в HTML подобного имеет вид:

<map>
      <area href="ref1">
      <area href="ref2">
      <area href="ref3">
      ...
      <area href="ref1">
      <img src="some_img.gif"> 
</map>

вот таких map-блоков произвольное количество. В каждом из этих блоков произвольное количество элементов area. Но везде есть ссылки и на эти area-объекты мы можем сделать клик. Итак, как можно организовать обработку всех активных областей всех диаграмм. Вначале, мы узнаем, сколько же всего этих диаграмм присутствует. Предположим, что у нас уже есть проинициализированный объект Selenium-a и мы уже на нужной странице. Соответственно, реализация имеет вид (далее все примеры приводятся с использованием синтаксиса Java, но по аналогии переносится на остальные языки, на которых реализован Selenium-клиент):

int chartsCount = selenium.getXPathCount( "//map" ).intValue();

Selenium RC (Java): Основные операции в действии (Часть 3)

Часть 2

Работа с модальными окнами

Отдельно стоит рассмотреть такой момент как работа Selenium-а с различными модальными окнами. В данном случае подразумеваются диалоги, которые инициируются вызовом функций вроде openDialog в JScript. В результате работы таких функций открывается новая веб-старница в отдельном модальном окне. Также, как правило подобные окна характеризуются наличием идентификатора.

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

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

Теперь посмотрим, что у нас есть для того, чтобы нормально обрабатывать подобные ситуации.

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

Далее, перед тем как начать работать с элементами внутри появившегося диалога, мы должны перенести фокус на это окно, чтобы Selenium посылал команды конкретному окну. Для этого используется метод selectWindow. В качестве параметра ему надо указать имя данного модального диалога. Обычно оно указывается при вызове openDialog.

Если мы передадим в качестве параметра строку "null", то будет выбрано основное окно. Обычно подобной инструкцией завершается блок кода, работающего внутри модального окна.

Но есть случаи, когда мы не можем получить имя данного окна. Либо его тяжело искать, либо оно динамическое. В-общем, нюансов может быть много, но это не повод считать подобные задачи невыполнимыми. В ряде случаев удобно пользоваться различными приемами.

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

String[] winIDs = selenium.getAllWindows();
selenium.selectWindow( winIDs[ winIDs.length - 1 ] );

Selenium: знакомимся с локаторами

При работе с Селениумом практически первое, с чем придется столкнуться - это локаторы. Что это такое? Локатор - это строка, уникально идентифицирующая UI-элемент. Когда вы делаете клик мышкой, ввод текста и прочие действия, вы эти действия выполняете над вполне конкретным объектом. Селениум поступает так же. Но поскольку он не умеет читать ваши мысли, то ему надо четко указать объект, для которого надо применить то или иное действие.

Где локаторы используются? Посмотрите на методы, отвечающие за ввод/извлечение данных из элементов управления (это методы click, type, select, isElementPresent, keyPress и т.п.). Первым параметром подобных методов всегда идет локатор.

Итак, какие виды локаторов бывают:

  • id=<element_id> - соответствует элементу, у которого атрибут id равен значению element_id. Например, у нас есть элемент, который в HTML записывается так:
    <input type=text id='some_input_id' name='some_input_name' value='' />
    В этом случае локатор будет иметь вид: id=some_input_id.
    Также следует отметить, что данный вид локаторов является одним из самых быстрых в нахождении и одним из самых уникальных. Это связано с тем, что в DOM-структуре ссылки на элементы, у которых задан ID, хранятся в отдельной таблице и через JScript (собственно именно через него осуществляется доступ к элементам на конечном уровне) обращение к элементам по ID идет достаточно короткой инструкцией, наподобие some_input_id.
  • name=<element_name> - соответствует элементу, у которого атрибут name равен значению element_name. Эффективно применяется при работе с полями ввода формы (кнопки, текстовые поля, выпадающие списки). Как правило, значения элементов формы используются в запросах, которые идут на сервер и как раз атрибут name в этих запросах ставит в соответствие поле и его значение. Если брать предыдущий пример:
    <input type=text id='some_input_id' name='some_input_name' value='' />
    то данный элемент может быть также идентифицирован локатором вида name=some_input_name.
    Данный тип локаторов тоже является достаточно быстрым в нахождении, но менее уникальным, так как на странице может быть несколько форм, у которых могут быть элементы с одинаковым именем.
  • dom=<dom_object> - данный тип локатора позволяет обращаться к элементу так же, как и в DHTML используя DOM-структуру. Данный тип локатора используется нечасто, так как обычно находятся более удобные аналоги, но тем не менее данная возможность есть.
  • link=<link_text> - специально для ссылок используется отдельно зарезервированный тип локаторов, который находит нужную ссылку по ее тексту. Это сделано отчасти потому, что ссылки как правило не имеют таких атрибутов как ID или name. Соответственно, ссылка, которая в HTML записывается так:
    <a href='http://some_url'>Link Text 2345</a>
    в Селениуме идентифицируется локатором link=Link Text 2345.

    И небольшой частный случай: у ссылки есть фиксированная часть и есть часть, которая может варьироваться. Допустим, в предыдущем примере у нас число может варьироваться. В этом случае мы можем использовать wildcards, в частности '*'. В этом случае, мы можем идентифицировать ссылку локатором вида: link=Link Text* и данный локатор будет соответствовать первой ссылке, текст которой будет начинаться с 'Link Text'.
  • xpath=<xpath_locator> - наиболее универсальный тип локаторов. Как XPath формируется. HTML, как и его более обобщенная форма - XML, представляет собой различное сочетание тегов, которые могут содержать вложенные теги, а те в свою очередь тоже могут содержать теги и т.д. То есть ,выстраивается определенная иерархия, наподобие структуры каталогов в файловой системе. И задача XPath - отразить подобный путь к нужному элементу, с учетом иерархии. Например, XPath вида:
    A/B/C/D
    указывает на некоторый элемент с тегом D, который находится внутри тега C, а тот в свою очередь - внутри тега B, который находится внутри тега A, который находится на самом верхнем уровне иерархии.

    Если брать использование XPath в Селениуме, то там зачастую полный путь указывать не нужно, более того, вредно, особенно, если вложенность тега нужного елемента достаточно высока. Как правило, удобно указывать путь, начиная с некоторого промежуточного элемента, пропуская теги более высокого порядка. Например, такой XPath: //table/tbody/tr/td/a ссылается на первую ссылку в первой строке тела первой таблицы. Обратите внимание на начало данной записи. Строка '//' означает, что поиск элемента начинается с некоторого произвольного места.

    У XPath есть много удобств, но есть и основной недостаток - низкая скорость нахождения объекта. В частности, с подобной проблемой можно столкнуться при работе с IE, так как при работе с XPath под IE используются JScript-библиотеки, которые не отличаются высокой скоростью выполнения. В таких случаях рекомендуется воспользоваться CSS-локаторами (см. ниже), но в некоторых случаях от XPath уйти не получится.

    Более подробно про синтаксис XPath можно почитать, например, здесь.
  • css=<css_path> - данный тип локаторов основан на описаниях таблиц стилей (CSS), соответственно и синтаксис такой же. В отличие от локаторов по ID, по имени или по тексту ссылки, данный тип локаторов может учитывать иерархию объектов, а также значения атрибутов, что делает его ближайшим аналогом XPath. А в силу того, что объект находится по данному локатору быстрее, чем XPath, рекомендуется прибегать к помощи CSS вместо XPath.

    Более подробно о синтаксисе CSS можно узнать здесь.

Selenium RC (Java): Основные операции в действии. Часть 1

Часть 2

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

Мы будем рассматривать работу селениума на примере Java клиента, но все подходы и заморочки аналогичны для других языков. Также, изначально предполагается, что селениум-сервер и клиентские библиотеки уже установлены и настроены нужным образом, так что на эти вещи мы не будем отвлекаться. Если у вас с этим есть проблемы, то для начала вам сюда. Также желательно быть знакомым с Java, хотя бы на базовом уровне, так как данный пост не предназначен для введения в Java.

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

Для нашего примера нужно создать тестовый HTML файл, в котором будут основные элементы, с которыми мы будем работать. Создадим файл index.htm и поместим его в корневой каталог диска C: . Если вы хотите поместить этот файл в другой каталог, то вам надо будет просто поменять абсолютный путь к файлу и учитывать это вдальнейшем при рассмотрении данного примера.

Итак, поместим в наш HTML-файл содержимое вида:

<html>
<body>
	<form name="sample_form">
		<table>
		<tr><td width="100%"><fieldset><legend>Text fields</legend>
			<table>
				<tr>
					<td><label for="text_field">Simple text field:</td>
					<td><input type=text id="text_field" value="" /></td>
				</tr>
				<tr>
					<td valign=top><label for="text_area">Text Area:</td>
					<td><textarea id="text_area" name="text_area" cols=30 rows=5></textarea></td>
				</tr>
			</table>
		</fieldset></td></tr>
		<tr><td width="100%"><fieldset><legend>Radio buttons/Check boxes</legend>
			<table>
				<tr>
					<td><label for="radio_1">Item 1:</td>
					<td><input type=radio id="radio_1" name="radio_btn" checked /></td>
				</tr>
				<tr>
					<td><label for="radio_2">Item 2:</td>
					<td><input type=radio id="radio_2" name="radio_btn"/></td>
				</tr>
				<tr>
					<td valign=top><label for="check_box">Check box:</td>
					<td><input type=checkbox name="check_box" /></td>
				</tr>
				<tr>
					<td valign=top><label for="ev_check_box">Check box with event:</td>
					<td><input type=checkbox name="ev_check_box" onclick="deactivated_btn.disabled=!this.checked;"/></td>
				</tr>

			</table>
		</fieldset></td></tr>

		<tr><td width="100%"><fieldset><legend>Buttons</legend>
			<table>
				<tr>
					<td><b><div id="clicked_text"></div></b></td>
				</tr>
				<tr>
					<td>
					<input type=button id="deactivated_btn" value="Deactivated" onclick="clicked_text.innerHTML=deactivated_btn.value;"/>
					<input type=button id="btn_1" value="First"  onclick="clicked_text.innerHTML=btn_1.value;"/>
					<button id="btn_2" onclick="clicked_text.innerHTML=btn_2.innerHTML;return false;">Second</button>
					</td>
				</tr>

			</table>
		</fieldset></td></tr>
		<tr><td width="100%"><fieldset><legend>Lists</legend>
			<table>
				<tr>
					<td><label for="single_list">Single selection list:</td>
					<td>
					<select id="single_list" />
						<option selected>Option 1</option>
						<option>Option 2</option>
						<option>Option 3</option>
					</select>
					</td>
				</tr>
				<tr>
					<td valign=top><label for="multi_list">Multi selection list:</td>
					<td>
						<select id="multi_list" MULTIPLE>
						<option>Multi Option 1</option>
						<option>Multi Option 2</option>
						<option>Multi Option 3</option>
						</select>
					</td>
				</tr>
			</table>
		</fieldset></td></tr>
		<tr width="100%"><td width="100%"><fieldset><legend>File input</legend>
			<table>
				<tr>
					<td valign=top><label for="file_input">File upload:</td>
					<td><input type=file name="file_field" /></td>
				</tr>
			</table>

		</fieldset></td></tr>

		<tr><td><fieldset><legend>Dialog boxes</legend>
			<table>
				<tr>
					<td>
						<input type=button id="alert_btn" value="Call Alert"onclick="alert('This is Alert');"/>
						<input type=button id="conf_btn" value="Call Confirmation"  onclick="confirm('This is confirmation');"/>
						<input type=button id="prompt_btn" value="Call Prompt"  onclick="prompt('Enter prompt text')"/></td>
				</tr>
			</table>

		</fieldset></td></tr>

		</table>
	</form>
</body>
</html>

Достаточно просто скопировать данный текст и вставить его в нужный HTML-файл.

Осталось только создать тестовый класс, в котором мы будем добавлять код. Создайте пакет com.example.tests и создайте в нем класс NewTest, который наследуется от SeleneseTestCase класса. После этого каркас теста имеет вид:

package com.example.tests;
// We specify the package of our tests

import com.thoughtworks.selenium.*;
// This is the driver's import. You'll use this for instantiating a
// browser and making it do what you need.

import java.util.regex.Pattern;
// Selenium-IDE add the Pattern module because it's sometimes used for
// regex validations. You can remove the module if it's not used in your
// script.

public class NewTest extends SeleneseTestCase {
// We create our Selenium test case

      public void setUp() throws Exception {
        setUp("c:\\index.htm", "*firefox");
             // We instantiate and start the browser
      }

      public void testNew() throws Exception {
           selenium.open("c:\\index.htm");
     }
}

Этот каркас взят из примеров в документации к селениуму. Просто были сделаны небольшие корректировки. Итак, приступаем.

RSS-материал