tag:blogger.com,1999:blog-53230293909520173752023-11-15T23:32:22.438-08:00Selenium для всехБлог посвящен автоматизации в тестировании и не только.Алексейhttp://www.blogger.com/profile/18264724295847697355noreply@blogger.comBlogger50125tag:blogger.com,1999:blog-5323029390952017375.post-47637092961546414572015-04-16T15:15:00.001-07:002015-04-16T15:15:07.239-07:00Автоматизируй это!<div dir="ltr" style="text-align: left;" trbidi="on">
В данном Посте поговорим не про автоматизацию тестов, а про автоматизацию вообще всего( тестов, окружений, рутинных действий, настроек и прочего прочего...)<br />
<br />
<h3 style="text-align: center;">
Нужно ли это?</h3>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTzogqnPzjKbR1kIv9oXZkBG7ZT0uIV4-aU9ZcjX8DqpT-4ZPlNgFMVcaj69uPeiaPDwKhtE2RQPVbv07OPjlCoPIt9JJ9xajWNefO7NbImkYQDXrpfvo4bW82RnLCyDU-GOIHnbRFQgZV/s1600/60699216.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTzogqnPzjKbR1kIv9oXZkBG7ZT0uIV4-aU9ZcjX8DqpT-4ZPlNgFMVcaj69uPeiaPDwKhtE2RQPVbv07OPjlCoPIt9JJ9xajWNefO7NbImkYQDXrpfvo4bW82RnLCyDU-GOIHnbRFQgZV/s1600/60699216.jpg" /></a></div>
От многих можно услышать такое возражение: <i>"У нас нет времени автоматизировать это - мы и так загружены по самое `не могу`". </i><br />
Есть еще такой вариант: <i>"Мы погрязнем в этой автоматизации по самые помидоры и только и будем делать что править и чинить в ней что-то!"</i><br />
Я по своему опыту могу сказать однозначно - это <i>нужно, </i>но все это необходимо внедрять постепенно и аккуратно.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHCIYgOICEV3WBHHPCln1h3Cxr442NePZ9uhtvRHO2OKS2DeEkkNgKS5VkcqjsNqPMygrqAEFMdL_J3FziSCpTkuyowi7pMTsdV0fYa_WbJOSQ1C02nfwPO3Z_gIKx2yAyWQqEHtQMyuR1/s1600/60699246.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHCIYgOICEV3WBHHPCln1h3Cxr442NePZ9uhtvRHO2OKS2DeEkkNgKS5VkcqjsNqPMygrqAEFMdL_J3FziSCpTkuyowi7pMTsdV0fYa_WbJOSQ1C02nfwPO3Z_gIKx2yAyWQqEHtQMyuR1/s1600/60699246.jpg" height="263" width="320" /></a></div>
<br />
Так все-таки: автоматизация это хорошо или плохо? Быть ей или не быть?<br />
Ответ на этот вопрос неоднозначный. Давайте рассмотрим все плюсы и минусы ручного подхода и автоматизации.<br />
<br />
Плюсы:<br />
<br />
<ul>
<li>Избавляемся от человеческого фактора</li>
<li>Возрастает скорость выполнения тасков (количество закрытых человекотасков в день)</li>
<li>Появиться больше возможностей</li>
</ul>
<br />
Минусы:<br />
<br />
<ul style="text-align: left;">
<li>Это может быть дороже </li>
<li>Начальная разработка может занять много времени</li>
<li>Постоянная поддержка и доработка</li>
</ul>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTVfz1Rml8JMnYOs2OCc_JUkIeN0ljUaTXPSD-zCHvCkiLoJKxpTZ1DAGd7cDeRNfYUdWpFSbTro0FH4MXLVj08GzH2gpC4YEtI8l7EuPVJpaBx_o9AMBfTICr7tik25vhT-6_ldMUR6-d/s1600/60699508.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTVfz1Rml8JMnYOs2OCc_JUkIeN0ljUaTXPSD-zCHvCkiLoJKxpTZ1DAGd7cDeRNfYUdWpFSbTro0FH4MXLVj08GzH2gpC4YEtI8l7EuPVJpaBx_o9AMBfTICr7tik25vhT-6_ldMUR6-d/s1600/60699508.jpg" height="240" width="320" /></a></div>
<br />
Уважаемый читатели хочется услышать ваше мнение относительно вопроса автоматизации.<br />
Возможно весь этот скомканный сумбур это только мое мнение.</div>
Алексейhttp://www.blogger.com/profile/18264724295847697355noreply@blogger.com2tag:blogger.com,1999:blog-5323029390952017375.post-14707168145539566262015-03-27T03:52:00.001-07:002015-03-27T03:53:37.178-07:00Блог жив! <div dir="ltr" style="text-align: left;" trbidi="on">
Уважаемые читатели, после долгого переыва у меня наконец-то появилось немного времени для ведения блога. И в ближайшее время постараюсь наполнить его парочкой интересных постов. </div>
Алексейhttp://www.blogger.com/profile/18264724295847697355noreply@blogger.com0tag:blogger.com,1999:blog-5323029390952017375.post-44447891291627413852013-11-11T06:11:00.001-08:002013-11-20T22:42:09.107-08:00Сравнение скорости работы наиболее популярных языков для автоматизации( обновление, добавлен PHP)<div dir="ltr" style="text-align: left;" trbidi="on">
Заголовок немного неверный, но не знал как написать лучше. На самом деле мы будем сравнивать байндинги языков для вебдрайвера.<br />
<br />
В качестве единого теста для всех будет использоваться один сценарий:<br />
<br />
<br />
<ol style="text-align: left;">
<li>Открываем страницу http://yopolis.ru/site/login</li>
<li>Вводим данные для авторизации</li>
<li>Кликаем по кнопке войти</li>
<li>Проверяем что присутствует элемент со ссылкой на профиль пользователя</li>
</ol>
Итак код теста:<br />
<br />
Java:<br />
<br />
<pre class="prettyprint lang-java">package com.yopolis.tests;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.seleniumhq.selenium.fluent.FluentWebDriver;
import org.seleniumhq.selenium.fluent.Period;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import static org.openqa.selenium.By.*;
import static org.seleniumhq.selenium.fluent.Period.secs;
public class YopolisExample {
Long start=null;
WebDriver wd=null;
FluentWebDriver fwd=null;
Long stop =null;
@Before
public void setUp(){
start = System.currentTimeMillis();
wd = new FirefoxDriver();
fwd = new FluentWebDriver(wd);
}
@Test
public void firstTest(){
wd.get("http://yopolis.ru/site/login");
fwd.input(id("LoginForm_username")).sendKeys("****@yandex.ru");
fwd.input(name("LoginForm[password]")).sendKeys("******");
fwd.button(name("yt0")).click();
assertThat(fwd.within(secs(5)).has().link(xpath("//a[contains(@href,'/profile')]")),is(true));
}
@After
public void tearDown(){
wd.close();
stop = System.currentTimeMillis();
System.out.println("That took " + (double)((stop - start)/1000) + " seconds");
}
}
</pre>
Ruby:<br />
<br />
<pre class="prettyprint lang-rb">require('selenium/webdriver')
beginning = Time.now
wd= Selenium::WebDriver.for :firefox
wd.navigate.to "http://yopolis.ru/site/login"
wd.find_element(:id,'LoginForm_username').send_keys "****@yandex.ru"
wd.find_element(:name,'LoginForm[password]').send_keys "******"
wd.find_element(:name,'yt0').click
puts wd.find_element(:xpath,'//a[contains(@href,"/profile")]').displayed?
wd.close
puts "Time elapsed #{Time.now - beginning} seconds"
</pre>
Python:<br />
<br />
<pre class="prettyprint lang-py">from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from datetime import datetime
startTime = datetime.now()
driver = webdriver.Firefox()
driver.get("http://yopolis.ru/site/login")
driver.find_element_by_id("LoginForm_username").send_keys("****@yandex.ru")
driver.find_element_by_name("LoginForm[password]").send_keys("******")
driver.find_element_by_name("yt0").click()
wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.XPATH,'//a[contains(@href,"/profile")]')))
driver.quit()
print(datetime.now()-startTime)
</pre>
WebDriverJs:<br />
<br />
<pre class="prettyprint lang-js">var assert=require('assert');
var webdriver = require('selenium-webdriver'),
SeleniumServer = require('selenium-webdriver/remote').SeleniumServer;
var server = new SeleniumServer('/Users/aalekseev/selenium-server-standalone-2.37.0.jar', {
port: 4444
});
server.start();
console.time('test exec');
var driver = new webdriver.Builder().
usingServer(server.address()).
withCapabilities(webdriver.Capabilities.firefox()).
build();
driver.get("http://yopolis.ru/site/login");
driver.findElement(webdriver.By.id("LoginForm_username")).sendKeys("****@yandex.ru");
driver.findElement(webdriver.By.name("LoginForm[password]")).sendKeys("******");
driver.findElement(webdriver.By.name("yt0")).click();
var disp=driver.findElement(webdriver.By.xpath('//a[contains(@href,"/profile")]')).isDisplayed();
assert.ok(disp);
driver.quit().then(function(){
console.timeEnd('test exec');
});
server.stop();
</pre>
PHP:<br />
Используется: php-webdriver <br />
<pre class="prettyprint lang-php">$start = time();
$capabilities = array(WebDriverCapabilityType::BROWSER_NAME => 'firefox');
$driver = RemoteWebDriver::create('http://localhost:4444/wd/hub', $capabilities);
$driver->get("http://yopolis.ru/site/login");
$driver->findElement(WebDriverBy::id('LoginForm_username'))->sendKeys("****@yandex.ru");
$driver->findElement(WebDriverBy::name('LoginForm[password]'))->sendKeys("******");
$driver->findElement(WebDriverBy::name('yt0'))->click();
try {
echo $driver->findElement(WebDriverBy::xpath('//a[contains(@href,"/profile")]'))->isDisplayed();
} catch (NoSuchElementWebDriverError $e) {
}
$driver->close();
echo "Time elapsed ".(time()-$start)." seconds";
</pre>
<span style="font-size: large;">Результаты:</span>
<span style="font-size: large;">Java: 14 секунд</span><br />
<span style="font-size: large;">Ruby: 8 секунд</span><br />
<span style="font-size: large;">Python: 7 секунд</span><br />
<span style="font-size: large;">JS: 20 секунд</span><br />
<span style="font-size: large;">PHP: 9 секунд</span><br />
<br /></div>
Алексейhttp://www.blogger.com/profile/18264724295847697355noreply@blogger.com4tag:blogger.com,1999:blog-5323029390952017375.post-55936512249554743142013-10-11T02:19:00.000-07:002013-10-11T02:19:44.392-07:00Вакансия<div dir="ltr" style="text-align: left;" trbidi="on">
Коллеги у нас в компании открылась вакансия в отделе тестирования.<br />
Все желающие могут ознакомится с ней тут:<br />
<a href="http://hh.ru/vacancy/8844923">http://hh.ru/vacancy/8844923</a></div>
Алексейhttp://www.blogger.com/profile/18264724295847697355noreply@blogger.com0tag:blogger.com,1999:blog-5323029390952017375.post-1833173655521800482013-09-12T22:38:00.002-07:002013-09-16T02:16:25.176-07:00Selenium IDE - одно из самых скачиваемых дополнений<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="font-family: Arial, sans-serif;"><span style="font-size: 19px;">25 июля количество загрузок Selenium IDE превысило 10 миллионов !</span></span><br />
<span style="font-family: Arial, sans-serif;"><span style="font-size: 19px;">Пруф письмо:</span></span><br />
<blockquote class="b-quote b-quote_toplevel b-quote_odd b-quote_expanded" data-blockquote-level="1" data-blockquote-processed="true" style="background-color: white; border: 0px none; font-family: Arial, sans-serif; font-size: 15px; line-height: 21px; margin: 40px 0px; padding: 0px; position: relative;" type="cite">
<div class="b-quote__i" style="border-color: rgb(216, 216, 216); border-left-style: solid; border-left-width: 2px; color: #666666; overflow: hidden; padding-left: 0.5em; position: relative;">
<div data-blockquote-processed="true" data-quotes-fixed="true">
<blockquote class="b-quote b-quote_even b-quote_expanded" data-blockquote-level="2" data-blockquote-processed="true" style="border: 0px none; margin: 40px 0px; padding: 0px; position: relative;" type="cite">
<div class="b-quote__i" style="border-color: rgb(190, 204, 238); border-left-style: solid; border-left-width: 2px; color: #5c729a; overflow: hidden; padding-left: 0.5em; position: relative;">
Hi,<br />
<br />
I thought you would like to know that the total Selenium IDE downloads has crossed 10 Million on 25/July/2013. Thanks Patrick for the logs! And thanks to everyone that has contributed to its success.<br />
<br />
Cheers,<br />
Samit Badle<br />
Selenium IDE Maintainer<br />
Twitter: @samitbadle<br />
Blog: <a class="daria-goto-anchor" data-orig-href="http://blog.reallysimplethoughts.com/" data-vdir-href="https://mail.yandex.ru/re.jsx?h=a,JEIpkptsKdPaABvhxuS-sw&l=aHR0cDovL2Jsb2cucmVhbGx5c2ltcGxldGhvdWdodHMuY29tLw" href="http://blog.reallysimplethoughts.com/" target="_blank">http://blog.re<wbr style="display: inline-block;"></wbr>allysimplethou<wbr style="display: inline-block;"></wbr>ghts.com/</a></div>
</blockquote>
</div>
</div>
</blockquote>
</div>
Алексейhttp://www.blogger.com/profile/18264724295847697355noreply@blogger.com0tag:blogger.com,1999:blog-5323029390952017375.post-56683445825661374812013-07-24T23:49:00.001-07:002013-07-24T23:49:56.375-07:00PhantomJS 1.9.2<div dir="ltr" style="text-align: left;" trbidi="on">
По информации с <a href="https://github.com/ariya/phantomjs/issues/11452" target="_blank">гитхаба</a> в ближайшее время выйдет в релиз <a href="http://phantomjs.org/" target="_blank">PhantomJS</a> 1.9.2 + <a href="https://github.com/detro/ghostdriver/" target="_blank">GhostDriver </a>1.0.4<br />
<br />
Что ожидает нас в новой версии:<br />
<br />
<ol style="text-align: left;">
<li>Обновление Qt</li>
<li>Фикс багов GhostDriver( и фикс самого страшного <a href="https://github.com/detro/ghostdriver/issues/202" target="_blank">бага</a>, который не дает нормально использовать GhostDriver для автоматизации страниц с аяксом)</li>
</ol>
<br />
<br />
<br /></div>
Алексейhttp://www.blogger.com/profile/18264724295847697355noreply@blogger.com0tag:blogger.com,1999:blog-5323029390952017375.post-17307469898331072722013-07-22T22:58:00.001-07:002013-07-22T22:58:22.547-07:00Facebook возобновил работу над php-webdriver <div dir="ltr" style="text-align: left;" trbidi="on">
Недавно лазил по репозиторию facebook на гитхабе и обратил внимание на их старый репозиторий с php-webdriver.<br />
Последнее обновление репозитория состоялось 4 дня назад, и это после двухлетнего перерыва.<br />
Как написано в репозитории клиент для вебдрайвера был полностью переписан с нуля, и предоставляет api наиболее близкий к Java и С#.<br />
<br />
К сожалению этого репозитория пока что нет в composer. Но надеюсь он скоро появится и можно будет смигрировать все тесты на него.<br />
<br />
ссылки:<br />
<a href="https://github.com/facebook/php-webdriver" target="_blank">php-webdriver</a><br />
<br />
другие версии php-webdriver<br />
<a href="https://github.com/voodoo144/PHP-WebDriver" target="_blank">NearSoft PHPWebdriver</a><br />
<a href="https://github.com/Element-34/php-webdriver" target="_blank">adam goucher</a><br />
<br />
также другие имплементации можно найти в composer</div>
Алексейhttp://www.blogger.com/profile/18264724295847697355noreply@blogger.com3tag:blogger.com,1999:blog-5323029390952017375.post-7476707698398549532013-06-20T06:23:00.003-07:002013-06-20T06:23:41.268-07:00Заметка о фикстурах: добро это или зло?<div dir="ltr" style="text-align: left;" trbidi="on">
<h4 style="text-align: left;">
<span style="font-size: large;">Что такое фикстуры?</span></h4>
Автоматические тесты необходимо выполнять неоднократно. Мы хотели бы выполнять<br />
тесты в некоторых известных состояниях для гарантии повторяемости процесса<br />
тестирования. Эти состояния называются фикстуры. Например, для тестирования<br />
функции создания записи в приложении блога, каждый раз, когда мы выполняем<br />
тесты, таблицы, хранящие соответствующие данные о записях (например, таблицы<br />
Post, Comment), должны быть восстановлены к некоторому фиксированому<br />
состоянию.<br />
<br />
Данное определение взято из документации фреймворка <a href="http://www.yiiframework.com/doc/guide/1.1/ru/test.fixture" target="_blank">Yii</a>. Я с ним полностью согласен и считаю что от смены языка и смены фреймворка данное определение не изменится.<br />
<h4 style="text-align: left;">
<span style="font-size: large;">Добро?</span></h4>
<div>
Сначала кратко расскажу о плюсах использования фикстур:</div>
<div>
<ol style="text-align: left;">
<li>Всегда есть возможность откатить систему к идеальному состоянию</li>
<li>Возможность хранить и использовать большой объем тестовых данных</li>
<li>Ожидаемое поведение тестов на наборе данных</li>
</ol>
</div>
Казалось бы теперь можно отказаться от генерации в функциональных тестах нужных сущностей( т. е. например не создавать новый пост напрямую в браузере, а загрузить его в базу из фикстуры), база работает очень быстро.<br />
<br />
<h4 style="text-align: left;">
<span style="font-size: large;">Зло?</span></h4>
<div>
Теперь о минусах:<br />
<br />
<ol style="text-align: left;">
<li>Невозможно запускать тесты в параллельном режиме так как могут возникать локи в базе данных при накатывании фикстур</li>
<li>При огромном количестве фикстур их поддержка может занимать продолжительное время</li>
<li>При сильно связанной базе может иногда проблематично накатить ограниченный набор фикстур( приходится накатывать их все, а это занимает продолжительное время)</li>
</ol>
<h4 style="text-align: left;">
<span style="font-size: large;">Выводы</span></h4>
<div>
Работа с фикстурами в тестах всегда оставляет двоякое впечатление. До определенного предела они помогают, но когда их становится слишком много и тесты начинают сильно на них завязываться, фикстуры начинают мешать.</div>
<div>
<br /></div>
<div>
Перед использованием фикстур в ваших авто-тестах стоит неоднократно подумать.</div>
</div>
</div>
Алексейhttp://www.blogger.com/profile/18264724295847697355noreply@blogger.com0tag:blogger.com,1999:blog-5323029390952017375.post-58992291365405043742013-04-25T22:38:00.001-07:002013-04-25T22:40:13.901-07:00SQADays-13<div dir="ltr" style="text-align: left;" trbidi="on">
Сегодня в 9-30 началась крупнейшая в восточной Европе конференция по тестированию.<br />
<br />
http://it-conf.ru/ru/content/579.htm</div>
Алексейhttp://www.blogger.com/profile/18264724295847697355noreply@blogger.com0Санкт-Петербург, Россия59.9395237 30.31202059999998359.430154200000004 29.021127099999983 60.4488932 31.602914099999982tag:blogger.com,1999:blog-5323029390952017375.post-26159310704974731872013-02-22T02:47:00.002-08:002013-02-22T02:47:38.020-08:00PageObject for PHP<div dir="ltr" style="text-align: left;" trbidi="on">
Думаю нет нужды рассказывать про паттерн PageObject и то как он реализован в байндингах для Java, C# и других языков.<br />
<br />
Сегодня я расскажу как реализовать его на PHP. Вы скажите что для PHP есть множество версий клиента и универсальный паттерн будет сделать тяжело... Нет не тяжело скажу я вам.<br />
<br />
Нужно просто использовать возможности языка и среды разработки.<br />
<br />
Итак приступим:<br />
<span style="background-color: white;"><br /></span>
<span style="background-color: white; color: #444444; font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><php</span><br />
<span style="background-color: white; color: #444444; font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> /**</span><br />
<span style="background-color: white; color: #444444; font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> * описываем тут наши элементы из массива чтоб среда разработки о них знала</span><br />
<span style="background-color: white; color: #444444; font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> * @property element1</span><br />
<span style="background-color: white; color: #444444; font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> * @property element2</span><br />
<span style="background-color: white; color: #444444; font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> */</span><br />
<span style="background-color: white; color: #444444; font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> class SimplePage{</span><br />
<span style="background-color: white; color: #444444; font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> </span><br />
<span style="background-color: white; color: #444444; font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> </span><span style="background-color: white; color: #38761d; font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">//наш драйвер, не важно из какого клиента</span><br />
<span style="background-color: white; color: #444444; font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> protected $driver;</span><br />
<span style="background-color: white; color: #444444; font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> </span><br />
<span style="background-color: white; color: #444444; font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> </span><span style="background-color: white; color: #38761d; font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">// конструктор</span><br />
<span style="background-color: white; color: #444444; font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> public __construct($driver){</span><br />
<span style="background-color: white; color: #444444; font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> $this->driver=$driver;</span><br />
<span style="background-color: white; color: #444444; font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> }</span><br />
<span style="background-color: white; color: #444444; font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> </span><br />
<span style="background-color: white; color: #444444; font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> </span><span style="background-color: white; color: #38761d; font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">//собственно элементы на стрнаице в виде массива</span><br />
<span style="background-color: white; color: #444444; font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> private $elements=array(</span><br />
<span style="background-color: white; color: #444444; font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> "element1"=>"//xpath1",</span><br />
<span style="background-color: white; color: #444444; font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> "element2"=>"//xpath2",</span><br />
<span style="background-color: white; color: #444444; font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> );</span><br />
<span style="background-color: white; color: #444444; font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> </span><br />
<span style="background-color: white; color: #444444; font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> </span><span style="background-color: white; color: #38761d; font-family: Helvetica Neue, Arial, Helvetica, sans-serif;">//начинается магия</span><br />
<span style="background-color: white; color: #444444; font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> public function __get($name){</span><br />
<span style="background-color: white; color: #444444; font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> if (array_key_exists($name, $this->elements)){</span><br />
<span style="background-color: white; color: #444444; font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> </span><span style="background-color: white; color: #38761d; font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> // каюсь тут уже придется использовать конкретный код из клиента</span><br />
<span style="background-color: white; color: #38761d; font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> // в нашем случае отсюда https://github.com/voodoo144/PHP-WebDriver</span><br />
<span style="background-color: white; color: #444444; font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> return $this->driver->findElement(By::xPath($this->elements[$name]));</span><br />
<span style="background-color: white; color: #444444; font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> }</span><br />
<span style="background-color: white; color: #444444; font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> }</span><br />
<span style="background-color: white; color: #444444; font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><br /></span>
<span style="background-color: white; color: #444444; font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> }</span><br />
<br />
<br />
Пример использования:<br />
<br />
$page = new SimplePage($driver);<br />
$page->element1; <span style="color: #38761d;">//вернет WebElement c xpath1</span><br />
$page->element2; <span style="color: #38761d;">//вернет WebElement c xpath2</span><br />
<br />
<br />
Надеюсь код получисля довольно очевидным. И если честно мне он нравится намного больше чем версия для Java.<br />
<br /></div>
Алексейhttp://www.blogger.com/profile/18264724295847697355noreply@blogger.com2tag:blogger.com,1999:blog-5323029390952017375.post-4209844755510092882013-02-12T05:32:00.001-08:002013-02-12T05:33:19.134-08:00Почему скриптовые языки лучше для автоматизации?<div dir="ltr" style="text-align: left;" trbidi="on">
Вопрос в заголовке - это скорее вопрос к пользователям и к самому себе.<br />
С недавних пор перешел с Java на PHP... и понял насколько тяжеловесным был код тестов на java и как тяжело они писались и отлаживались по сравнению с ними-же на PHP.<br />
<br />
Я бы хотел услышать в комментариях различные точки зрения на этот счет. Уважаемые читатели если вас не затруднит напишите пару строчек своих мыслей по этому поводу. Заранее огромное спасибо.<br />
<br />
Почему я думаю что скриптовые языки лучше:<br />
<br />
1. Отсутствует избыточность синтаксиса<br />
2. У динамических языков более широкие возможности для организации кода, нежели у статических. (замыкания, трейты, лямбда-функции)<br />
3. Легкость чтения кода (тут конечно можно поспорить...)</div>
Алексейhttp://www.blogger.com/profile/18264724295847697355noreply@blogger.com4tag:blogger.com,1999:blog-5323029390952017375.post-64857989235410530472013-02-12T05:21:00.000-08:002013-02-12T05:21:08.840-08:00Современная автоматизация web-приложений<div dir="ltr" style="text-align: left;" trbidi="on">
Данная статья за моим авторством была опубликована в журнале "Tester's Life" в декабрьском выпуске.<br />
<br />
Выложить статью для всех кто не видел журнал руки дошли только сейчас...<br />
<br />
<b id="internal-source-marker_0.7424848566297442" style="font-weight: normal;"><span style="font-family: Verdana; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">Современная автоматизация веб-приложений.</span><br /><span style="background-color: white; font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Автоматизированный тест – это скрипт или программа, которая имитирует взаимодействия пользователя с приложением для нахождения дефектов в приложении. Данное определение справедливо пожалуй только для GUI тестирования.</span><br /><span style="background-color: white; font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">К авто-тестам также можно отнести и модульное тестирование — процесс в программировании, позволяющий проверить на корректность отдельные модули исходного кода программы.</span><br /><span style="background-color: white; font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">В современном мире автоматизация тестирования все чаще используется при разработке программного обеспечения. С появлением множества методик и инструментов автоматизация выходит на новый уровень своего развития.</span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="color: #666666; font-family: Verdana; font-size: 15px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">Прошлое автоматизации</span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">На сегодняшний день автоматизация тестирования завоевывает все большую популярность. Множество компаний наконец-то усматривают в автоматизации больше плюсов, нежели минусов. Но так было не всегда.</span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Первые упоминания об автоматизации тестирования относятся к 70 годам двадцатого века, их можно найти в книге Фредерика Брукса </span><span style="background-color: white; font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">«Мифический человеко-месяц или Как создаются программные системы». В данной книге речь в первую очередь шла о модульном тестировании.</span><br /><span style="background-color: white; font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="background-color: white; font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Но по-настоящему автоматизация тестирования стала развиваться только в 1980-х годах.</span><br /><span style="background-color: white; font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">В те годы стало появляться большое количество различных фреймворков и утилит.</span><br /><span style="background-color: white; font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Стала так-же зарождаться автоматизация тестирования пользовательских интерфейсов.</span><br /><span style="background-color: white; font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="background-color: white; font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Данный тип автоматизации прошел несколько этапов своего становления:</span><br /><span style="background-color: white; font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span></b><br />
<ol style="margin-bottom: 0pt; margin-top: 0pt;">
<li dir="ltr" style="font-family: Verdana; font-size: 15px; list-style-type: decimal; vertical-align: baseline;"><b id="internal-source-marker_0.7424848566297442" style="font-weight: normal;"><span style="background-color: white; vertical-align: baseline; white-space: pre-wrap;">Утилиты записи и воспроизведения (capture/playback tools) записывают действия тестировщика во время ручного тестирования. Они позволяют выполнять тесты без прямого участия человека в течение продолжительного времени, значительно увеличивая продуктивность и устраняя «тупое» повторение однообразных действий во время ручного тестирования. В то же время, любое малое изменение тестируемого ПО требует перезаписи ручных тестов. Поэтому это первое поколение инструментов не эффективно и не масштабируемо.</span></b></li>
<li dir="ltr" style="font-family: Verdana; font-size: 15px; list-style-type: decimal; vertical-align: baseline;"><b id="internal-source-marker_0.7424848566297442" style="font-weight: normal;"><span style="background-color: white; vertical-align: baseline; white-space: pre-wrap;">Сценарии (Scripting) — форма программирования на языках, специально разработанных для автоматизации тестирования ПО — смягчает многие проблемы capture/playback tools. Но разработкой занимаются программисты высокого уровня, которые работают отдельно от тестировщиков, непосредственно запускающих тесты. К тому же скрипты более всего подходят для тестирования GUI и не могут быть внедренными, пакетными или вообще каким-либо образом объединены в систему. Наконец, изменения в тестируемом ПО требуют сложных изменений в соответствующих скриптах, и поддержка все возрастающей библиотеки тестирующих скриптов становится в конце концов непреодолимой задачей.</span></b></li>
<li dir="ltr" style="font-family: Verdana; font-size: 15px; list-style-type: decimal; vertical-align: baseline;"><b id="internal-source-marker_0.7424848566297442" style="font-weight: normal;"><span style="background-color: white; vertical-align: baseline; white-space: pre-wrap;">Data-driven testing — методология, которая используется в автоматизации тестирования. Особенностью является то, что тестовые скрипты выполняются и верифицируются на основе данных, которые хранятся в центральном хранилище данных или БД. Роль БД могут выполнять ODBC-ресурсы, csv или xls файлы и т. д. Data-driven testing — это объединение нескольких взаимодействующих тестовых скриптов и их источников данных в фреймворк, используемый в методологии. В этом фреймворке переменные используются как для входных значений, так и для выходных проверочных значений: в тестовом скрипте обычно закодированы навигация по приложению, чтение источников данных, ведение логов тестирования. Таким образом, логика, которая будет выполнена в скрипте, также зависит от данных.</span></b></li>
<li dir="ltr" style="font-family: Verdana; font-size: 15px; list-style-type: decimal; vertical-align: baseline;"><b id="internal-source-marker_0.7424848566297442" style="font-weight: normal;"><span style="background-color: white; vertical-align: baseline; white-space: pre-wrap;">Keyword-based - методология основанная на предпосылке что любые бизнес-события, представляющие каждое приложение, могут быть представлены в виде короткого текстового описания или ключевого слова и связанным с ним значением параметра. Например, большинство веб-приложений требуют от пользователя пройти аутентификацию, Ключевым словом для этого бизнес-события может быть "Logon User" и параметры могут быть "ID пользователя" и "Пароль". На этапе проектирования тестировщики разрабатывают ключевые слова для описания отдельных функциональных бизнес-событий, тестировщики начинают строить общую библиотеку ключевых слов. Все слова из этой библиотеки могут быть использованы для создания тест-кейсов.</span></b></li>
</ol>
<b id="internal-source-marker_0.7424848566297442" style="font-weight: normal;"><span style="background-color: white; font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Многие компании предпочитают не связываться с автоматизацией ввиду ее большой затратности. </span><span style="background-color: white; font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"> Несмотря на то, что оно позволяет устранить часть рутинных операций и ускорить выполнение тестов, большие ресурсы могут тратиться на обновление самих тестов.</span><br /><span style="background-color: white; font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Про автоматизацию веб-приложений в то время речь вообще не заходила.</span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Во-первых не было утилит для такой автоматизации, а во-вторых не было веб-приложений. )))</span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="color: #666666; font-family: Verdana; font-size: 15px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">Современная автоматизация веб-приложений</span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Интернет вошел в нашу жизнь давно и прочно. И различными веб-приложениями мы пользуемся не задумываясь. Все эти приложения нужно тестировать, плохо написанным и не оттестированным приложением пользоваться никто не будет, более того ошибки в таких приложениях могут привести к существенным проблемам у пользователей, и даже к потере денег.</span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Примером может служить любая система интернет-банкинга, каждый день миллионы пользователей через нее совершают различные платежи, открытие и закрытие счетов и другие операции с денежными средствами. Любая ошибка в таких системах недопустима, так как она может привести к потере денежных средств средств или даже к публикации приватных данных пользователя.</span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Сегодня многие компании начинают понимать все плюсы автоматизации тестирования, связано это с разрастанием программных продуктов и веб-приложений до невероятных размеров. Представьте что команде тестировщиков поручили протестировать сервис наподобии Yandex или Amazon, на одно только регрессионное тестирование могут уйти годы, так как функционал системы просто огромен. Компаниям требуется инструмент или методика, которая позволит увеличить покрытие тестами и сократит время на регрессионное тестирование.</span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Вот тут на сцену и выходит автоматизация. На сегодняшний день разработано огромное количество утилит и фреймворков, которые могут помочь тестировщикам автоматизировать процесс тестирования. Приведу лишь краткий список:</span><br /><ul style="margin-bottom: 0pt; margin-top: 0pt;">
<li dir="ltr" style="font-family: Verdana; font-size: 15px; list-style-type: disc; vertical-align: baseline;"><span style="vertical-align: baseline; white-space: pre-wrap;">Selenium</span></li>
<li dir="ltr" style="font-family: Verdana; font-size: 15px; list-style-type: disc; vertical-align: baseline;"><span style="vertical-align: baseline; white-space: pre-wrap;">Watir</span></li>
<li dir="ltr" style="font-family: Verdana; font-size: 15px; list-style-type: disc; vertical-align: baseline;"><span style="vertical-align: baseline; white-space: pre-wrap;">Watij</span></li>
<li dir="ltr" style="font-family: Verdana; font-size: 15px; list-style-type: disc; vertical-align: baseline;"><span style="vertical-align: baseline; white-space: pre-wrap;">Watin</span></li>
<li dir="ltr" style="font-family: Verdana; font-size: 15px; list-style-type: disc; vertical-align: baseline;"><span style="vertical-align: baseline; white-space: pre-wrap;">phpBrowser</span></li>
<li dir="ltr" style="font-family: Verdana; font-size: 15px; list-style-type: disc; vertical-align: baseline;"><span style="vertical-align: baseline; white-space: pre-wrap;">Geb</span></li>
<li dir="ltr" style="font-family: Verdana; font-size: 15px; list-style-type: disc; vertical-align: baseline;"><span style="vertical-align: baseline; white-space: pre-wrap;">ZombieJS</span></li>
<li dir="ltr" style="font-family: Verdana; font-size: 15px; list-style-type: disc; vertical-align: baseline;"><span style="vertical-align: baseline; white-space: pre-wrap;">PhantomJS</span></li>
<li dir="ltr" style="font-family: Verdana; font-size: 15px; list-style-type: disc; vertical-align: baseline;"><span style="vertical-align: baseline; white-space: pre-wrap;">HtmlUnit</span></li>
<li dir="ltr" style="font-family: Verdana; font-size: 15px; list-style-type: disc; vertical-align: baseline;"><span style="vertical-align: baseline; white-space: pre-wrap;">Codeception</span></li>
<li dir="ltr" style="font-family: Verdana; font-size: 15px; list-style-type: disc; vertical-align: baseline;"><span style="vertical-align: baseline; white-space: pre-wrap;">Thucydides</span></li>
<li dir="ltr" style="font-family: Verdana; font-size: 15px; list-style-type: disc; vertical-align: baseline;"><span style="vertical-align: baseline; white-space: pre-wrap;">Siculi</span></li>
</ul>
<span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">И этих фреймворков с каждым годом становится все больше. Не случайно что в этом списке я привел только фреймворки, которые распространяются бесплатно, но также существует ряд проприетарных программных продуктов. При выборе инструмента для автоматизации компании необходимо оценить сколько потребуется сил на доработку бесплатного фреймворка, или же дешевле будет купить платное решение, так-же на решение компании оказывают влияние такие факторы как возможности масштабирования фреймворка, качество поддержки фреймворка со стороны разработчиков, наличие специалистов.</span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Фактически все бесплатные фреймворки можно разделил на 2 большие группы:</span><br /><ol style="margin-bottom: 0pt; margin-top: 0pt;">
<li dir="ltr" style="font-family: Verdana; font-size: 15px; list-style-type: decimal; vertical-align: baseline;"><span style="vertical-align: baseline; white-space: pre-wrap;">Основанные на WebDriver</span></li>
<li dir="ltr" style="font-family: Verdana; font-size: 15px; list-style-type: decimal; vertical-align: baseline;"><span style="vertical-align: baseline; white-space: pre-wrap;">“Самобытные”</span></li>
</ol>
<span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Причем первых большинство. Почему так получается ? Все потому что WebDriver в ближайшее время станет де-факто и де-юро стандартом.</span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">В W3C с лета этого года разрабатывается черновик WebDriver API. В современной автоматизации веб-приложений webdriver и производные от него утилиты и фреймворки занимают особое место, обусловлено это его простотой, доступность и легкостью освоения, плюс ко всему его имплементации есть на многих языках программирования, таких как Java, C#, Python, Ruby. Просто выбираете удобный язык и начинаете писать авто-тесты.</span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Конечно это не так просто, как может показаться на первый взгляд, нужно обладать хотя бы базовыми познаниями в области программирования, но в интернете достаточно общедоступных материалов для изучения и уроков по написанию тестов.</span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">В подтверждение своих слов о легкости написания и понимания, приведу пример кода на Java, Ruby и Python.</span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Java:</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: #f0f0f0; color: green; font-family: Verdana; font-size: 12px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">public</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f0f0f0; color: green; font-family: Verdana; font-size: 12px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">class</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f0f0f0; color: #b00060; font-family: Verdana; font-size: 12px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">Selenium2Example</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">{</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f0f0f0; color: green; font-family: Verdana; font-size: 12px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">public</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f0f0f0; color: green; font-family: Verdana; font-size: 12px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">static</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f0f0f0; color: #303090; font-family: Verdana; font-size: 12px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">void</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f0f0f0; color: #0060b0; font-family: Verdana; font-size: 12px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">main</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">String</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">[]</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> args</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">)</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">{</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> WebDriver driver </span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">=</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f0f0f0; color: green; font-family: Verdana; font-size: 12px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">new</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> FirefoxDriver</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">();</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> driver</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f0f0f0; color: #0000c0; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">get</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="background-color: #fff0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">"http://www.google.com"</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">);</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> WebElement element </span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">=</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> driver</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f0f0f0; color: #0000c0; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">findElement</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">By</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f0f0f0; color: #0000c0; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">name</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="background-color: #fff0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">"q"</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">));</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> element</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f0f0f0; color: #0000c0; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">sendKeys</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="background-color: #fff0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">"Cheese!"</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">);</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> element</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f0f0f0; color: #0000c0; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">submit</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">();</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> System</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f0f0f0; color: #0000c0; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">out</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f0f0f0; color: #0000c0; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">println</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="background-color: #fff0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">"Page title is: "</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">+</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> driver</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f0f0f0; color: #0000c0; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">getTitle</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">());</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="background-color: #f0f0f0; color: green; font-family: Verdana; font-size: 12px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">new</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> WebDriverWait</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">driver</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">,</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f0f0f0; color: #0000d0; font-family: Verdana; font-size: 12px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">10</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">)).</span><span style="background-color: #f0f0f0; color: #0000c0; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">until</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="background-color: #f0f0f0; color: green; font-family: Verdana; font-size: 12px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">new</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> ExpectedCondition</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"><</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">Boolean</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">>()</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">{</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f0f0f0; color: green; font-family: Verdana; font-size: 12px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">public</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> Boolean </span><span style="background-color: #f0f0f0; color: #0060b0; font-family: Verdana; font-size: 12px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">apply</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">WebDriver d</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">)</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">{</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f0f0f0; color: green; font-family: Verdana; font-size: 12px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">return</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> d</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f0f0f0; color: #0000c0; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">getTitle</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">().</span><span style="background-color: #f0f0f0; color: #0000c0; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">toLowerCase</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">().</span><span style="background-color: #f0f0f0; color: #0000c0; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">startsWith</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="background-color: #fff0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">"cheese!"</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">);</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">}</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">});</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> System</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f0f0f0; color: #0000c0; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">out</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f0f0f0; color: #0000c0; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">println</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="background-color: #fff0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">"Page title is: "</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">+</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> driver</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f0f0f0; color: #0000c0; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">getTitle</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">());</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> driver</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f0f0f0; color: #0000c0; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">quit</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">();</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">}<br class="kix-line-break" />}</span><br /><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Ruby:</span><span style="background-color: #fff0f0; color: #333333; font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="background-color: #fff0f0; color: #333333; font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">driver </span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">=</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f0f0f0; color: #003060; font-family: Verdana; font-size: 12px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">Selenium</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">::</span><span style="background-color: #f0f0f0; color: #003060; font-family: Verdana; font-size: 12px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">WebDriver</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">for </span><span style="background-color: #f0f0f0; color: #a06000; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">:firefox</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">driver</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">get </span><span style="background-color: #fff0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">"http://google.com"</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">element </span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">=</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> driver</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">find_element </span><span style="background-color: #f0f0f0; color: #a06000; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">:name</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">=></span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #fff0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">"q"</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">element</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">send_keys </span><span style="background-color: #fff0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">"Cheese!"</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">element</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">submit</span><span style="background-color: #f0f0f0; color: #007020; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">puts</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #fff0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">"Page title is </span><span style="background-color: #e0e0e0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">#{</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">driver</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">title</span><span style="background-color: #e0e0e0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">}</span><span style="background-color: #fff0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">"</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">wait </span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">=</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f0f0f0; color: #003060; font-family: Verdana; font-size: 12px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">Selenium</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">::</span><span style="background-color: #f0f0f0; color: #003060; font-family: Verdana; font-size: 12px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">WebDriver</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">::</span><span style="background-color: #f0f0f0; color: #003060; font-family: Verdana; font-size: 12px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">Wait</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">new(</span><span style="background-color: #f0f0f0; color: #a06000; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">:timeout</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">=></span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f0f0f0; color: #0000d0; font-family: Verdana; font-size: 12px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">10</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">)<br class="kix-line-break" />wait</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">until { driver</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">title</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">downcase</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">start_with? </span><span style="background-color: #fff0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">"cheese!"</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> }</span><span style="background-color: #f0f0f0; color: #007020; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">puts</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #fff0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">"Page title is </span><span style="background-color: #e0e0e0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">#{</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">driver</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">title</span><span style="background-color: #e0e0e0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">}</span><span style="background-color: #fff0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">"</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">driver</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">quit</span><br /><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Python:</span><span style="background-color: #f0f0f0; color: #0e84b5; font-family: Verdana; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">driver </span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">=</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> webdriver</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">Firefox()<br class="kix-line-break" />driver</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">get(</span><span style="background-color: #fff0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">"http://www.google.com"</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">)<br class="kix-line-break" />inputElement </span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">=</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> driver</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">find_element_by_name(</span><span style="background-color: #fff0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">"q"</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">)<br class="kix-line-break" />inputElement</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">send_keys(</span><span style="background-color: #fff0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">"Cheese!"</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">)<br class="kix-line-break" />inputElement</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">submit()</span><span style="background-color: #f0f0f0; color: green; font-family: Verdana; font-size: 12px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">print</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> driver</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">title</span><span style="background-color: #f0f0f0; color: green; font-family: Verdana; font-size: 12px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">try</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">:<br class="kix-line-break" /> WebDriverWait(driver, </span><span style="background-color: #f0f0f0; color: #6000e0; font-family: Verdana; font-size: 12px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">10</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">)</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">until(</span><span style="background-color: #f0f0f0; color: green; font-family: Verdana; font-size: 12px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">lambda</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> driver : driver</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">title</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">lower()</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">startswith(</span><span style="background-color: #fff0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">"cheese!"</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">))<br class="kix-line-break" /> </span><span style="background-color: #f0f0f0; color: green; font-family: Verdana; font-size: 12px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">print</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;"> driver</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">title</span><span style="background-color: #f0f0f0; color: green; font-family: Verdana; font-size: 12px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">finally</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">:<br class="kix-line-break" /> driver</span><span style="background-color: #f0f0f0; color: #303030; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 12px; vertical-align: baseline; white-space: pre-wrap;">quit()</span><br /><span style="background-color: #f0f0f0; color: #333333; font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Как видно из приведенного кода все достаточно ясно и понятно.</span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Как уже говорилось выше сейчас существует множество паттернов и подходов к написанию тестов. Рассмотрим некоторые из них.</span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><ol style="margin-bottom: 0pt; margin-top: 0pt;">
<li dir="ltr" style="font-family: Verdana; font-size: 15px; list-style-type: decimal; vertical-align: baseline;"><span style="vertical-align: baseline; white-space: pre-wrap;">BDD( </span><span style="font-style: italic; vertical-align: baseline; white-space: pre-wrap;">behavior-driven development</span><span style="vertical-align: baseline; white-space: pre-wrap;"> или разработка через поведение)</span></li>
<li dir="ltr" style="font-family: Verdana; font-size: 15px; list-style-type: decimal; vertical-align: baseline;"><span style="vertical-align: baseline; white-space: pre-wrap;">Functional Decomposition</span></li>
<li dir="ltr" style="font-family: Verdana; font-size: 15px; list-style-type: decimal; vertical-align: baseline;"><span style="vertical-align: baseline; white-space: pre-wrap;">Object-Driven</span></li>
<li dir="ltr" style="font-family: Verdana; font-size: 15px; list-style-type: decimal; vertical-align: baseline;"><span style="vertical-align: baseline; white-space: pre-wrap;">Model-based</span></li>
</ol>
<span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Теперь кратко о каждом.</span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="font-family: Verdana; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">BDD</span><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: white; font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"> – разработка, основанной на функционировании или поведении системы.</span><br /><span style="background-color: white; font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Как это выглядит ? Тесты в bdd-стиле представляются простыми историями вида:</span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">“Я хочу сделать то-то..</span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Потом я ожидаю увидеть то-то..</span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">И сделать то-то...</span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">”</span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Очень похоже на обычные тест-кейс? В это простоте теста заключена огромная мощь, фактически вы пишите обычные тест-кейсы в виде историй... и все. после того как они написаны фреймворк для bdd запустит их и превратит в авто-тесты.</span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Фреймворков на текущий момент существует множество:</span><br /><ul style="margin-bottom: 0pt; margin-top: 0pt;">
<li dir="ltr" style="font-family: Verdana; font-size: 15px; list-style-type: disc; vertical-align: baseline;"><span style="vertical-align: baseline; white-space: pre-wrap;">easyb</span></li>
<li dir="ltr" style="font-family: Verdana; font-size: 15px; list-style-type: disc; vertical-align: baseline;"><span style="vertical-align: baseline; white-space: pre-wrap;">JBehave</span></li>
<li dir="ltr" style="font-family: Verdana; font-size: 15px; list-style-type: disc; vertical-align: baseline;"><span style="vertical-align: baseline; white-space: pre-wrap;">Cucumber</span></li>
<li dir="ltr" style="font-family: Verdana; font-size: 15px; list-style-type: disc; vertical-align: baseline;"><span style="vertical-align: baseline; white-space: pre-wrap;">Thucydides и множество других.</span></li>
</ul>
<span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Пример истории на easyb:</span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="background-color: white; color: #222222; font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">description "This story is about sqrt optimisation algorithm"</span><br /><span style="background-color: white; color: #222222; font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">narrative "this shows sqrt optimisation", {</span><br /><span style="background-color: white; color: #222222; font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">as a "java developer"</span><br /><span style="background-color: white; color: #222222; font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">i want "to know how sqrt optimisation works"</span><br /><span style="background-color: white; color: #222222; font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">so that "that I can pass google interview"</span><br /><span style="background-color: white; color: #222222; font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">}</span><br /><span style="background-color: white; color: #222222; font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">before "init input and expected result",{</span><br /><span style="background-color: white; color: #222222; font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">}</span><br /><span style="background-color: white; color: #222222; font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">where "complete scenarios data",{</span><br /><span style="background-color: white; color: #222222; font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">input = [[5, 10, -3, 17, 12, 1, -2, 13, -12], [5, 8, 13, 5, 21, 6, 3, 7, -2, 4, 8, 12]]</span><br /><span style="background-color: white; color: #222222; font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">leftIndex = [2,3]</span><br /><span style="background-color: white; color: #222222; font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">rightIndex = [5,10]</span><br /><span style="background-color: white; color: #222222; font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">expectedSumm = [27,51]</span><br /><span style="background-color: white; color: #222222; font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">}</span><br /><span style="background-color: white; color: #222222; font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">scenario "find summ within two indexes #leftIndex and #rightIndex of the array #input",{</span><br /><span style="background-color: white; color: #222222; font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">given "An Sqrt algorithm implementation",{</span><br /><span style="background-color: white; color: #222222; font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">alg = new SqrtDecompositionSum(input.toArray(new int[0]))</span><br /><span style="background-color: white; color: #222222; font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">}</span><br /><span style="background-color: white; color: #222222; font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">when "calc sum between two indexes", {</span><br /><span style="background-color: white; color: #222222; font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">actualSum = alg.calcSummBetween(leftIndex, rightIndex)</span><br /><span style="background-color: white; color: #222222; font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">}</span><br /><span style="background-color: white; color: #222222; font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">then "summ should be equal expected #expectedSumm", {</span><br /><span style="background-color: white; color: #222222; font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">actualSum.shouldBe expectedSumm</span><br /><span style="background-color: white; color: #222222; font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">}</span><br /><span style="background-color: white; color: #222222; font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">}</span><br /><span style="background-color: white; color: #222222; font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Все эти фремворки легко оптимизируются для тестирования веб-приложений. Во многих из них уже из коробки есть поддержка Selenium/WebDriver. А в тех в которых ее нет она появится в ближайшем будущем.</span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="font-family: Verdana; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">Functional Decomposition</span><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"> или </span><span style="font-family: Verdana; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">FDD</span><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"> - паттерн при использовании которого конечная система разбивается на ряд более мелких систем которые легче понять, программировать и поддерживать. </span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">В настоящий момент декомпозицию относят к анти-паттернам и устаревшим техникам. Данный паттерн родился из опыта не объектно-ориентированных разработчиков в попытке перенести процедурные приложения на объектную основу. </span><br /><h3 dir="ltr">
<span style="background-color: white; color: #404040; font-family: Verdana; font-size: 15px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;">Симптомы и последствия применения такого паттерна.</span></h3>
<br /><ul style="margin-bottom: 0pt; margin-top: 0pt;">
<li dir="ltr" style="font-family: Verdana; font-size: 15px; list-style-type: disc; margin-left: -24px; vertical-align: baseline;"><span style="background-color: white; color: #333333; vertical-align: baseline; white-space: pre-wrap;">Классы с "функциональными" именами, такие как Calculate_Interest или Display_Table могут указывать на применение этого анти-паттерна.</span></li>
<li dir="ltr" style="font-family: Verdana; font-size: 15px; list-style-type: disc; margin-left: -24px; vertical-align: baseline;"><span style="background-color: white; color: #333333; vertical-align: baseline; white-space: pre-wrap;">Все атрибуты класса являются частными и используются только внутри класса.</span></li>
<li dir="ltr" style="font-family: Verdana; font-size: 15px; list-style-type: disc; margin-left: -24px; vertical-align: baseline;"><span style="background-color: white; color: #333333; vertical-align: baseline; white-space: pre-wrap;">Классы которые выполняют только одно действие, как функции.</span></li>
<li dir="ltr" style="font-family: Verdana; font-size: 15px; list-style-type: disc; margin-left: -24px; vertical-align: baseline;"><span style="background-color: white; color: #333333; vertical-align: baseline; white-space: pre-wrap;">Невероятно вырожденная архитектура, которая полностью не соответствует объектно-ориентированному подходу.</span></li>
<li dir="ltr" style="font-family: Verdana; font-size: 15px; list-style-type: disc; margin-left: -24px; vertical-align: baseline;"><span style="background-color: white; color: #333333; vertical-align: baseline; white-space: pre-wrap;">Абсолютно не используются объектно-ориентированные принципы, такие как наследование и полиморфизм. Это может быть чрезвычайно дорого в поддержке.</span></li>
<li dir="ltr" style="font-family: Verdana; font-size: 15px; list-style-type: disc; margin-left: -24px; vertical-align: baseline;"><span style="background-color: white; color: #333333; vertical-align: baseline; white-space: pre-wrap;">Нет возможности четко документировать или даже объяснить как работает система. Модель классов не несет никакого смысла.</span></li>
<li dir="ltr" style="font-family: Verdana; font-size: 15px; list-style-type: disc; margin-left: -24px; vertical-align: baseline;"><span style="background-color: white; color: #333333; vertical-align: baseline; white-space: pre-wrap;">Нет возможности когда либо повторно использовать код.</span></li>
<li dir="ltr" style="font-family: Verdana; font-size: 15px; list-style-type: disc; margin-left: -24px; vertical-align: baseline;"><span style="background-color: white; color: #333333; vertical-align: baseline; white-space: pre-wrap;">Разочарование и отчаяние со стороны тестеров. )</span></li>
</ul>
<span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Паттерн был впервые представлен Майком Экройдом, практическим консультантов по программному обеспечению Motorola, в 1996 году.</span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="font-family: Verdana; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">Object Driven </span><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">или тесты, управляемые объектами – это такой подход к автоматизации тестирования, при котором тестовые скрипты проектируются в виде классов, в которых реализуется логика работы с приложением. Такие скрипты легче создавать и поддерживать, так как в тест-кейсах используются лишь методы «высокого уровня», позволяя скрыть подробности реализации тех или иных действий. Данный паттерн активнее всего используется для разработки авто-тестов с использованием инструмента Selenium/WebDriver. Благодаря чему на свет появился еще один специфичный для веб-приложений паттерн - Page Objects. В данном паттерне каждое состояние(страница, фрейм, слой, блок) веб-приложения описывается отдельным объектом. Для большей наглядности давайте рассмотрим сайт состоящий из двух страниц: </span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">авторизации и регистрации. Каждую из этих страниц опишем с помощью Page Object’а, для описания я буду использовать некий псевдоязык ( очень похожий на Java).</span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"> Объект страницы регистрации</span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">public class RegistrationPage{</span><br /><span style="color: #93c47d; font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">//элементы на странице</span><br /><span style="font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">public Element sex;</span><br /><span style="font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">public Element username;</span><br /><span style="font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">public Element password;</span><br /><span style="font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">public Element email;</span><br /><span style="font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="color: #93c47d; font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">//методы для работы</span><br /><span style="font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">public void open(){ </span><span style="color: #93c47d; font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">//// описание метода</span><span style="font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;"> }</span><br /><span style="font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">public void register(username,password,sex,email){ </span><span style="color: #93c47d; font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">//// описание метода</span><span style="font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">}</span><br /><span style="font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">public void getTitle(){</span><span style="color: #93c47d; font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">//// описание метода</span><span style="font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">}</span><br /><span style="font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">}</span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Объект страницы логина</span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="font-family: Verdana; font-size: 15px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">p</span><span style="font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">ublic class LoginPage{</span><br /><span style="color: #93c47d; font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">//элементы на странице</span><span style="font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">public Element username;</span><br /><span style="font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">public Element password;</span><br /><span style="font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="color: #93c47d; font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">//методы для работы</span><span style="font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">public void open(){ </span><span style="color: #93c47d; font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">//// описание метода </span><span style="font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">}</span><br /><span style="font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">public void login(username,password){ </span><span style="color: #93c47d; font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">//// описание метода</span><span style="font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">}</span><br /><span style="font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">public void getTitle(){</span><span style="color: #93c47d; font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">//// описание метода</span><span style="font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">}</span><br /><span style="font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">}</span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Теперь, имея такие объекты, нам достаточно в тест-кейсе просто вызывать методы этих объектов.</span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">@Test</span><br /><span style="font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">public void test(){</span><br /><span style="font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">RegistrationPage page=new RegistrationPage();</span><br /><span style="font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">page.open();</span><br /><span style="font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">page.register(“test”,”test123”,”male”,”</span><a href="mailto:test@example.com"><span style="color: #1155cc; font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">test@example.com</span></a><span style="font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">”);</span><br /><span style="font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">assert(page.getTitle());</span><br /><span style="font-family: Verdana; font-size: 12px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">}</span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Данный пример наглядно демонстрирует основные принципы паттерна PageObject (для различных языков имплементация паттерна может различатся, поэтому в коде я постарался абстрагироваться от конкретного языка).</span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Данный паттерн обладает еще одним неоспоримым плюсом- это относительно легкая возможность поддержки авто-тестов, так как код авто-тестов фактически отображает архитектуру тестируемого приложения, то есть при появлении изменений в приложении авто-тесты меняются лишь в одном месте.</span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="background-color: white; font-family: Verdana; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">Model based</span><span style="background-color: white; font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"> - это подход к тестированию программного обеспечения, в котором варианты тестирования частично или целиком получаются из модели описывающей некоторые аспекты (чаще функциональные) тестируемой системы. Модели могут отображать желаемое поведение системы или использоваться для создания тестовых стратегий или среды тестирования.</span><br /><span style="background-color: white; font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Модель, описывающая тестируемый объект, как правило абстрактная и описывает лишь часть функциональности объекта. Тесты, сгенерированные из подобных моделей тоже абстрактны и не могут быть напрямую использоваться для тестирования объекта. На основе сценариев абстрактных тестов, необходимо выполнить их реализацию для тестируемого объекта. Такую реализацию можно использовать для непосредственного тестирования. В некоторых средах для моделирования, модели могут содержать достаточное количество информации для генерации исполняемых тестов.</span><br /><span style="background-color: white; font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Поскольку модели обычно строятся на основе требований или ожидаемого поведения устройства, то такое тестирование обычно рассматривается как одна из форм тестирования по методу черного ящика.</span><br /><span style="background-color: white; font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="background-color: white; font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Приведу пример типичного workflow при таком подходе:</span><br /><span style="background-color: white; font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><img height="249px;" src="https://docs.google.com/drawings/d/scaKMJhTxRQmQGxkliXVVdg/image?w=651&h=249&rev=47&ac=1" width="651px;" /><span style="background-color: white; font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Более подробно о применении данной методики на практике можно прочитать в книге “Practical Model-Based Testing:A Tool Approach” by Mark Utting and Bruno Legeard.</span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="color: #666666; font-family: Verdana; font-size: 15px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">Будущее автоматизации</span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Будущее автоматизации простирается в сторону упрощения написания скриптов, их автогенерации и выход авто-тестирования в облака. Уже сегодня тестировщики могут использовать ряд сервисов для облачного тестирования приложений. </span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Давайте рассмотрим в чем плюсы такого облачного подхода:</span><br /><ul style="margin-bottom: 0pt; margin-top: 0pt;">
<li dir="ltr" style="font-family: Verdana; font-size: 15px; list-style-type: disc; vertical-align: baseline;"><span style="vertical-align: baseline; white-space: pre-wrap;">Вся тестовая инфраструктура находится в облаке и освобождает ресурсы машины тестировщика, компании.</span></li>
<li dir="ltr" style="font-family: Verdana; font-size: 15px; list-style-type: disc; vertical-align: baseline;"><span style="vertical-align: baseline; white-space: pre-wrap;">Все тесты могут выполнятся параллельно в нескольких браузер - экономия времени.</span></li>
<li dir="ltr" style="font-family: Verdana; font-size: 15px; list-style-type: disc; vertical-align: baseline;"><span style="vertical-align: baseline; white-space: pre-wrap;">Агрегация отчетов по запускам тестов, вы всегда сможете посмотреть историчность своих тестов и снять различные метрики.</span></li>
<li dir="ltr" style="font-family: Verdana; font-size: 15px; list-style-type: disc; vertical-align: baseline;"><span style="vertical-align: baseline; white-space: pre-wrap;">Тесты могут быть написаны на любом языке.</span></li>
<li dir="ltr" style="font-family: Verdana; font-size: 15px; list-style-type: disc; vertical-align: baseline;"><span style="vertical-align: baseline; white-space: pre-wrap;">Вы всегда сможете получить доступ к своим тестам и результатам.</span></li>
</ul>
<span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Все плюсы говорят сами за себя. Уже сейчас есть ряд действующих сервисов подобной направленности.</span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Одним из таких сервисов является SauceLabs. Данный сервис предоставляет для компании и тестировщиков уникальные возможности, вы можете не только запустить уже написанный вами скрипт, но и записать его в режиме онлайн, используя любое сочетание браузера и операционной системы. </span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Пользователь всегда может посмотреть скриншоты с браузеров с упавшими тестами и даже видео. </span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="font-family: Verdana; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Все эти возможности открывают перед тестировщиками- автоматизаторами доселе невиданные возможности в написании и выполнении тестов. Я верю что со времененм сервисов подобных SauceLabs будет появлятся все больше и больше. </span></b></div>
Алексейhttp://www.blogger.com/profile/18264724295847697355noreply@blogger.com0tag:blogger.com,1999:blog-5323029390952017375.post-70381071364968354552012-12-17T02:46:00.000-08:002012-12-17T02:47:36.376-08:00Новые языки в сервисе по генерации Page Object<div dir="ltr" style="text-align: left;" trbidi="on">
Недавно обновил <a href="http://whispering-retreat-7160.herokuapp.com/" target="_blank">сервис</a>. Теперь появилась возможность сгенерировать page object на 4 языках:<br />
<div style="text-align: left;">
</div>
<ul style="text-align: left;">
<li>Java</li>
<li>C#</li>
<li>Ruby</li>
<li>PHP</li>
</ul>
Историю всех изменения можно прочитать <a href="http://whispering-retreat-7160.herokuapp.com/" target="_blank">тут</a>.<br />
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Уважаемые коллеги-тестировщики! Если у вас есть идеи относительно этого сервиса пишите их мне ) Также приветствуются все кто горит желаниием помочь )</div>
</div>
Алексейhttp://www.blogger.com/profile/18264724295847697355noreply@blogger.com0tag:blogger.com,1999:blog-5323029390952017375.post-69636162724267253512012-12-10T05:31:00.001-08:002012-12-10T05:32:22.307-08:00Сервис по генерации PageObject - Исправлен<div dir="ltr" style="text-align: left;" trbidi="on">
Уважаемые читатели сервис исправлен и теперь корректно функционирует. Рекомендую не вставлять исходный код страницы более 10мегабайт, а то веб приложение на heroku.com загнется )<br />
<br />
Спасибо за понимание )</div>
Алексейhttp://www.blogger.com/profile/18264724295847697355noreply@blogger.com4tag:blogger.com,1999:blog-5323029390952017375.post-13978940271911584832012-12-10T01:42:00.000-08:002012-12-10T01:42:16.281-08:00Сервис по генерации PageObject<div dir="ltr" style="text-align: left;" trbidi="on">
Хочу представить вашему вниманию сервис по генерации PageObject объектов для WebDriver.<br />
Сервис расположен <a href="http://whispering-retreat-7160.herokuapp.com/" target="_blank">тут</a><br />
<br />
Сервис позволяет генерировать вам почти готовый PageObject из исходного кода страницы.<br />
<br />
Как это работает:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirkZM-Di919EGzYF0Xw4GgG5avVb80cGgrBTvkid_kGLNGiL98dk2SZcDZNu9eVUJhST_kV3TdESuMCNLrR4QDjNjTL7JojwB-TD2IJswQTFUdQZGt43MOJXiEgV8jLNS1JNQ7SM9BGhE8/s1600/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA3.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirkZM-Di919EGzYF0Xw4GgG5avVb80cGgrBTvkid_kGLNGiL98dk2SZcDZNu9eVUJhST_kV3TdESuMCNLrR4QDjNjTL7JojwB-TD2IJswQTFUdQZGt43MOJXiEgV8jLNS1JNQ7SM9BGhE8/s640/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA3.PNG" width="556" /></a></div>
1. Вы вводите исходный код вашей веб страницы<br />
2. Выбираете язык на котором будет ваш PageObject<br />
3. Пишите через точку с запятой элементы которые вам нужны из страницы(Элементы записываются в виде xpath выражений). Например //input;//div<br />
4. Нажимаем Generate и нам возвращается почти пригодный к употреблению PageObject<br />
<br />
Список языков будет со временем увеличиваться, если у вас есть желание помочь мне с этим сервисом -пишите мне. <br />
<br /></div>
Алексейhttp://www.blogger.com/profile/18264724295847697355noreply@blogger.com6tag:blogger.com,1999:blog-5323029390952017375.post-5767462630209500572012-11-23T02:45:00.001-08:002012-11-23T02:46:29.335-08:00Замена Selenium IDE<div dir="ltr" style="text-align: left;" trbidi="on">
После долгого перерыва, обусловленного напряженной работой, снова решил написать в блог.<br />
Надеюсь мои немногие читатели не забыли про меня ))<br />
<br />
Новый инструмент, который приходит на смену Selenium IDE, встречайте: Selenium Builder.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNDhawy6nPZb13y5JRSe6zPZNphfSyyYtlWB1R3anoI9kZICHL8yjM5i5g88ZYZ__qEl9_aoE4fiYDkwMtjCuKdlGMI5Yeor-y43hHD2RNzzQP1y7iWaJUgDogyqFuFyRqL3sFAqXnedb9/s1600/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNDhawy6nPZb13y5JRSe6zPZNphfSyyYtlWB1R3anoI9kZICHL8yjM5i5g88ZYZ__qEl9_aoE4fiYDkwMtjCuKdlGMI5Yeor-y43hHD2RNzzQP1y7iWaJUgDogyqFuFyRqL3sFAqXnedb9/s1600/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA.PNG" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
Подробности о проекте можно прочитать <a href="http://sebuilder.github.com/se-builder/" target="_blank">тут</a>.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWPrwiAfxDP2vOE3c5gBP2zYWNdxtHUZFThH_19Fyz3rkh2h1XdITjo9CMje6gHsAeZZfl7NERBY_49P3mFSGbKF-4Lf1Gk9HXier32fk5yEdAPG8yJR2nnvsM5RNFl5mpO3k1amwTULXM/s1600/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA2.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="135" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjWPrwiAfxDP2vOE3c5gBP2zYWNdxtHUZFThH_19Fyz3rkh2h1XdITjo9CMje6gHsAeZZfl7NERBY_49P3mFSGbKF-4Lf1Gk9HXier32fk5yEdAPG8yJR2nnvsM5RNFl5mpO3k1amwTULXM/s320/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA2.PNG" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
Согласно описанию на сайте инструмент предоставляет все те-же возможности что и старый Selenium IDE, плюс некоторые новые.</div>
<br /></div>
Алексейhttp://www.blogger.com/profile/18264724295847697355noreply@blogger.com0tag:blogger.com,1999:blog-5323029390952017375.post-56491193104812328012012-09-26T00:55:00.000-07:002012-09-26T00:55:09.999-07:00Selenium - супергерой<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgVGfzt7ktOgaRa6UUXLSlSeBKjZR73_5OjuqehS8zKQ_gxnmrYFocxWSu6IVAqFolmKTUIaf9l4zaQ04U-eF9KtavLWj5EorFZ6t-gVWWqPILVjSSoYVnBwo4iZJu0v2lNCXOo37ZD3pN/s1600/%D1%81%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%83%D0%BC.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjgVGfzt7ktOgaRa6UUXLSlSeBKjZR73_5OjuqehS8zKQ_gxnmrYFocxWSu6IVAqFolmKTUIaf9l4zaQ04U-eF9KtavLWj5EorFZ6t-gVWWqPILVjSSoYVnBwo4iZJu0v2lNCXOo37ZD3pN/s640/%D1%81%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%83%D0%BC.jpg" width="369" /></a></div>
<br /></div>
Алексейhttp://www.blogger.com/profile/18264724295847697355noreply@blogger.com0tag:blogger.com,1999:blog-5323029390952017375.post-39577880016986825302012-09-20T00:16:00.005-07:002012-09-20T00:16:52.744-07:00Почему, на ваш взгляд, самообразование важно для тестировщика ПО?<div dir="ltr" style="text-align: left;" trbidi="on">
Сводки с близлежащих окрестностей твоего замка «QA». Баги мутируют и обрастают броней. Браузеры меняют версию. Вчерашние тест-кейсы морально и физически устарели. Отряд смелых воинов-подчиненных, ушедший в «свободный поиск», затерялся за горизонтом. Объявлена всеобщая «мобилизация» приложений. Замков-конкурентов все больше за меньшую цену. А вот новоиспеченные принцы – джуниоры, нахально лезут на престол, не замечая тебя, (пока?) короля QA. Время точить свой топор настало. Самообразование – само не образуется. Царское это дело – взять в руки книгу, просмотреть вебинар, записаться на конференцию, написать статью, подготовить доклад , а потом возглавить свою армию и разбить силы багов противника, чтобы вернуть своему королевству былую славу и величие. Самое длинное и увлекательное путешествие начинается со слов «Я знаю самую короткую дорогу». Довольно почивать на лаврах. Сделай шаг, потом еще один.… Ты точно не пожалеешь. Пари?<br />
<br />
Автор : Ладутько Андрей, Минск, Senior QA Engineer в компании Intetics.</div>
Алексейhttp://www.blogger.com/profile/18264724295847697355noreply@blogger.com1tag:blogger.com,1999:blog-5323029390952017375.post-47641324265686106642012-09-03T00:35:00.003-07:002012-09-03T00:35:46.031-07:00Юмор )<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwQbSHmJUXh1n0LSYc5aD0PfSz9RNM8C6W7E4V6nL7QMCdyG7U2WpIjH_6dT7WuoC2ng-mTEerTIlm9MhrW6-sm2Bm_YCI1J63QteG76tAeJXz9lmUpWPxmDycxPHy14ppHlL3iy8bvW9w/s1600/original.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="188" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwQbSHmJUXh1n0LSYc5aD0PfSz9RNM8C6W7E4V6nL7QMCdyG7U2WpIjH_6dT7WuoC2ng-mTEerTIlm9MhrW6-sm2Bm_YCI1J63QteG76tAeJXz9lmUpWPxmDycxPHy14ppHlL3iy8bvW9w/s320/original.jpg" width="320" /></a></div>
<br /></div>
Алексейhttp://www.blogger.com/profile/18264724295847697355noreply@blogger.com0tag:blogger.com,1999:blog-5323029390952017375.post-31497348725548887092012-08-14T05:22:00.001-07:002012-08-14T05:22:54.878-07:00Перевод статьи по использованию Selenium и JBehave<div dir="ltr" style="text-align: left;" trbidi="on">
<h2>
<a href="http://jbehave.org/reference/web/latest/using-selenium.html" target="_blank">Оригинал </a></h2>
<h2>
Driving Web Behaviour</h2>
<h2>
</h2>
<a href="http://translate.googleusercontent.com/translate_c?depth=1&hl=ru&ie=UTF8&prev=_t&rurl=translate.google.ru&sl=auto&tl=ru&twu=1&u=http://seleniumhq.org/&usg=ALkJrhiiA_i8JHmC5wi5UB1x5blf_UzGRw">Selenium</a> является мощным инструментом с открытым исходным кодом для автоматизированного тестирования web-приложений. С версии 2.x, он предлагает на выбор два API: <b>API Selenium (обратная совместимость с 1.x)</b> и новый <b>WebDriver API.</b> JBehave поддерживает оба. Когда мы говорим о Selenium, мы обычно подразумеваем сам фреймворк, а если нужно различать API, мы специально обратимся к <b>API</b> и <b>Selenium WebDriver API.</b> <br />
Давайте посмотрим, как мы можем легко использовать Selenium для запуска "веб-историй".
Целью создания DSL является представление бизнес-функциональности
домена в то же время абстрагируясь от деталей реализации, в этом случае
доступ к веб-слою осуществляется с помощью специального инструмента тестирования, такого
как Selenium. То же самое DSL должно иметь возможность повторного использования с другими инструментами тестирования. <br />
Как обычно, примеры говорят громче, чем слова:<br />
<br />
<div class="container">
<div class="line number1 index0 alt2">
<code class="bdd keyword">Scenario</code><code class="bdd plain">: User searches for a single step</code></div>
<div class="line number2 index1 alt1">
</div>
<div class="line number3 index2 alt2">
<code class="bdd keyword">Given</code> <code class="bdd plain">user is on Home page</code></div>
<div class="line number4 index3 alt1">
<code class="bdd keyword">When</code> <code class="bdd plain">user opens Find Steps page</code></div>
<div class="line number5 index4 alt2">
<code class="bdd keyword">Then</code> <code class="bdd plain">Find Steps page is shown</code></div>
<div class="line number6 index5 alt1">
<code class="bdd keyword">When</code> <code class="bdd plain">user searches for "</code><code class="bdd keyword">Given</code> <code class="bdd plain">a threshold of 10.0"</code></div>
<div class="line number7 index6 alt2">
<code class="bdd keyword">Then</code> <code class="bdd plain">search returns: "</code><code class="bdd keyword">Given</code> <code class="bdd plain">a threshold of $threshold"</code></div>
<div class="line number8 index7 alt1">
<code class="bdd keyword">When</code> <code class="bdd plain">user views with methods</code></div>
<div class="line number9 index8 alt2">
<code class="bdd keyword">Then</code> <code class="bdd plain">search returns: "</code><code class="bdd keyword">Given</code> <code class="bdd plain">a threshold of $threshold,</code></div>
<div class="line number10 index9 alt1">
<code class="bdd spaces"> </code><code class="bdd plain">[org.jbehave.web.examples.trader.steps.TraderSteps.aThreshold(double)]"</code></div>
<div class="line number11 index10 alt2">
<code class="bdd keyword">And</code> <code class="bdd plain">steps instances include: "TraderSteps,StockExchangeSteps"</code></div>
</div>
<div>
<div class="syntaxhighlighter nogutter bdd" id="highlighter_335750">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number11 index10 alt2">
</div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
TraderWebSteps класс, как и любой другой класс JBehave с шагами, выглядит следующим образом: <br />
<div>
<div class="syntaxhighlighter nogutter java" id="highlighter_933351">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="java keyword">public</code> <code class="java keyword">class</code> <code class="java plain">TraderWebSteps {</code></div>
<div class="line number2 index1 alt1">
</div>
<div class="line number3 index2 alt2">
<code class="java spaces"> </code><code class="java keyword">private</code> <code class="java keyword">final</code> <code class="java plain">Pages pages;</code></div>
<div class="line number4 index3 alt1">
</div>
<div class="line number5 index4 alt2">
<code class="java spaces"> </code><code class="java keyword">public</code> <code class="java plain">TraderWebSteps(Pages pages) {</code></div>
<div class="line number6 index5 alt1">
<code class="java spaces"> </code><code class="java keyword">this</code><code class="java plain">.pages = pages;</code></div>
<div class="line number7 index6 alt2">
<code class="java spaces"> </code><code class="java plain">}</code></div>
<div class="line number8 index7 alt1">
</div>
<div class="line number9 index8 alt2">
<code class="java spaces"> </code><code class="java color1">@Given</code><code class="java plain">(</code><code class="java string">"user is on Home page"</code><code class="java plain">)</code></div>
<div class="line number10 index9 alt1">
<code class="java spaces"> </code><code class="java keyword">public</code> <code class="java keyword">void</code> <code class="java plain">userIsOnHomePage(){ </code></div>
<div class="line number11 index10 alt2">
<code class="java spaces"> </code><code class="java plain">pages.home().open(); </code></div>
<div class="line number12 index11 alt1">
<code class="java spaces"> </code><code class="java plain">}</code></div>
<div class="line number13 index12 alt2">
</div>
<div class="line number14 index13 alt1">
<code class="java spaces"> </code><code class="java color1">@When</code><code class="java plain">(</code><code class="java string">"user opens Find Steps page"</code><code class="java plain">)</code></div>
<div class="line number15 index14 alt2">
<code class="java spaces"> </code><code class="java keyword">public</code> <code class="java keyword">void</code> <code class="java plain">userClicksOnFindSteps(){ </code></div>
<div class="line number16 index15 alt1">
<code class="java spaces"> </code><code class="java plain">pages.findSteps().open();</code></div>
<div class="line number17 index16 alt2">
<code class="java spaces"> </code><code class="java plain">}</code></div>
<div class="line number18 index17 alt1">
</div>
<div class="line number19 index18 alt2">
<code class="java spaces"> </code><code class="java color1">@Then</code><code class="java plain">(</code><code class="java string">"Find Steps page is shown"</code><code class="java plain">)</code></div>
<div class="line number20 index19 alt1">
<code class="java spaces"> </code><code class="java keyword">public</code> <code class="java keyword">void</code> <code class="java plain">findStepsPageIsShown(){</code></div>
<div class="line number21 index20 alt2">
<code class="java spaces"> </code><code class="java plain">pages.findSteps().pageIsShown();</code></div>
<div class="line number22 index21 alt1">
<code class="java spaces"> </code><code class="java plain">}</code></div>
<div class="line number23 index22 alt2">
<code class="java spaces"> </code> </div>
<div class="line number24 index23 alt1">
<code class="java spaces"> </code><code class="java color1">@When</code><code class="java plain">(</code><code class="java string">"user searches for \"$step\""</code><code class="java plain">)</code></div>
<div class="line number25 index24 alt2">
<code class="java spaces"> </code><code class="java keyword">public</code> <code class="java keyword">void</code> <code class="java plain">userSearchesForSteps(String step){ </code></div>
<div class="line number26 index25 alt1">
<code class="java spaces"> </code><code class="java plain">pages.findSteps().find(step);</code></div>
<div class="line number27 index26 alt2">
<code class="java spaces"> </code><code class="java plain">}</code></div>
<div class="line number28 index27 alt1">
</div>
<div class="line number29 index28 alt2">
<code class="java spaces"> </code><code class="java color1">@Then</code><code class="java plain">(</code><code class="java string">"search returns: \"$stepsOrMethods\""</code><code class="java plain">)</code></div>
<div class="line number30 index29 alt1">
<code class="java spaces"> </code><code class="java keyword">public</code> <code class="java keyword">void</code> <code class="java plain">stepsFound(List<String> stepsOrMethods){ </code></div>
<div class="line number31 index30 alt2">
<code class="java spaces"> </code><code class="java plain">pages.findSteps().found(stepsOrMethods);</code></div>
<div class="line number32 index31 alt1">
<code class="java spaces"> </code><code class="java plain">}</code></div>
<div class="line number33 index32 alt2">
</div>
<div class="line number34 index33 alt1">
<code class="java spaces"> </code><code class="java color1">@Then</code><code class="java plain">(</code><code class="java string">"steps instances include: \"$names\""</code><code class="java plain">)</code></div>
<div class="line number35 index34 alt2">
<code class="java spaces"> </code><code class="java keyword">public</code> <code class="java keyword">void</code> <code class="java plain">stepsInstancesFound(List<String> names){ </code></div>
<div class="line number36 index35 alt1">
<code class="java spaces"> </code><code class="java plain">pages.findSteps().found(names);</code></div>
<div class="line number37 index36 alt2">
<code class="java spaces"> </code><code class="java plain">}</code></div>
<div class="line number38 index37 alt1">
</div>
<div class="line number39 index38 alt2">
<code class="java plain">}</code></div>
<div class="line number39 index38 alt2">
</div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
Новым здесь является то, что мы используем <a href="http://translate.googleusercontent.com/translate_c?depth=1&hl=ru&ie=UTF8&prev=_t&rurl=translate.google.ru&sl=auto&tl=ru&twu=1&u=http://jbehave.org/reference/web/latest/page-objects.html&usg=ALkJrhh0PIJa1-EAM_S_pSLo2LBM4Tm_qw">Page Object</a> для абстрагирования от поведения Selenium за страницами, которые определяют взаимодействие с пользователем. Page Object, это то место где происходит магия Selenium.
Отметим, что использование страниц до сих пор не позволило нам взять на
себя обязательство использования конкретного API, как Selenium API или WebDriver API. <br />
<h2>
Настройка JBehave для использования Selenium </h2>
Как всегда, мы настроим JBehave несколькими различными способами. Один из способов, это иметь встраиваемый запускаемый класс, то есть JUnit-запускаемый класс TraderWebStories. Здесь в игру вступает выбор API. <br />
<h3>
Использование Selenium API </h3>
<div>
<div class="syntaxhighlighter nogutter java" id="highlighter_158438">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="java keyword">public</code> <code class="java keyword">class</code> <code class="java plain">TraderWebStories </code><code class="java keyword">extends</code> <code class="java plain">JUnitStories {</code></div>
<div class="line number2 index1 alt1">
<code class="java spaces"> </code> </div>
<div class="line number3 index2 alt2">
<code class="java spaces"> </code><code class="java keyword">private</code> <code class="java plain">Selenium selenium = SeleniumConfiguration.defaultSelenium();</code></div>
<div class="line number4 index3 alt1">
<code class="java spaces"> </code><code class="java keyword">private</code> <code class="java plain">ConditionRunner conditionRunner = SeleniumConfiguration.defaultConditionRunner(selenium);</code></div>
<div class="line number5 index4 alt2">
<code class="java spaces"> </code><code class="java keyword">private</code> <code class="java plain">Pages pages = </code><code class="java keyword">new</code> <code class="java plain">Pages(selenium, conditionRunner);</code></div>
<div class="line number6 index5 alt1">
<code class="java spaces"> </code><code class="java keyword">private</code> <code class="java plain">SeleniumSteps lifecycleSteps = </code><code class="java keyword">new</code> <code class="java plain">PerStorySeleniumSteps(selenium);</code></div>
<div class="line number7 index6 alt2">
<code class="java spaces"> </code><code class="java keyword">private</code> <code class="java plain">SeleniumContext seleniumContext = </code><code class="java keyword">new</code> <code class="java plain">SeleniumContext();</code></div>
<div class="line number8 index7 alt1">
</div>
<div class="line number9 index8 alt2">
<code class="java spaces"> </code><code class="java color1">@Override</code></div>
<div class="line number10 index9 alt1">
<code class="java spaces"> </code><code class="java keyword">public</code> <code class="java plain">Configuration configuration() {</code></div>
<div class="line number11 index10 alt2">
<code class="java spaces"> </code><code class="java plain">Class<? </code><code class="java keyword">extends</code> <code class="java plain">Embeddable> embeddableClass = </code><code class="java keyword">this</code><code class="java plain">.getClass();</code></div>
<div class="line number12 index11 alt1">
<code class="java spaces"> </code><code class="java keyword">return</code> <code class="java keyword">new</code> <code class="java plain">SeleniumConfiguration()</code></div>
<div class="line number13 index12 alt2">
<code class="java spaces"> </code><code class="java plain">.useSelenium(selenium) </code></div>
<div class="line number14 index13 alt1">
<code class="java spaces"> </code><code class="java plain">.useSeleniumContext(seleniumContext)</code></div>
<div class="line number15 index14 alt2">
<code class="java spaces"> </code><code class="java plain">.useStepMonitor(</code><code class="java keyword">new</code> <code class="java plain">SeleniumStepMonitor(selenium, seleniumContext, </code><code class="java keyword">new</code> <code class="java plain">SilentStepMonitor()))</code></div>
<div class="line number16 index15 alt1">
<code class="java spaces"> </code><code class="java plain">.useStoryLoader(</code><code class="java keyword">new</code> <code class="java plain">LoadFromClasspath(embeddableClass))</code></div>
<div class="line number17 index16 alt2">
<code class="java spaces"> </code><code class="java plain">.useStoryReporterBuilder(</code><code class="java keyword">new</code> <code class="java plain">StoryReporterBuilder()</code></div>
<div class="line number18 index17 alt1">
<code class="java spaces"> </code><code class="java plain">.withCodeLocation(codeLocationFromClass(embeddableClass))</code></div>
<div class="line number19 index18 alt2">
<code class="java spaces"> </code><code class="java plain">.withDefaultFormats()</code></div>
<div class="line number20 index19 alt1">
<code class="java spaces"> </code><code class="java plain">.withFormats(CONSOLE, TXT, HTML, XML));</code></div>
<div class="line number21 index20 alt2">
<code class="java spaces"> </code><code class="java plain">}</code></div>
<div class="line number22 index21 alt1">
</div>
<div class="line number23 index22 alt2">
<code class="java spaces"> </code><code class="java color1">@Override</code></div>
<div class="line number24 index23 alt1">
<code class="java spaces"> </code><code class="java keyword">public</code> <code class="java plain">InjectableStepsFactory stepsFactory() {</code></div>
<div class="line number25 index24 alt2">
<code class="java spaces"> </code><code class="java keyword">return</code> <code class="java keyword">new</code> <code class="java plain">InstanceStepsFactory(configuration(),</code></div>
<div class="line number26 index25 alt1">
<code class="java spaces"> </code><code class="java keyword">new</code> <code class="java plain">TraderWebSteps(pages),</code></div>
<div class="line number27 index26 alt2">
<code class="java spaces"> </code><code class="java plain">lifecycleSteps,</code></div>
<div class="line number28 index27 alt1">
<code class="java spaces"> </code><code class="java keyword">new</code> <code class="java plain">SeleniumScreenshotOnFailure(selenium));</code></div>
<div class="line number29 index28 alt2">
<code class="java spaces"> </code><code class="java plain">}</code></div>
<div class="line number30 index29 alt1">
<code class="java spaces"> </code> </div>
<div class="line number31 index30 alt2">
<code class="java spaces"> </code><code class="java color1">@Override</code></div>
<div class="line number32 index31 alt1">
<code class="java spaces"> </code><code class="java keyword">protected</code> <code class="java plain">List<String> storyPaths() {</code></div>
<div class="line number33 index32 alt2">
<code class="java spaces"> </code><code class="java keyword">return</code> <code class="java keyword">new</code> <code class="java plain">StoryFinder()</code></div>
<div class="line number34 index33 alt1">
<code class="java spaces"> </code><code class="java plain">.findPaths(codeLocationFromClass(</code><code class="java keyword">this</code><code class="java plain">.getClass()).getFile(), asList(</code><code class="java string">"**/*.story"</code><code class="java plain">), </code><code class="java keyword">null</code><code class="java plain">);</code></div>
<div class="line number35 index34 alt2">
<code class="java spaces"> </code><code class="java plain">}</code></div>
<div class="line number36 index35 alt1">
</div>
<div class="line number37 index36 alt2">
<code class="java plain">}</code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
<h3>
Использование API WebDriver </h3>
<div>
<div class="syntaxhighlighter nogutter java" id="highlighter_487957">
<table border="0" cellpadding="0" cellspacing="0"><tbody>
<tr><td class="code"><div class="container">
<div class="line number1 index0 alt2">
<code class="java keyword">public</code> <code class="java keyword">class</code> <code class="java plain">TraderWebStories </code><code class="java keyword">extends</code> <code class="java plain">JUnitStories {</code></div>
<div class="line number2 index1 alt1">
<code class="java spaces"> </code> </div>
<div class="line number3 index2 alt2">
<code class="java spaces"> </code><code class="java keyword">private</code> <code class="java plain">WebDriverProvider driverProvider = </code><code class="java keyword">new</code> <code class="java plain">PropertyWebDriverProvider();</code></div>
<div class="line number4 index3 alt1">
<code class="java spaces"> </code><code class="java keyword">private</code> <code class="java plain">WebDriverSteps lifecycleSteps = </code><code class="java keyword">new</code> <code class="java plain">PerStoriesWebDriverSteps(driverProvider); </code><code class="java comments">// or PerStoryWebDriverSteps(driverProvider)</code></div>
<div class="line number5 index4 alt2">
<code class="java spaces"> </code><code class="java keyword">private</code> <code class="java plain">Pages pages = </code><code class="java keyword">new</code> <code class="java plain">Pages(driverProvider);</code></div>
<div class="line number6 index5 alt1">
<code class="java spaces"> </code><code class="java keyword">private</code> <code class="java plain">SeleniumContext context = </code><code class="java keyword">new</code> <code class="java plain">SeleniumContext();</code></div>
<div class="line number7 index6 alt2">
<code class="java spaces"> </code><code class="java keyword">private</code> <code class="java plain">ContextView contextView = </code><code class="java keyword">new</code> <code class="java plain">LocalFrameContextView().sized(</code><code class="java value">500</code><code class="java plain">, </code><code class="java value">100</code><code class="java plain">);</code></div>
<div class="line number8 index7 alt1">
<code class="java spaces"> </code> </div>
<div class="line number9 index8 alt2">
<code class="java spaces"> </code><code class="java keyword">public</code> <code class="java plain">TraderWebStories() {</code></div>
<div class="line number10 index9 alt1">
<code class="java spaces"> </code><code class="java comments">// If configuring lifecycle per-stories, you need to ensure that you a same-thread executor</code></div>
<div class="line number11 index10 alt2">
<code class="java spaces"> </code><code class="java keyword">if</code> <code class="java plain">( lifecycleSteps </code><code class="java keyword">instanceof</code> <code class="java plain">PerStoriesWebDriverSteps ){</code></div>
<div class="line number12 index11 alt1">
<code class="java spaces"> </code><code class="java plain">configuredEmbedder().useExecutorService(MoreExecutors.sameThreadExecutor());</code></div>
<div class="line number13 index12 alt2">
<code class="java spaces"> </code><code class="java plain">}</code></div>
<div class="line number14 index13 alt1">
<code class="java spaces"> </code><code class="java plain">}</code></div>
<div class="line number15 index14 alt2">
</div>
<div class="line number16 index15 alt1">
<code class="java spaces"> </code><code class="java color1">@Override</code></div>
<div class="line number17 index16 alt2">
<code class="java spaces"> </code><code class="java keyword">public</code> <code class="java plain">Configuration configuration() {</code></div>
<div class="line number18 index17 alt1">
<code class="java spaces"> </code><code class="java plain">Class<? </code><code class="java keyword">extends</code> <code class="java plain">Embeddable> embeddableClass = </code><code class="java keyword">this</code><code class="java plain">.getClass();</code></div>
<div class="line number19 index18 alt2">
<code class="java spaces"> </code><code class="java keyword">return</code> <code class="java keyword">new</code> <code class="java plain">SeleniumConfiguration()</code></div>
<div class="line number20 index19 alt1">
<code class="java spaces"> </code><code class="java plain">.useSeleniumContext(context)</code></div>
<div class="line number21 index20 alt2">
<code class="java spaces"> </code><code class="java plain">.useWebDriverProvider(driverProvider)</code></div>
<div class="line number22 index21 alt1">
<code class="java spaces"> </code><code class="java plain">.useStepMonitor(</code><code class="java keyword">new</code> <code class="java plain">SeleniumStepMonitor(contextView, context, </code><code class="java keyword">new</code> <code class="java plain">SilentStepMonitor()))</code></div>
<div class="line number23 index22 alt2">
<code class="java spaces"> </code><code class="java plain">.useStoryLoader(</code><code class="java keyword">new</code> <code class="java plain">LoadFromClasspath(embeddableClass))</code></div>
<div class="line number24 index23 alt1">
<code class="java spaces"> </code><code class="java plain">.useStoryReporterBuilder(</code><code class="java keyword">new</code> <code class="java plain">StoryReporterBuilder()</code></div>
<div class="line number25 index24 alt2">
<code class="java spaces"> </code><code class="java plain">.withCodeLocation(codeLocationFromClass(embeddableClass))</code></div>
<div class="line number26 index25 alt1">
<code class="java spaces"> </code><code class="java plain">.withDefaultFormats()</code></div>
<div class="line number27 index26 alt2">
<code class="java spaces"> </code><code class="java plain">.withFormats(CONSOLE, TXT, HTML, XML));</code></div>
<div class="line number28 index27 alt1">
<code class="java spaces"> </code><code class="java plain">}</code></div>
<div class="line number29 index28 alt2">
</div>
<div class="line number30 index29 alt1">
<code class="java spaces"> </code><code class="java color1">@Override</code></div>
<div class="line number31 index30 alt2">
<code class="java spaces"> </code><code class="java keyword">public</code> <code class="java plain">InjectableStepsFactory stepsFactory() {</code></div>
<div class="line number32 index31 alt1">
<code class="java spaces"> </code><code class="java plain">Configuration configuration = configuration();</code></div>
<div class="line number33 index32 alt2">
<code class="java spaces"> </code><code class="java keyword">return</code> <code class="java keyword">new</code> <code class="java plain">InstanceStepsFactory(configuration, </code></div>
<div class="line number34 index33 alt1">
<code class="java spaces"> </code><code class="java keyword">new</code> <code class="java plain">TraderWebSteps(pages),</code></div>
<div class="line number35 index34 alt2">
<code class="java spaces"> </code><code class="java plain">lifecycleSteps,</code></div>
<div class="line number36 index35 alt1">
<code class="java spaces"> </code><code class="java keyword">new</code> <code class="java plain">WebDriverScreenshotOnFailure(driverProvider, configuration.storyReporterBuilder()));</code></div>
<div class="line number37 index36 alt2">
<code class="java spaces"> </code><code class="java plain">}</code></div>
<div class="line number38 index37 alt1">
</div>
<div class="line number39 index38 alt2">
</div>
<div class="line number40 index39 alt1">
<code class="java spaces"> </code><code class="java color1">@Override</code></div>
<div class="line number41 index40 alt2">
<code class="java spaces"> </code><code class="java keyword">protected</code> <code class="java plain">List<String> storyPaths() {</code></div>
<div class="line number42 index41 alt1">
<code class="java spaces"> </code><code class="java keyword">return</code> <code class="java keyword">new</code> <code class="java plain">StoryFinder()</code></div>
<div class="line number43 index42 alt2">
<code class="java spaces"> </code><code class="java plain">.findPaths(codeLocationFromClass(</code><code class="java keyword">this</code><code class="java plain">.getClass()).getFile(), asList(</code><code class="java string">"**/*.story"</code><code class="java plain">), </code><code class="java keyword">null</code><code class="java plain">);</code></div>
<div class="line number44 index43 alt1">
<code class="java spaces"> </code><code class="java plain">}</code></div>
<div class="line number45 index44 alt2">
</div>
<div class="line number46 index45 alt1">
<code class="java spaces"> </code><code class="java comments">// This Embedder is used by Maven or Ant and it will override anything set in the constructor</code></div>
<div class="line number47 index46 alt2">
<code class="java spaces"> </code><code class="java keyword">public</code> <code class="java keyword">static</code> <code class="java keyword">class</code> <code class="java plain">SameThreadEmbedder </code><code class="java keyword">extends</code> <code class="java plain">Embedder {</code></div>
<div class="line number48 index47 alt1">
<code class="java spaces"> </code> </div>
<div class="line number49 index48 alt2">
<code class="java spaces"> </code><code class="java keyword">public</code> <code class="java plain">SameThreadEmbedder() {</code></div>
<div class="line number50 index49 alt1">
<code class="java spaces"> </code><code class="java plain">useExecutorService(MoreExecutors.sameThreadExecutor());</code></div>
<div class="line number51 index50 alt2">
<code class="java spaces"> </code><code class="java plain">}</code></div>
<div class="line number52 index51 alt1">
</div>
<div class="line number53 index52 alt2">
<code class="java spaces"> </code><code class="java plain">}</code></div>
<div class="line number54 index53 alt1">
</div>
<div class="line number55 index54 alt2">
<code class="java plain">}</code></div>
</div>
</td></tr>
</tbody></table>
</div>
</div>
<h2>
Жизненный цикл шагов </h2>
JBehave интеграции с Selenium и WebDriver API, направлена на выполнение общих задач. Среди них одна из самых распространенных является управление жизненным циклом, например, запуском и остановкой браузера. <br />
JBehave предусматривает три типа управления жизненным циклом: <br />
<ol>
<li> Через истории: через <a href="http://translate.googleusercontent.com/translate_c?depth=1&hl=ru&ie=UTF8&prev=_t&rurl=translate.google.ru&sl=auto&tl=ru&twu=1&u=http://jbehave.org/reference/web/latest/javadoc/web-selenium/org/jbehave/web/selenium/PerStoriesSeleniumSteps.html&usg=ALkJrhiB6xIa5sdET7nE_g-O3HSStLEYpQ">PerStoriesSeleniumSteps</a> или <a href="http://translate.googleusercontent.com/translate_c?depth=1&hl=ru&ie=UTF8&prev=_t&rurl=translate.google.ru&sl=auto&tl=ru&twu=1&u=http://jbehave.org/reference/web/latest/javadoc/web-selenium/org/jbehave/web/selenium/PerStoriesWebDriverSteps.html&usg=ALkJrhh3NCDKqnn8yv66Ug1TNYf7Pp6cKQ">PerStoriesWebDriverSteps</a> . </li>
<li> Через историю: через <a href="http://translate.googleusercontent.com/translate_c?depth=1&hl=ru&ie=UTF8&prev=_t&rurl=translate.google.ru&sl=auto&tl=ru&twu=1&u=http://jbehave.org/reference/web/latest/javadoc/web-selenium/org/jbehave/web/selenium/PerStorySeleniumSteps.html&usg=ALkJrhjaW-ex6euRB80-Z-WA2G3bmojJjA">PerStorySeleniumSteps</a> или <a href="http://translate.googleusercontent.com/translate_c?depth=1&hl=ru&ie=UTF8&prev=_t&rurl=translate.google.ru&sl=auto&tl=ru&twu=1&u=http://jbehave.org/reference/web/latest/javadoc/web-selenium/org/jbehave/web/selenium/PerStoryWebDriverSteps.html&usg=ALkJrhjxevp1Ry8je6SoAs48NO_IwGbp0w">PerStoryWebDriverSteps</a> . </li>
<li> Через сценарий: через <a href="http://translate.googleusercontent.com/translate_c?depth=1&hl=ru&ie=UTF8&prev=_t&rurl=translate.google.ru&sl=auto&tl=ru&twu=1&u=http://jbehave.org/reference/web/latest/javadoc/web-selenium/org/jbehave/web/selenium/PerScenarioSeleniumSteps.html&usg=ALkJrhibUSspUSTv56Bm_L_LBz8W3izc-g">PerScenarioSeleniumSteps</a> или <a href="http://translate.googleusercontent.com/translate_c?depth=1&hl=ru&ie=UTF8&prev=_t&rurl=translate.google.ru&sl=auto&tl=ru&twu=1&u=http://jbehave.org/reference/web/latest/javadoc/web-selenium/org/jbehave/web/selenium/PerScenarioWebDriverSteps.html&usg=ALkJrhjHSaOsoCOGN14bCVbq2oFKJeQL5Q">PerScenarioWebDriverSteps</a> . </li>
</ol>
<span class="followup">Если вы используете контроль жизненного цикла через истории, вы должны убедиться, что вы используете нужный испольнитель.</span> <span class="followup"> trader-webdriver пример показывает, как настроить использование одного и того же потока исполнителя.</span> <br />
<h2>
Запуск Selenium-тестов в автоматическом режиме </h2>
<b>ПРИМЕЧАНИЕ: </b>Для запуска Selenium-тестов в автоматическом режиме,
вам нужно запустить два сервера, например Jetty, и Selenium Server (только для Selenium API, для WebDriver API не нужно). См. <a href="https://github.com/jbehave/jbehave-web/blob/master/examples/trader-runner-selenium">trader
runner selenium example</a> и <a href="https://github.com/jbehave/jbehave-web/blob/master/examples/trader-runner-webdriver">trader
runner webdriver example</a><a href="https://github.com/jbehave/jbehave-web/blob/master/examples/trader-runner-webdriver"></a>, отличным способом для того чтобы сделать это будет <a href="http://translate.googleusercontent.com/translate_c?depth=1&hl=ru&ie=UTF8&prev=_t&rurl=translate.google.ru&sl=auto&tl=ru&twu=1&u=http://maven.apache.org/&usg=ALkJrhhIhB4oK96FuPlB7zF-VK66NGTRFQ">Maven</a>. </div>
Алексейhttp://www.blogger.com/profile/18264724295847697355noreply@blogger.com0tag:blogger.com,1999:blog-5323029390952017375.post-87213667272615907762012-07-19T04:29:00.003-07:002012-07-19T04:30:11.763-07:00Горячии вакансии Neoflex<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.neoflex.ru/images/style/ru_logo.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://www.neoflex.ru/images/style/ru_logo.gif" /></a></div>
<br />
<br />
<b><span style="color: red; font-family: "Arial","sans-serif";">! </span></b><b><span lang="EN-US" style="font-family: "Arial","sans-serif";">Java</span></b><b><span style="font-family: "Arial","sans-serif";">-разработчик</span></b><span style="font-family: "Arial","sans-serif";"></span><br />
<div class="MsoNormal" style="background: white;">
<b><span style="font-family: "Arial","sans-serif";">Требования:</span></b></div>
<div class="MsoListParagraph" style="background: none repeat scroll 0% 0% white;">
<span style="font-family: Symbol;">·<span style="font: 7pt "Times New Roman";"> </span></span><span style="font-family: "Arial","sans-serif";">высшее или неполное высшее техническое образование;</span></div>
<div class="MsoListParagraph" style="background: none repeat scroll 0% 0% white;">
<span style="font-family: Symbol;">·<span style="font: 7pt "Times New Roman";"> </span></span><span style="font-family: "Arial","sans-serif";">опыт разработки J2EE-приложений от 1,5 лет;</span></div>
<div class="MsoListParagraph" style="background: none repeat scroll 0% 0% white;">
<span style="font-family: Symbol;">·<span style="font: 7pt "Times New Roman";"> </span></span><span style="font-family: "Arial","sans-serif";">знание и практическое применение EJB, JMS или WebServices;</span></div>
<div class="MsoListParagraph" style="background: none repeat scroll 0% 0% white;">
<span style="font-family: Symbol;">·<span style="font: 7pt "Times New Roman";"> </span></span><span style="font-family: "Arial","sans-serif";">опыт работы с СУБД (MS SQL Server или Oracle);</span></div>
<div class="MsoListParagraph" style="background: none repeat scroll 0% 0% white;">
<span style="font-family: Symbol;">·<span style="font: 7pt "Times New Roman";"> </span></span><span style="font-family: "Arial","sans-serif";">как плюс – наличие опыта работы с WebSphere Application Server, WebSphere MQ и знание UML, BPEL;</span></div>
<div class="MsoListParagraph" style="background: none repeat scroll 0% 0% white;">
<span style="font-family: Symbol;">·<span style="font: 7pt "Times New Roman";"> </span></span><span style="font-family: "Arial","sans-serif";">английский (на уровне технической документации).</span></div>
<div class="MsoNormal" style="background: white;">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="background: white; margin-bottom: 12.0pt;">
<b><span style="color: red; font-family: "Arial","sans-serif";">! </span></b><b><span lang="EN-US" style="font-family: "Arial","sans-serif";">Специалист по автоматизированному тестированию</span></b><b><span style="font-family: "Arial","sans-serif";"></span></b></div>
<div class="MsoNormal" style="background: white;">
<b><span style="font-family: "Arial","sans-serif";">Требования:</span></b></div>
<div class="MsoNormal" style="margin-left: 35.7pt;">
<span style="font-family: Symbol; font-size: 10pt;">·<span style="font: 7pt "Times New Roman";"> </span></span><span style="font-family: "Arial","sans-serif";">опыт тестирования от 1-го года;</span></div>
<div class="MsoNormal" style="margin-left: 35.7pt;">
<span style="font-family: Symbol; font-size: 10pt;">·<span style="font: 7pt "Times New Roman";"> </span></span><span style="font-family: "Arial","sans-serif";">опыт автоматизации тестирования с помощью любых инструментов;</span></div>
<div class="MsoNormal" style="margin-left: 35.7pt;">
<span style="font-family: Symbol; font-size: 10pt;">·<span style="font: 7pt "Times New Roman";"> </span></span><span style="font-family: "Arial","sans-serif";">теоретические знания и опыт программирования на одном из объектно-ориентированных языков (Java, C#, PHP);</span></div>
<div class="MsoNormal" style="margin-left: 35.7pt;">
<span style="font-family: Symbol; font-size: 10pt;">·<span style="font: 7pt "Times New Roman";"> </span></span><span style="font-family: "Arial","sans-serif";">знание SQL и опыт написания запросов средней сложности;</span></div>
<div class="MsoNormal" style="margin-bottom: 12pt; margin-left: 35.7pt; margin-right: 0cm;">
<span style="font-family: Symbol; font-size: 10pt;">·<span style="font: 7pt "Times New Roman";"> </span></span><span style="font-family: "Arial","sans-serif";">желание профессионально развиваться в направлении автоматизации тестирования и разработке тестовых фреймворков.</span></div>
<div class="MsoNormal" style="background: white;">
<br /></div>
<div class="MsoNormal" style="background: white; margin-bottom: 12.0pt;">
<b><span style="color: red; font-family: "Arial","sans-serif";">! </span></b><b><span style="font-family: "Arial","sans-serif";">Старший специалист по поддержке интеграционных ИТ-решений (ЕСТП)</span></b></div>
<div class="MsoNormal" style="background: white;">
<b><span style="font-family: "Arial","sans-serif";">Требования:</span></b></div>
<div class="MsoNormal" style="margin-left: 35.7pt;">
<span style="font-family: Symbol; font-size: 10pt;">·<span style="font: 7pt "Times New Roman";"> </span></span><span style="font-family: "Arial","sans-serif";">знание SQL(базовый уровень);</span></div>
<div class="MsoNormal" style="margin-left: 35.7pt;">
<span style="font-family: Symbol; font-size: 10pt;">·<span style="font: 7pt "Times New Roman";"> </span></span><span style="font-family: "Arial","sans-serif";">знание Java (базовый уровень);</span></div>
<div class="MsoNormal" style="margin-left: 35.7pt;">
<span style="font-family: Symbol; font-size: 10pt;">·<span style="font: 7pt "Times New Roman";"> </span></span><span style="font-family: "Arial","sans-serif";">опыт работы с J2EE серверами приложений;</span></div>
<div class="MsoNormal" style="margin-left: 35.7pt;">
<span style="font-family: Symbol; font-size: 10pt;">·<span style="font: 7pt "Times New Roman";"> </span></span><span style="font-family: "Arial","sans-serif";">опыт работы с промышленными СУБД (Microsoft SQL Server, Oracle, IBM DB2, Sybase, PostgreSQL и т.д.);</span></div>
<div class="MsoNormal" style="margin-left: 35.7pt;">
<span style="font-family: Symbol; font-size: 10pt;">·<span style="font: 7pt "Times New Roman";"> </span></span><span style="font-family: "Arial","sans-serif";">опыт поддержки бизнес-систем от 1 года (предпочтителен опыт в поддержке банковских программных продуктов).</span></div>
<div class="MsoNormal">
<br /></div>
</div>Алексейhttp://www.blogger.com/profile/18264724295847697355noreply@blogger.com2tag:blogger.com,1999:blog-5323029390952017375.post-34321208675400467612012-07-18T07:12:00.000-07:002012-07-18T07:12:25.666-07:00Badoo ищет специалистов !<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEij5sKCMcHohE2Pr-Voj3xOLZ99Mdl0hRNLC7Rv_kRmjSnpu7w2X-J6c1Sf8OXH-GJXkibeewIs2G2h31HwNMZLM3MKzdKx0OW00vJJ-GdAcbQeKgEc2TXKuRXAZO2Jbz2LOsIY9gWU9_2f/s1600/581904.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="45" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEij5sKCMcHohE2Pr-Voj3xOLZ99Mdl0hRNLC7Rv_kRmjSnpu7w2X-J6c1Sf8OXH-GJXkibeewIs2G2h31HwNMZLM3MKzdKx0OW00vJJ-GdAcbQeKgEc2TXKuRXAZO2Jbz2LOsIY9gWU9_2f/s320/581904.png" width="154" /></a></div>
<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<br />
<b>Badoo</b> — крупнейшая и самая быстрорастущая социальная сеть для встреч с новыми интересными людьми. Badoo объединяет более <b>150 миллионов пользователей</b> в 180 странах мира.<br />
<br />
Сайт <b> Badoo</b>
находится на 115-м месте во всемирном рейтинге наиболее популярных
веб-сайтов согласно рейтингу Alexa.com. В рейтинге самых посещаемых
сайтов в мире Google TOP 1000 — на 59-м месте c посещаемостью в 46
миллионов уникальных пользователей в месяц, обгоняя Яндекс (69-е место) и
Одноклассники (84-е).<br />
<br />
Ежедневно в <b>Badoo</b>
регистрируются более 150 тысяч новых пользователей, загружается свыше 3
миллионов фотографий, отправляется более 50 миллионов сообщений. <b>Badoo</b>
— технически сложный, очень высоконагруженный проект. Стабильную работу
проекта обеспечивают 2 тысячи серверов, расположенных в двух
географически удаленных дата-центрах (Майами, Прага). Ежедневно
динамическая нагрузка на бэкенды в пиковые часы составляет более 40
тысяч запросов в секунду. За сутки в аналитические системы <b>Badoo</b> загружается несколько миллиардов событий.<br />
<br />
Ряд внутренних разработок <b>Badoo</b>
был открыт под свободными лицензиями, наиболее известные продукты —
FCGI-менеджер для PHP (php-fpm), сервер Pinba для сбора статистики в
реальном времени, быстрый шаблонизатор Blitz.<br />
<br />
<b>Badoo сегодня:</b><br />
<br />
<ul>
<li>150+ миллионов пользователей в 180 странах;</li>
<li>153+ тысячи новых пользователей ежедневно;</li>
<li>3+ миллиона фото и видео загружается каждый день;</li>
<li>200+ сотрудников;</li>
<li>которые говорят на 39 языках.</li>
</ul>
<br />
<b>Мы предлагаем:</b><br />
<ul>
<li>Высокую зарплату;</li>
<li>Опционную программу — участие в капитале компании;</li>
<li>Демократичный стиль работы и гибкий график;</li>
<li>Медицинское
страхование, дающее доступ в лучшие клиники в центре Москвы, включая
стоматологию, страхование жизни от несчастных случаев;</li>
<li>Развитую бонусную систему: ежеквартальные и менеджерские премии, премии “thank you”, которые сотрудники могут давать друг другу;</li>
<li>Занятия английским языком, языковую практику в лондонском головном офисе;</li>
<li>Оплату спортклуба;</li>
<li>Компенсацию расходов при переезде для иногородних кандидатов, успешно прошедших интервью;</li>
<li>Пятничные посиделки с пиццей/пирогами/суши;</li>
<li>Cовременный
офис в центре Москвы — м. Театральная, ул. Петровка, 15/13. Скоро
переезжаем на Трубную площадь в только что построенный офисный центр,
сейчас там делают для нас ремонт.</li>
<li>Реферрал-бонус за успешную рекомендацию — 2000 евро.</li>
</ul>
<br />
<a href="http://hh.ru/employer/746069" target="_blank">Откликайтесь!</a></div>
</div>Алексейhttp://www.blogger.com/profile/18264724295847697355noreply@blogger.com0tag:blogger.com,1999:blog-5323029390952017375.post-4560140915612339692012-07-10T23:28:00.000-07:002012-07-10T23:28:57.307-07:00WebDriver теперь станет стандартом ?<div dir="ltr" style="text-align: left;" trbidi="on">
<a href="http://www.w3.org/TR/2012/WD-webdriver-20120710/">http://www.w3.org/TR/2012/WD-webdriver-20120710/</a> </div>Алексейhttp://www.blogger.com/profile/18264724295847697355noreply@blogger.com1tag:blogger.com,1999:blog-5323029390952017375.post-66441210373923605062012-07-10T05:55:00.002-07:002012-07-10T05:56:42.366-07:00Немножко о Watir<div dir="ltr" style="text-align: left;" trbidi="on">
Выкладываю очень интересную презентацию по Watir.<br />
<br />
<iframe height="480" src="https://docs.google.com/file/d/0B5HFhWRHrNMySmdwVEp2cndPQ2M/preview" width="540"></iframe>
</div>Алексейhttp://www.blogger.com/profile/18264724295847697355noreply@blogger.com2tag:blogger.com,1999:blog-5323029390952017375.post-52891491310018272682012-07-09T23:33:00.001-07:002012-07-09T23:34:30.995-07:00Ускоряем тесты с PhantomJS<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/wqxkKIC2HDY?feature=player_embedded' frameborder='0'></iframe></div>
<br />
Видео с лондонской конференции по Selenium.<br />
Подробнее можно почитать тут <a href="https://github.com/detro/ghostdriver">https://github.com/detro/ghostdriver</a><br />
<br /></div>Алексейhttp://www.blogger.com/profile/18264724295847697355noreply@blogger.com0