This code requires:
- Node.js
- Python 2.7.x
- Java Runtime Environment
- mocha
- selenium-webdriver
- Selenium server
- DriverProvider
This code requires:
| var assert = require('assert'); | |
| var until = require('selenium-webdriver').until; | |
| var promise = require('selenium-webdriver').promise; | |
| var By = require('selenium-webdriver').By; | |
| var widgetLocator = By.css('.b-weather'); | |
| var titleLocator = By.css('.b-content-item__title > .b-link:nth-child(1)'); | |
| var temperatureLocator = By.css('.b-content-item__title > .b-link:nth-child(3)'); | |
| var Component = function (driver) { | |
| this._driver = driver; | |
| }; | |
| Component.prototype._getWidget = function () { | |
| var driver = this._driver; | |
| return driver.isElementPresent(widgetLocator) | |
| .then(function (result) { | |
| if (!result) { | |
| throw new Error('Weather component is not found'); | |
| } | |
| return driver.findElement(widgetLocator); | |
| }); | |
| }; | |
| Component.prototype.validate = function () { | |
| return this._getWidget() | |
| .then(function (widget) { | |
| var title = widget.findElement(titleLocator); | |
| return title.getText() | |
| .then(function (text) { | |
| assert.equal(text, '\u041f\u043e\u0433\u043e\u0434\u0430'); | |
| return true; | |
| }); | |
| }); | |
| }; | |
| Component.prototype.getTemperature = function () { | |
| return this._getWidget() | |
| .then(function (widget) { | |
| var temperature = widget.findElement(temperatureLocator); | |
| return temperature.getText() | |
| .then(function (text) { | |
| assert.notEqual(text, ''); | |
| return text; | |
| }); | |
| }); | |
| }; | |
| module.exports = Component; |
| var DriverProvider = require('./selenium-server/driver-provider'); | |
| var assert = require('assert'); | |
| var test = require('selenium-webdriver/testing'); | |
| var Page = require('./page-objects/yandex'); | |
| test.describe('Yandex home page', function () { | |
| var driverProvider = new DriverProvider(); | |
| test.before(function () { | |
| return driverProvider.startUp(); | |
| }); | |
| test.after(function () { | |
| return driverProvider.tearDown(); | |
| }); | |
| test.it('should be valid', function () { | |
| var driver = driverProvider.getDriver(); | |
| var page = new Page(driver); | |
| return page | |
| .open(page.getReadyCondition()) | |
| .validate(); | |
| }); | |
| test.it('should have at least 9 tabs above the search', function () { | |
| var driver = driverProvider.getDriver(); | |
| var page = new Page(driver); | |
| return page | |
| .open(page.getReadyCondition()) | |
| .getMenuComponent() | |
| .getItems() | |
| .then(function (items) { | |
| /* | |
| items == [ | |
| { text: 'Поиск', href: null } | |
| { text: 'Карты', href: 'http://maps.yandex.ru/' } | |
| { text: 'Маркет', href: 'http://market.yandex.ru/?clid=505' } | |
| { text: 'Новости', href: 'http://news.yandex.ru/' } | |
| { text: 'Словари', href: 'http://slovari.yandex.ru/' } | |
| { text: 'Картинки', href: 'http://yandex.ru/images/' } | |
| { text: 'Видео', href: 'http://yandex.ru/video' } | |
| { text: 'Музыка', href: 'http://music.yandex.ru/' } | |
| { text: 'Перевод', href: 'http://translate.yandex.ru/' } | |
| { text: 'ещё', href: 'http://www.yandex.ru/all' } | |
| ] | |
| */ | |
| assert.ok(items.length > 9); | |
| }); | |
| }); | |
| test.it('should have a weather widget', function () { | |
| var driver = driverProvider.getDriver(); | |
| var page = new Page(driver); | |
| return page | |
| .open(page.getReadyCondition()) | |
| .getWeatherComponent() | |
| .getTemperature() | |
| .then(function (temperature) { | |
| /* temperature == '+4 °C' */ | |
| assert.ok(temperature); | |
| }); | |
| }); | |
| }); |
| var until = require('selenium-webdriver').until; | |
| var promise = require('selenium-webdriver').promise; | |
| var By = require('selenium-webdriver').By; | |
| var logoLocator = By.css('.b-logo'); | |
| var Page = function (driver) { | |
| this._driver = driver; | |
| }; | |
| Page.prototype.url = 'http://www.yandex.ru/'; | |
| Page.prototype.open = function (condition) { | |
| this._driver.get(this.url); | |
| this.waitReady(condition); | |
| return this; | |
| }; | |
| Page.prototype.waitReady = function (condition, timeout) { | |
| if (condition) { | |
| timeout = timeout || 10 * 1000; | |
| this._driver.wait(condition, timeout); | |
| } | |
| return this; | |
| }; | |
| Page.prototype.getReadyCondition = function () { | |
| return until.elementLocated(logoLocator); | |
| }; | |
| Page.prototype.getWeatherComponent = function () { | |
| var Component = require('./weather-component'); | |
| return new Component(this._driver); | |
| }; | |
| Page.prototype.getMenuComponent = function () { | |
| var Component = require('./menu-component'); | |
| return new Component(this._driver); | |
| }; | |
| Page.prototype.validate = function () { | |
| return promise | |
| .all([ | |
| this.getMenuComponent().validate(), | |
| this.getWeatherComponent().validate() | |
| ]) | |
| .then(function (results) { | |
| return results[0] && results[1]; | |
| }); | |
| }; | |
| module.exports = Page; |