diff --git a/README.md b/README.md
index 69e007d..e9f9400 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1 @@
-# Practice of automation school 2016
-
-See all info in repo [autoschool/autoschool.github.io](https://github.com/autoschool/autoschool.github.io)
+Ссылка на репозиторий с докер файлом: https://github.com/vananos/Docker.git
diff --git a/commons-module/pom.xml b/commons-module/pom.xml
new file mode 100644
index 0000000..a123fc2
--- /dev/null
+++ b/commons-module/pom.xml
@@ -0,0 +1,52 @@
+
+
+ 4.0.0
+
+
+ school-2016
+ ru.qatools.school
+ 1.0-SNAPSHOT
+
+
+ commons-module
+ jar
+
+ Commons Module
+
+
+
+ ru.qatools.school
+ steps-module
+ ${project.version}
+
+
+ com.tngtech.java
+ junit-dataprovider
+ 1.10.4
+ test
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+
+
+
+ true
+
+
+ ru.yandex.qatools.allure
+ allure-maven-plugin
+ 2.5
+
+
+
+
+
diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/BaseWeatherAppTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/BaseWeatherAppTest.java
new file mode 100644
index 0000000..fe61f8c
--- /dev/null
+++ b/commons-module/src/test/java/ru/qatools/school/webtests/BaseWeatherAppTest.java
@@ -0,0 +1,29 @@
+package ru.qatools.school.webtests;
+
+import org.junit.Before;
+import org.junit.Rule;
+import ru.qatools.school.pages.MainPage;
+import ru.qatools.school.rules.WebDriverRule;
+import ru.qatools.school.steps.websteps.DefaultSteps;
+import ru.qatools.school.tp.TPInformerRule;
+
+/**
+ * Created by vananos on 4/20/16.
+ */
+public class BaseWeatherAppTest {
+ public static final String CITY = "Moscow";
+ @Rule
+ public WebDriverRule webDriverRule = new WebDriverRule();
+ @Rule
+ public TPInformerRule tms = new TPInformerRule("vananos");
+ protected DefaultSteps defaultSteps;
+
+ @Before
+ public void initSteps() {
+ defaultSteps = new DefaultSteps(webDriverRule.getDriver());
+ }
+
+ protected MainPage onMainPage() {
+ return new MainPage(webDriverRule.getDriver());
+ }
+}
diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/pagetest/AddWidgetButtonTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/pagetest/AddWidgetButtonTest.java
new file mode 100644
index 0000000..87ecbb1
--- /dev/null
+++ b/commons-module/src/test/java/ru/qatools/school/webtests/pagetest/AddWidgetButtonTest.java
@@ -0,0 +1,34 @@
+package ru.qatools.school.webtests.pagetest;
+
+import com.tngtech.java.junit.dataprovider.DataProvider;
+import com.tngtech.java.junit.dataprovider.DataProviderRunner;
+import com.tngtech.java.junit.dataprovider.UseDataProvider;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import ru.qatools.school.webtests.BaseWeatherAppTest;
+import ru.yandex.qatools.allure.annotations.TestCaseId;
+import ru.yandex.qatools.allure.annotations.Title;
+
+
+@RunWith(DataProviderRunner.class)
+public class AddWidgetButtonTest extends BaseWeatherAppTest {
+
+ @DataProvider
+ public static Object[][] dataProviderNumber() {
+ return new Object[][]{
+ {1}, {2}
+ };
+ }
+
+
+ @Test
+ @Title("Жмем на кнопку n раз, должно быть n+1 виджетов")
+ @UseDataProvider("dataProviderNumber")
+ @TestCaseId("1")
+ public void shouldSeeNPlusOneWidgetsAfterNClickByAddButton(int n) {
+ defaultSteps.openMainPageWithCity(CITY);
+ defaultSteps.clickNTimes(onMainPage().getNewWidgetButton(),n);
+ defaultSteps.widgetsAmountShouldBe(n + 1);
+ }
+
+}
diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/pagetest/PageIsNotEmptyTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/pagetest/PageIsNotEmptyTest.java
new file mode 100644
index 0000000..8b75371
--- /dev/null
+++ b/commons-module/src/test/java/ru/qatools/school/webtests/pagetest/PageIsNotEmptyTest.java
@@ -0,0 +1,25 @@
+package ru.qatools.school.webtests.pagetest;
+
+import org.junit.Test;
+import ru.qatools.school.webtests.BaseWeatherAppTest;
+import ru.yandex.qatools.allure.annotations.TestCaseId;
+import ru.yandex.qatools.allure.annotations.Title;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.core.Is.is;
+import static org.hamcrest.core.IsNot.not;
+
+
+public class PageIsNotEmptyTest extends BaseWeatherAppTest {
+
+
+ @Test
+ @Title("При открытии страницы с пустым параметром cites на странице должна быть кнопка добавления виджета")
+ @TestCaseId("6")
+ public void addWidgetbuttonShouldBeOnPage() {
+ defaultSteps.openMainPage();
+ System.out.println(onMainPage());
+ assertThat(onMainPage().getNewWidgetButton(), is(not(null)));
+ }
+
+}
\ No newline at end of file
diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/pagetest/WeatherWebTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/pagetest/WeatherWebTest.java
new file mode 100644
index 0000000..cfa5d1b
--- /dev/null
+++ b/commons-module/src/test/java/ru/qatools/school/webtests/pagetest/WeatherWebTest.java
@@ -0,0 +1,20 @@
+package ru.qatools.school.webtests.pagetest;
+
+import org.junit.Test;
+import ru.qatools.school.webtests.BaseWeatherAppTest;
+import ru.yandex.qatools.allure.annotations.TestCaseId;
+import ru.yandex.qatools.allure.annotations.Title;
+
+
+public class WeatherWebTest extends BaseWeatherAppTest {
+
+
+ @Test
+ @Title("Должны видеть виджет на главной странице")
+ @TestCaseId("4")
+ public void shouldSeeWidgetOnMainPage() {
+ defaultSteps.openMainPageWithCity(CITY);
+ defaultSteps.shouldSee(onMainPage().getWeatherWidgetList().get(0));
+ }
+
+}
diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/DateTimeTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/DateTimeTest.java
new file mode 100644
index 0000000..d77408a
--- /dev/null
+++ b/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/DateTimeTest.java
@@ -0,0 +1,26 @@
+package ru.qatools.school.webtests.widgettest;
+
+import org.junit.Test;
+import ru.qatools.school.RepresentationPatterns;
+import ru.qatools.school.webtests.BaseWeatherAppTest;
+import ru.yandex.qatools.allure.annotations.TestCaseId;
+import ru.yandex.qatools.allure.annotations.Title;
+
+
+/**
+ * Created by vananos on 4/22/16.
+ */
+public class DateTimeTest extends BaseWeatherAppTest {
+
+
+ @Test
+ @Title("Дата должна отображаться в соответствии с определенным представлением")
+ @TestCaseId("7")
+ public void dateTimeTest() {
+ defaultSteps.openMainPageWithCity(CITY);
+ defaultSteps.shouldBeRepresentedAs(
+ onMainPage().getWeatherWidgetList().get(0).getWidgetTitle().getDateTime().getText()
+ , RepresentationPatterns.DATE_TIME
+ );
+ }
+}
diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/InfoFieldsTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/InfoFieldsTest.java
new file mode 100644
index 0000000..a432b65
--- /dev/null
+++ b/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/InfoFieldsTest.java
@@ -0,0 +1,44 @@
+package ru.qatools.school.webtests.widgettest;
+
+import com.tngtech.java.junit.dataprovider.DataProvider;
+import com.tngtech.java.junit.dataprovider.DataProviderRunner;
+import com.tngtech.java.junit.dataprovider.UseDataProvider;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import ru.qatools.school.RepresentationPatterns;
+import ru.qatools.school.pages.blocks.widgetblocks.InfoLine;
+import ru.qatools.school.webtests.BaseWeatherAppTest;
+import ru.yandex.qatools.allure.annotations.TestCaseId;
+import ru.yandex.qatools.allure.annotations.Title;
+import ru.yandex.qatools.htmlelements.element.HtmlElement;
+
+import java.util.List;
+
+@RunWith(DataProviderRunner.class)
+public class InfoFieldsTest extends BaseWeatherAppTest {
+
+ @DataProvider
+ public static Object[][] dataProvider() {
+
+ return new Object[][]{
+ {0, RepresentationPatterns.SUNRISE},
+ {1, RepresentationPatterns.SUNSET},
+ {2, RepresentationPatterns.WIND},
+ {3, RepresentationPatterns.HUMIDITY}
+ };
+ }
+
+
+ @Test
+ @Title("Проверяем, что поля соответствуют паттернам")
+ @UseDataProvider("dataProvider")
+ @TestCaseId("8")
+ public void infoFieldsTest(int n, RepresentationPatterns pattern) {
+ defaultSteps.openMainPageWithCity(CITY);
+ InfoLine infoLine = onMainPage().getWeatherWidgetList().get(0).getWidgetText().getInfoLines().get(n);
+ defaultSteps.shouldBeRepresentedAs(infoLine.getTextRepresentation(), pattern);
+ defaultSteps.shouldSee(infoLine.getImage());
+
+ }
+
+}
\ No newline at end of file
diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/RemoveButtonTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/RemoveButtonTest.java
new file mode 100644
index 0000000..0470ab5
--- /dev/null
+++ b/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/RemoveButtonTest.java
@@ -0,0 +1,35 @@
+package ru.qatools.school.webtests.widgettest;
+
+import com.tngtech.java.junit.dataprovider.DataProvider;
+import com.tngtech.java.junit.dataprovider.DataProviderRunner;
+import com.tngtech.java.junit.dataprovider.UseDataProvider;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import ru.qatools.school.webtests.BaseWeatherAppTest;
+import ru.yandex.qatools.allure.annotations.TestCaseId;
+import ru.yandex.qatools.allure.annotations.Title;
+
+
+@RunWith(DataProviderRunner.class)
+public class RemoveButtonTest extends BaseWeatherAppTest {
+
+ @DataProvider
+ public static Object[][] dataProviderNumber() {
+ return new Object[][]{
+ {0}, {3}
+ };
+ }
+
+
+ @Test
+ @Title("Жмем на кнопку добавления n раз, Затем удаляем средний виджет")
+ @UseDataProvider("dataProviderNumber")
+ @TestCaseId("3")
+ public void shouldSeeNWidgetsAfterOneClickByRemoveButton(int n) {
+ defaultSteps.openMainPageWithCity(CITY);
+ defaultSteps.clickNTimes(onMainPage().getNewWidgetButton(), n);
+ defaultSteps.click(onMainPage().getWeatherWidgetList().get(n / 2).getActionBlock().getRemoveButton());
+ defaultSteps.widgetsAmountShouldBe(n);
+ }
+
+}
\ No newline at end of file
diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/TemperatureBlockTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/TemperatureBlockTest.java
new file mode 100644
index 0000000..8a1b55d
--- /dev/null
+++ b/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/TemperatureBlockTest.java
@@ -0,0 +1,46 @@
+package ru.qatools.school.webtests.widgettest;
+
+import com.tngtech.java.junit.dataprovider.DataProvider;
+import com.tngtech.java.junit.dataprovider.DataProviderRunner;
+import com.tngtech.java.junit.dataprovider.UseDataProvider;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import ru.qatools.school.RepresentationPatterns;
+import ru.qatools.school.pages.blocks.widgetblocks.TemperatureBlock;
+import ru.qatools.school.webtests.BaseWeatherAppTest;
+import ru.yandex.qatools.allure.annotations.TestCaseId;
+import ru.yandex.qatools.allure.annotations.Title;
+
+
+/**
+ * Created by vananos on 4/22/16.
+ */
+@RunWith(DataProviderRunner.class)
+public class TemperatureBlockTest extends BaseWeatherAppTest {
+
+ @DataProvider
+ public static Object[][] dataProvider() {
+ return new Object[][]{
+ {0,RepresentationPatterns.CELSIUS},
+ {1,RepresentationPatterns.KELVIN},
+ {2, RepresentationPatterns.FAHRENHEIT},
+ {3, RepresentationPatterns.KAIF},
+ {4, RepresentationPatterns.CELSIUS}
+ };
+ }
+
+
+ @Test
+ @Title("Температура должна отображаться в соответствии с определенным представлением")
+ @UseDataProvider("dataProvider")
+ @TestCaseId("5")
+ public void temperatureBlockTest(int n,RepresentationPatterns pattern) {
+ defaultSteps.openMainPageWithCity(CITY);
+ TemperatureBlock temperatureBlock = onMainPage().getWeatherWidgetList()
+ .get(0).getWidgetText().getTempBlock();
+ defaultSteps.clickNTimes(temperatureBlock,n);
+ defaultSteps.shouldBeRepresentedAs(temperatureBlock.getRepresentation(), pattern);
+
+
+ }
+}
diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/TitleTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/TitleTest.java
new file mode 100644
index 0000000..11869dd
--- /dev/null
+++ b/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/TitleTest.java
@@ -0,0 +1,37 @@
+package ru.qatools.school.webtests.widgettest;
+
+import com.tngtech.java.junit.dataprovider.DataProvider;
+import com.tngtech.java.junit.dataprovider.DataProviderRunner;
+import com.tngtech.java.junit.dataprovider.UseDataProvider;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import ru.qatools.school.webtests.BaseWeatherAppTest;
+import ru.yandex.qatools.allure.annotations.TestCaseId;
+import ru.yandex.qatools.allure.annotations.Title;
+
+
+@RunWith(DataProviderRunner.class)
+
+public class TitleTest extends BaseWeatherAppTest {
+
+ @DataProvider
+ public static Object[][] dataProviderCity() {
+ return new Object[][]{
+ {"Moscow"},
+ {"Kiev"},
+ {"Berlin"},
+ {"New York"}
+ };
+ }
+
+
+ @Test
+ @Title("В названии погоды должен быть город «{0}»")
+ @UseDataProvider("dataProviderCity")
+ @TestCaseId("2")
+ public void titleShouldBeCity(String city) {
+ defaultSteps.openMainPageWithCity(city);
+ defaultSteps.cityIntitleShouldBe(onMainPage().getWeatherWidgetList().get(0).getWidgetTitle(), city);
+ }
+
+}
diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/WeatherImageTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/WeatherImageTest.java
new file mode 100644
index 0000000..34fea44
--- /dev/null
+++ b/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/WeatherImageTest.java
@@ -0,0 +1,20 @@
+package ru.qatools.school.webtests.widgettest;
+
+import org.junit.Test;
+import ru.qatools.school.webtests.BaseWeatherAppTest;
+import ru.yandex.qatools.allure.annotations.TestCaseId;
+import ru.yandex.qatools.allure.annotations.Title;
+
+/**
+ * Created by vananos on 4/21/16.
+ */
+public class WeatherImageTest extends BaseWeatherAppTest {
+
+ @Test
+ @Title("Проверяет наличие картинки погоды")
+ @TestCaseId("9")
+ public void widgetImageTest() {
+ defaultSteps.openMainPageWithCity(CITY);
+ defaultSteps.shouldSee(onMainPage().getWeatherWidgetList().get(0).getWidgetText().getWeatherImage());
+ }
+}
diff --git a/pom.xml b/pom.xml
index 206b663..09b852e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,23 +1,117 @@
-
4.0.0
ru.qatools.school
school-2016
- pom
1.0-SNAPSHOT
-
+ pom
+
+ Automation Foreva
+ First automation project ever
+
steps-module
+ commons-module
- Automation Foreva
- First automation project ever
-
+
+ 1.8
+
+ 1.4.23
+ 2.53.0
+ 1.15
+ 1.8.5
+
+
-
+
+ junit
+ junit
+ 4.12
+
-
-
\ No newline at end of file
+
+
+
+
+ ru.yandex.qatools.allure
+ allure-junit-adaptor
+ ${allure.version}
+
+
+ org.seleniumhq.selenium
+ selenium-java
+ ${selenium.version}
+
+
+ ru.yandex.qatools.htmlelements
+ htmlelements-java
+ ${htmlelements.version}
+
+
+ org.apache.commons
+ commons-lang3
+ 3.4
+
+
+ org.hamcrest
+ hamcrest-all
+ 1.3
+
+
+ ru.yandex.qatools.htmlelements
+ htmlelements-matchers
+ 1.12
+
+
+ com.jayway.restassured
+ rest-assured
+ 2.9.0
+
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.0
+
+ ${compiler.version}
+ ${compiler.version}
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ 2.18.1
+
+
+ -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar"
+
+
+
+ listener
+ ru.yandex.qatools.allure.junit.AllureRunListener
+
+
+
+
+
+ org.aspectj
+ aspectjweaver
+ ${aspectj.version}
+
+
+
+
+
+
+
+
+
diff --git a/steps-module/pom.xml b/steps-module/pom.xml
index fa52f60..3de61a5 100644
--- a/steps-module/pom.xml
+++ b/steps-module/pom.xml
@@ -1,18 +1,54 @@
-
+ 4.0.0
+
school-2016
ru.qatools.school
1.0-SNAPSHOT
-
- 4.0.0
- jar
-
+
steps-module
+ jar
+
Logic Module
+
+
+ ru.yandex.qatools.allure
+ allure-junit-adaptor
+
+
+ org.seleniumhq.selenium
+ selenium-java
+
+
+ ru.yandex.qatools.htmlelements
+ htmlelements-java
+
+
+ org.apache.commons
+ commons-lang3
+
+
+ org.hamcrest
+ hamcrest-all
+
+
+ ru.yandex.qatools.htmlelements
+ htmlelements-matchers
+
+
+ com.jayway.restassured
+ rest-assured
+
+
+ com.jcabi
+ jcabi-matchers
+ 1.3
+
+
-
\ No newline at end of file
+
diff --git a/steps-module/src/main/java/ru/qatools/school/RepresentationPatterns.java b/steps-module/src/main/java/ru/qatools/school/RepresentationPatterns.java
new file mode 100644
index 0000000..1d2aa77
--- /dev/null
+++ b/steps-module/src/main/java/ru/qatools/school/RepresentationPatterns.java
@@ -0,0 +1,32 @@
+package ru.qatools.school;
+
+/**
+ * Created by vananos on 4/20/16.
+ */
+public enum RepresentationPatterns {
+
+ DATE_TIME("\\d{1,2} (P|A)M, \\d{1,2} (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \\d{2} \\((?!((\\+|\\-)00:00))(00:00|(\\+|\\-)\\d{2}:\\d{2})\\)"),
+ CELSIUS("\\-?\\d{1,2}\\.\\d °C"),
+ FAHRENHEIT("\\-?\\d{1,3}\\.\\d °F"),
+ KELVIN("\\d{3}\\.\\d °K"),
+ KAIF("\\d{2}\\.\\d °Kaif"),
+ SUNRISE("Sunrise\\s\\d{2}:\\d{2}"),
+ SUNSET("Sunset\\s\\d{2}:\\d{2}"),
+ WIND("Wind\\s\\d{1,3}(\\.\\d{2})? m\\/s"),
+ HUMIDITY("Humidity\\s\\d{1,2} %");
+
+
+ private final String pattern;
+
+ RepresentationPatterns(String pattern) {
+ this.pattern = pattern;
+ }
+
+ public String getPattern() {
+ return pattern;
+ }
+
+ public String toString() {
+ return pattern.toString();
+ }
+}
diff --git a/steps-module/src/main/java/ru/qatools/school/data/Place.java b/steps-module/src/main/java/ru/qatools/school/data/Place.java
deleted file mode 100644
index 719cc4c..0000000
--- a/steps-module/src/main/java/ru/qatools/school/data/Place.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package ru.qatools.school.data;
-
-/**
- * @author lanwen (Merkushev Kirill)
- */
-public enum Place {
- HOME,
- AT_YANDEX
-}
diff --git a/steps-module/src/main/java/ru/qatools/school/pages/MainPage.java b/steps-module/src/main/java/ru/qatools/school/pages/MainPage.java
new file mode 100644
index 0000000..71ea860
--- /dev/null
+++ b/steps-module/src/main/java/ru/qatools/school/pages/MainPage.java
@@ -0,0 +1,39 @@
+package ru.qatools.school.pages;
+
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.support.FindBy;
+import org.openqa.selenium.support.PageFactory;
+import ru.qatools.school.pages.blocks.NewWidgetButton;
+import ru.qatools.school.pages.blocks.WeatherWidget;
+import ru.yandex.qatools.htmlelements.annotations.Name;
+import ru.yandex.qatools.htmlelements.loader.decorator.HtmlElementDecorator;
+import ru.yandex.qatools.htmlelements.loader.decorator.HtmlElementLocatorFactory;
+
+import java.util.List;
+
+/**
+ * Created by kurau.
+ */
+public class MainPage {
+
+ @Name("Список виджетов")
+ @FindBy(css = ".card.card_md")
+ private List weatherWidget;
+ @Name("Кнопка 'Новый виджет' ")
+ @FindBy(css = ".new-card")
+ private NewWidgetButton newWidgetBut;
+
+ public MainPage(WebDriver driver) {
+ PageFactory.initElements(new HtmlElementDecorator(new HtmlElementLocatorFactory(driver)), this);
+ }
+
+ public List getWeatherWidgetList() {
+ return weatherWidget;
+ }
+
+
+ public NewWidgetButton getNewWidgetButton() {
+ return newWidgetBut;
+ }
+
+}
diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/NewWidgetButton.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/NewWidgetButton.java
new file mode 100644
index 0000000..8006303
--- /dev/null
+++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/NewWidgetButton.java
@@ -0,0 +1,14 @@
+package ru.qatools.school.pages.blocks;
+
+import org.openqa.selenium.Rectangle;
+import ru.yandex.qatools.htmlelements.element.HtmlElement;
+
+/**
+ * Created by vananos on 4/14/16.
+ */
+public class NewWidgetButton extends HtmlElement {
+
+ public Rectangle getRect() {
+ return null;
+ }
+}
diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/WeatherWidget.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/WeatherWidget.java
new file mode 100644
index 0000000..a90ba0b
--- /dev/null
+++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/WeatherWidget.java
@@ -0,0 +1,50 @@
+package ru.qatools.school.pages.blocks;
+
+import org.openqa.selenium.Rectangle;
+import org.openqa.selenium.support.FindBy;
+import ru.qatools.school.pages.blocks.widgetblocks.ActionBlock;
+import ru.qatools.school.pages.blocks.widgetblocks.TemperatureBlock;
+import ru.qatools.school.pages.blocks.widgetblocks.WidgetText;
+import ru.qatools.school.pages.blocks.widgetblocks.WidgetTitle;
+import ru.yandex.qatools.htmlelements.annotations.Name;
+import ru.yandex.qatools.htmlelements.element.HtmlElement;
+
+/**
+ * Created by kurau.
+ */
+public class WeatherWidget extends HtmlElement {
+
+ @Name("Заголовок виджета")
+ @FindBy(css = ".card-title")
+ private WidgetTitle widgetTitle;
+
+ @Name("Текст виджета")
+ @FindBy(css = ".card-text")
+ private WidgetText widgetText;
+
+ @Name("Панель управления виджетом")
+ @FindBy(css = ".card-actions")
+ private ActionBlock actions;
+
+
+
+
+
+ public WidgetText getWidgetText() {
+ return widgetText;
+ }
+
+ public WidgetTitle getWidgetTitle() {
+ return widgetTitle;
+ }
+
+ public ActionBlock getActionBlock() {
+ return actions;
+ }
+
+
+
+ public Rectangle getRect() {
+ return null;
+ }
+}
diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/ActionBlock.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/ActionBlock.java
new file mode 100644
index 0000000..c762c56
--- /dev/null
+++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/ActionBlock.java
@@ -0,0 +1,25 @@
+package ru.qatools.school.pages.blocks.widgetblocks;
+
+import org.openqa.selenium.Rectangle;
+import org.openqa.selenium.support.FindBy;
+import ru.yandex.qatools.htmlelements.annotations.Name;
+import ru.yandex.qatools.htmlelements.element.HtmlElement;
+
+/**
+ * Created by vananos on 4/24/16.
+ */
+public class ActionBlock extends HtmlElement {
+
+ @Name("Кнопка удаления виджета")
+ @FindBy(css = ".remove-card.btn.btn-default")
+ private HtmlElement removeButton;
+
+ public HtmlElement getRemoveButton() {
+ return removeButton;
+ }
+
+ @Override
+ public Rectangle getRect() {
+ return null;
+ }
+}
diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/InfoLine.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/InfoLine.java
new file mode 100644
index 0000000..a3e3fcd
--- /dev/null
+++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/InfoLine.java
@@ -0,0 +1,45 @@
+package ru.qatools.school.pages.blocks.widgetblocks;
+
+import org.openqa.selenium.Rectangle;
+import org.openqa.selenium.support.FindBy;
+import ru.yandex.qatools.htmlelements.annotations.Name;
+import ru.yandex.qatools.htmlelements.element.HtmlElement;
+
+/**
+ * Created by vananos on 4/24/16.
+ */
+public class InfoLine extends HtmlElement {
+
+ @Name("Заголовок")
+ @FindBy(css = ".info-line__title")
+ HtmlElement title;
+
+ @Name("Значение")
+ @FindBy(css = ".info-line__value")
+ HtmlElement value;
+
+ @Name("Картинка")
+ @FindBy(css = ".info-line__image")
+ HtmlElement image;
+
+ public HtmlElement getValue() {
+ return value;
+ }
+
+ public HtmlElement getImage() {
+ return image;
+ }
+
+ public HtmlElement getTitle() {
+ return title;
+ }
+
+ public String getTextRepresentation() {
+ return title.getText() + " " + value.getText();
+ }
+
+ @Override
+ public Rectangle getRect() {
+ return null;
+ }
+}
diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/TemperatureBlock.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/TemperatureBlock.java
new file mode 100644
index 0000000..6f894e3
--- /dev/null
+++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/TemperatureBlock.java
@@ -0,0 +1,36 @@
+package ru.qatools.school.pages.blocks.widgetblocks;
+
+import org.openqa.selenium.Rectangle;
+import org.openqa.selenium.support.FindBy;
+import ru.yandex.qatools.htmlelements.annotations.Name;
+import ru.yandex.qatools.htmlelements.element.HtmlElement;
+
+
+
+public class TemperatureBlock extends HtmlElement {
+
+ @Name("Значение температуры")
+ @FindBy(css = ".weather-temperature__digit")
+ private HtmlElement tempVal;
+
+ @Name("Мера измерения температуры")
+ @FindBy(css = ".weather-temperature__unit")
+ private HtmlElement tempFormat;
+
+
+ public HtmlElement getTemperatureValueBlock() {
+ return tempVal;
+ }
+
+ public HtmlElement getTemperatureFormatBlock() {
+ return tempFormat;
+ }
+
+ public String getRepresentation() {
+ return tempVal.getText() + " " + tempFormat.getText();
+ }
+
+ public Rectangle getRect() {
+ return null;
+ }
+}
diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetText.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetText.java
new file mode 100644
index 0000000..aed9373
--- /dev/null
+++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetText.java
@@ -0,0 +1,43 @@
+package ru.qatools.school.pages.blocks.widgetblocks;
+
+import org.openqa.selenium.Rectangle;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.support.FindBy;
+import ru.yandex.qatools.htmlelements.annotations.Name;
+import ru.yandex.qatools.htmlelements.element.HtmlElement;
+
+import java.util.List;
+
+/**
+ * Created by kurau.
+ */
+public class WidgetText extends HtmlElement {
+
+ @Name("Картинка текущей погоды")
+ @FindBy(css = ".weather-image")
+ private WebElement weatherImage;
+
+ @Name("Поля с дополнительной информацией")
+ @FindBy(css = ".info-line")
+ private List infoLines;
+
+ @Name("Блок температуры")
+ @FindBy(css = ".weather-temperature")
+ private TemperatureBlock tempBlock;
+
+ public WebElement getWeatherImage() {
+ return weatherImage;
+ }
+
+ public List getInfoLines() {
+ return infoLines;
+ }
+
+ public TemperatureBlock getTempBlock() {
+ return tempBlock;
+ }
+
+ public Rectangle getRect() {
+ return null;
+ }
+}
diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetTitle.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetTitle.java
new file mode 100644
index 0000000..3bf4769
--- /dev/null
+++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetTitle.java
@@ -0,0 +1,32 @@
+package ru.qatools.school.pages.blocks.widgetblocks;
+
+import org.openqa.selenium.Rectangle;
+import org.openqa.selenium.support.FindBy;
+import ru.yandex.qatools.htmlelements.annotations.Name;
+import ru.yandex.qatools.htmlelements.element.HtmlElement;
+
+/**
+ * Created by kurau.
+ */
+public class WidgetTitle extends HtmlElement {
+
+ @Name("Город заголовка")
+ @FindBy(css = ".inplace.inplace_displayed")
+ private HtmlElement cityElement;
+
+ @Name("Дата заголовка")
+ @FindBy(css = ".card-title__secondary")
+ private HtmlElement dateTime;
+
+ public HtmlElement getTitleCityElement() {
+ return cityElement;
+ }
+
+ public HtmlElement getDateTime() {
+ return dateTime;
+ }
+
+ public Rectangle getRect() {
+ return null;
+ }
+}
diff --git a/steps-module/src/main/java/ru/qatools/school/rules/WebDriverRule.java b/steps-module/src/main/java/ru/qatools/school/rules/WebDriverRule.java
new file mode 100644
index 0000000..418c363
--- /dev/null
+++ b/steps-module/src/main/java/ru/qatools/school/rules/WebDriverRule.java
@@ -0,0 +1,27 @@
+package ru.qatools.school.rules;
+
+import org.junit.rules.ExternalResource;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.firefox.FirefoxDriver;
+
+/**
+ * Created by kurau.
+ */
+public class WebDriverRule extends ExternalResource {
+
+ private WebDriver driver;
+
+ protected void before() throws Throwable {
+ this.driver = new FirefoxDriver();
+ }
+
+ protected void after() {
+ driver.close();
+ driver.quit();
+ }
+
+ public WebDriver getDriver() {
+ return driver;
+ }
+
+}
diff --git a/steps-module/src/main/java/ru/qatools/school/steps/UserSteps.java b/steps-module/src/main/java/ru/qatools/school/steps/UserSteps.java
deleted file mode 100644
index 043ad54..0000000
--- a/steps-module/src/main/java/ru/qatools/school/steps/UserSteps.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package ru.qatools.school.steps;
-
-import ru.qatools.school.data.Place;
-
-/**
- * @author lanwen (Merkushev Kirill)
- */
-public class UserSteps {
-
- private Place place;
-
- private UserSteps() {
- }
-
- public static UserSteps user() {
- return new UserSteps();
- }
-
- public UserSteps goTo(Place place) {
- this.place = place;
- return this;
- }
-}
diff --git a/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java b/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java
new file mode 100644
index 0000000..97f0ff0
--- /dev/null
+++ b/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java
@@ -0,0 +1,88 @@
+package ru.qatools.school.steps.websteps;
+
+import com.jcabi.matchers.RegexMatchers;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import ru.qatools.school.RepresentationPatterns;
+import ru.qatools.school.pages.MainPage;
+import ru.qatools.school.pages.blocks.widgetblocks.WidgetTitle;
+import ru.yandex.qatools.allure.annotations.Step;
+
+import static java.lang.String.format;
+import static org.hamcrest.core.Is.is;
+import static org.junit.Assert.assertThat;
+import static ru.yandex.qatools.htmlelements.matchers.WebElementMatchers.hasText;
+import static ru.yandex.qatools.htmlelements.matchers.WebElementMatchers.isDisplayed;
+
+
+/**
+ * Created by kurau.
+ */
+public class DefaultSteps {
+
+ public static final String MAIN_PAGE = "http://weather.lanwen.ru/";
+ public static final String MAIN_PAGE_WITH_CITY = "http://weather.lanwen.ru/#?cities=%s";
+
+ private WebDriver driver;
+
+
+ public DefaultSteps(WebDriver driver) {
+ this.driver = driver;
+ }
+
+ @Step("Открываем главную страницу для города «{0}»")
+ public void openMainPageWithCity(String city) {
+ driver.get(format(MAIN_PAGE_WITH_CITY, city));
+ }
+
+ @Step("Открываем главную страницу без города")
+ public void openMainPage() {
+ driver.get(MAIN_PAGE);
+ }
+
+ @Step("Должны видеть на странице «{0}»")
+ public void shouldSee(WebElement element) {
+ assertThat("Должны видеть элемент", element, isDisplayed());
+ }
+
+ @Step("Заголовок должен быть «{1}»")
+ public void cityIntitleShouldBe(WidgetTitle widgetTitle, String title) {
+ assertThat("Город должен быть", widgetTitle.getTitleCityElement(), hasText(title));
+ }
+
+ @Step("Количество виджетов должно быть «{0}»")
+ public void widgetsAmountShouldBe(int n) {
+ assertThat("Количество виджетов должно быть", onMainPage().getWeatherWidgetList().size(), is(n));
+ }
+
+
+ @Step("Жмем на элемент")
+ public void click(WebElement el) {
+ el.click();
+ }
+
+ @Step("Жмем на элемент n раз")
+ public void clickNTimes(WebElement el, int n) {
+ while(n-- > 0) {
+ el.click();
+ }
+ }
+
+
+
+ @Step("Проверяем что представление элемента {0} соответствует паттерну {1}")
+ public void shouldBeRepresentedAs(String representation, RepresentationPatterns pattern) {
+ assertThat("Представление должно соответствовать регулярному выражение",
+ representation, RegexMatchers.containsPattern(pattern.getPattern()));
+
+ }
+
+
+ private MainPage onMainPage() {
+ return new MainPage(driver);
+ }
+}
+
+
+
+
diff --git a/steps-module/src/main/java/ru/qatools/school/tp/TPInformerRule.java b/steps-module/src/main/java/ru/qatools/school/tp/TPInformerRule.java
new file mode 100644
index 0000000..b52d777
--- /dev/null
+++ b/steps-module/src/main/java/ru/qatools/school/tp/TPInformerRule.java
@@ -0,0 +1,64 @@
+package ru.qatools.school.tp;
+
+import org.junit.AssumptionViolatedException;
+import org.junit.rules.TestWatcher;
+import org.junit.runner.Description;
+import ru.qatools.school.tp.client.TPClient;
+import ru.yandex.qatools.allure.annotations.TestCaseId;
+
+import static com.google.common.collect.Lists.newArrayList;
+import static java.lang.System.currentTimeMillis;
+
+/**
+ * @author lanwen (Merkushev Kirill)
+ */
+public class TPInformerRule extends TestWatcher {
+
+ private String project;
+ private long start;
+
+ public TPInformerRule(String project) {
+ this.project = project;
+ }
+
+ @Override
+ protected void starting(Description description) {
+ start = currentTimeMillis();
+ updateWithStatus("STARTED", description);
+ }
+
+ @Override
+ protected void skipped(AssumptionViolatedException e, Description description) {
+ updateWithStatus("SKIPPED", description);
+ }
+
+ @Override
+ protected void failed(Throwable e, Description description) {
+ if (e instanceof AssertionError) {
+ updateWithStatus("FAILED", description);
+ } else {
+ updateWithStatus("BROKEN", description);
+ }
+ }
+
+ @Override
+ protected void succeeded(Description description) {
+ updateWithStatus("PASSED", description);
+ }
+
+ private void updateWithStatus(String status, Description description) {
+ if (description.getAnnotation(TestCaseId.class) != null) {
+ TPClient.callUpdate(project,
+ newArrayList(
+ new TPClient.TCaseStatus(new TPClient.TCase(idFrom(description)),
+ status,
+ currentTimeMillis() - start
+ )));
+ }
+ }
+
+ private String idFrom(Description description) {
+ return description.getAnnotation(TestCaseId.class).value();
+ }
+
+}
diff --git a/steps-module/src/main/java/ru/qatools/school/tp/client/TPClient.java b/steps-module/src/main/java/ru/qatools/school/tp/client/TPClient.java
new file mode 100644
index 0000000..b29a8ed
--- /dev/null
+++ b/steps-module/src/main/java/ru/qatools/school/tp/client/TPClient.java
@@ -0,0 +1,49 @@
+package ru.qatools.school.tp.client;
+
+import com.jayway.restassured.RestAssured;
+import com.jayway.restassured.http.ContentType;
+
+import java.util.List;
+
+/**
+ * @author lanwen (Merkushev Kirill)
+ */
+public class TPClient {
+
+ private static final String ENDPOINT = System.getProperty("tp.api.endpoint", "https://localhost/");
+ private static final String TOKEN = System.getProperty("tp.api.token", "");
+ private static final String RUN = System.getProperty("tp.api.run", "");
+
+ public static void callUpdate(String project, List statuses) {
+ RestAssured.given()
+ .relaxedHTTPSValidation()
+ .log().all()
+ .baseUri(ENDPOINT)
+ .basePath("/api/")
+ .header("TestPalm-Api-Token", TOKEN)
+ .contentType(ContentType.JSON)
+ .body(statuses)
+ .when().log().all().post("/testrun/{project}/{run}/bulk", project, RUN).peek();
+ }
+
+ public static class TCaseStatus {
+ private TCase testCase;
+ private String status;
+ private Long duration;
+
+ public TCaseStatus(TCase testCase, String status, Long duration) {
+ this.testCase = testCase;
+ this.status = status;
+ this.duration = duration;
+ }
+ }
+
+ public static class TCase {
+ private String id;
+
+ public TCase(String id) {
+ this.id = id;
+ }
+ }
+
+}
diff --git a/steps-module/src/test/java/ru/qatools/school/MyFirstTest.java b/steps-module/src/test/java/ru/qatools/school/MyFirstTest.java
deleted file mode 100644
index 5378485..0000000
--- a/steps-module/src/test/java/ru/qatools/school/MyFirstTest.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package ru.qatools.school;
-
-import static ru.qatools.school.steps.UserSteps.user;
-
-/**
- * @author lanwen (Merkushev Kirill)
- */
-public class MyFirstTest {
-
- public void test() {
- user().goTo(null);
- }
-
-}