From 1bb709fb509e8aa145c4cde8a640dd8a1f621eb3 Mon Sep 17 00:00:00 2001 From: vananos Date: Thu, 7 Apr 2016 23:18:43 +0300 Subject: [PATCH 01/15] my first auto test --- commons-module/pom.xml | 25 +++++++++++++++++++ .../java/ru/qatools/school/MyFirstTest.java | 8 +++++- pom.xml | 13 +++++++--- .../ru/qatools/school/steps/UserSteps.java | 7 ++++++ 4 files changed, 48 insertions(+), 5 deletions(-) create mode 100644 commons-module/pom.xml rename {steps-module => commons-module}/src/test/java/ru/qatools/school/MyFirstTest.java (51%) diff --git a/commons-module/pom.xml b/commons-module/pom.xml new file mode 100644 index 0000000..0d192af --- /dev/null +++ b/commons-module/pom.xml @@ -0,0 +1,25 @@ + + + + school-2016 + ru.qatools.school + 1.0-SNAPSHOT + + + 4.0.0 + jar + + commons-module + Test Module + + + ru.qatools.school + steps-module + ${project.version} + + + + + diff --git a/steps-module/src/test/java/ru/qatools/school/MyFirstTest.java b/commons-module/src/test/java/ru/qatools/school/MyFirstTest.java similarity index 51% rename from steps-module/src/test/java/ru/qatools/school/MyFirstTest.java rename to commons-module/src/test/java/ru/qatools/school/MyFirstTest.java index 5378485..a49c317 100644 --- a/steps-module/src/test/java/ru/qatools/school/MyFirstTest.java +++ b/commons-module/src/test/java/ru/qatools/school/MyFirstTest.java @@ -1,14 +1,20 @@ package ru.qatools.school; import static ru.qatools.school.steps.UserSteps.user; +import ru.qatools.school.data.Place; +import org.junit.Test; /** * @author lanwen (Merkushev Kirill) */ public class MyFirstTest { + @Test public void test() { - user().goTo(null); + user().goTo(Place.AT_YANDEX). + shouldBeAt(Place.AT_YANDEX). + goTo(Place.HOME). + shouldBeAt(Place.HOME); } } diff --git a/pom.xml b/pom.xml index 206b663..3f9c1ad 100644 --- a/pom.xml +++ b/pom.xml @@ -11,13 +11,18 @@ steps-module + commons-module Automation Foreva First automation project ever - - - + + + junit + junit + 4.12 + + - \ No newline at end of file + 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 index 043ad54..236d17e 100644 --- a/steps-module/src/main/java/ru/qatools/school/steps/UserSteps.java +++ b/steps-module/src/main/java/ru/qatools/school/steps/UserSteps.java @@ -1,6 +1,8 @@ package ru.qatools.school.steps; import ru.qatools.school.data.Place; +import static org.junit.Assert.assertThat; +import static org.hamcrest.core.Is.is; /** * @author lanwen (Merkushev Kirill) @@ -20,4 +22,9 @@ public UserSteps goTo(Place place) { this.place = place; return this; } + + public UserSteps shouldBeAt(Place place){ + assertThat(this.place,is(place)); + return this; + } } From 8960c8446157afea51fae2321d0038f05eba8d69 Mon Sep 17 00:00:00 2001 From: vananos Date: Fri, 15 Apr 2016 01:07:03 +0300 Subject: [PATCH 02/15] my first web test --- commons-module/pom.xml | 55 ++++++--- .../school/webtests/AddWidgetButtonTest.java | 51 ++++++++ .../ru/qatools/school/webtests/TitleTest.java | 52 ++++++++ .../school/webtests/WeatherWebTest.java | 37 ++++++ pom.xml | 116 +++++++++++++++--- steps-module/pom.xml | 41 +++++-- 6 files changed, 315 insertions(+), 37 deletions(-) create mode 100644 commons-module/src/test/java/ru/qatools/school/webtests/AddWidgetButtonTest.java create mode 100644 commons-module/src/test/java/ru/qatools/school/webtests/TitleTest.java create mode 100644 commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java diff --git a/commons-module/pom.xml b/commons-module/pom.xml index 0d192af..a123fc2 100644 --- a/commons-module/pom.xml +++ b/commons-module/pom.xml @@ -1,25 +1,52 @@ - + 4.0.0 + school-2016 ru.qatools.school 1.0-SNAPSHOT - - 4.0.0 - jar - + commons-module - Test Module - - - ru.qatools.school - steps-module - ${project.version} - - + 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/AddWidgetButtonTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/AddWidgetButtonTest.java new file mode 100644 index 0000000..5f20535 --- /dev/null +++ b/commons-module/src/test/java/ru/qatools/school/webtests/AddWidgetButtonTest.java @@ -0,0 +1,51 @@ +package ru.qatools.school.webtests; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import ru.qatools.school.pages.MainPage; +import ru.qatools.school.rules.WebDriverRule; +import ru.qatools.school.steps.websteps.DefaultSteps; +import ru.yandex.qatools.allure.annotations.Title; +import com.tngtech.java.junit.dataprovider.DataProvider; +import com.tngtech.java.junit.dataprovider.DataProviderRunner; +import com.tngtech.java.junit.dataprovider.UseDataProvider; + +@RunWith(DataProviderRunner.class) +public class AddWidgetButtonTest { + + @DataProvider + public static Object[][] dataProviderNumber() { + return new Object[][]{ + {1},{2},{3},{4},{5},{6},{7},{8},{9},{10} + }; + } + + public static final String CITY = "Moscow"; + + private DefaultSteps defaultSteps; + + @Rule + public WebDriverRule webDriverRule = new WebDriverRule(); + + @Before + public void initSteps() { + defaultSteps = new DefaultSteps(webDriverRule.getDriver()); + } + + @Test + @Title("Жмем на кнопку n раз, должно быть n+1 виджетов") + @UseDataProvider("dataProviderNumber") + public void shouldSeeNPlusOneWidgetsAfterNClickByAddButton(int n) { + defaultSteps.openMainPageWithCity(CITY); + defaultSteps.clickAddWidgetButtonNTimes(n); + defaultSteps.widgetsAmountShouldBe(n+1); + } + + + private MainPage onMainPage() { + return new MainPage(webDriverRule.getDriver()); + } + +} diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/TitleTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/TitleTest.java new file mode 100644 index 0000000..4fe0403 --- /dev/null +++ b/commons-module/src/test/java/ru/qatools/school/webtests/TitleTest.java @@ -0,0 +1,52 @@ +package ru.qatools.school.webtests; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import ru.qatools.school.pages.MainPage; +import ru.qatools.school.rules.WebDriverRule; +import ru.qatools.school.steps.websteps.DefaultSteps; +import ru.yandex.qatools.allure.annotations.Title; +import com.tngtech.java.junit.dataprovider.DataProvider; +import com.tngtech.java.junit.dataprovider.DataProviderRunner; +import com.tngtech.java.junit.dataprovider.UseDataProvider; + + +@RunWith(DataProviderRunner.class) + +public class TitleTest { + + @DataProvider + public static Object[][] dataProviderCity() { + return new Object[][] { + { "Moscow"}, + { "Kiev"}, + { "Berlin"}, + { "New York"} + }; + } + + private DefaultSteps defaultSteps; + + @Rule + public WebDriverRule webDriverRule = new WebDriverRule(); + + @Before + public void initSteps() { + defaultSteps = new DefaultSteps(webDriverRule.getDriver()); + } + + @Test + @Title("В названии погоды должен быть город «{0}»") + @UseDataProvider("dataProviderCity") + public void titleShouldBeCity(String city) { + defaultSteps.openMainPageWithCity(city); + defaultSteps.titleShouldBe(onMainPage().getWeatherWidget().get(0).getWidgetTitle(), city); + } + + private MainPage onMainPage() { + return new MainPage(webDriverRule.getDriver()); + } + +} diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java new file mode 100644 index 0000000..9b9fcb4 --- /dev/null +++ b/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java @@ -0,0 +1,37 @@ +package ru.qatools.school.webtests; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import ru.qatools.school.pages.MainPage; +import ru.qatools.school.rules.WebDriverRule; +import ru.qatools.school.steps.websteps.DefaultSteps; +import ru.yandex.qatools.allure.annotations.Title; + + +public class WeatherWebTest { + + public static final String CITY = "Moscow"; + + private DefaultSteps defaultSteps; + + @Rule + public WebDriverRule webDriverRule = new WebDriverRule(); + + @Before + public void initSteps() { + defaultSteps = new DefaultSteps(webDriverRule.getDriver()); + } + + @Test + @Title("Должны видеть виджет на главной странице") + public void shouldSeeWidgetOnMainPage() { + defaultSteps.openMainPageWithCity(CITY); + defaultSteps.shouldSee(onMainPage().getWeatherWidget().get(0)); + } + + private MainPage onMainPage() { + return new MainPage(webDriverRule.getDriver()); + } + +} diff --git a/pom.xml b/pom.xml index 3f9c1ad..208222f 100644 --- a/pom.xml +++ b/pom.xml @@ -1,28 +1,112 @@ - 4.0.0 ru.qatools.school school-2016 - pom 1.0-SNAPSHOT - + pom + + Automation Foreva + First automation project ever + steps-module - commons-module + commons-module - Automation Foreva - First automation project ever - - - - junit - junit - 4.12 - - - + + 1.8 + + 1.4.23 + 2.53.0 + 1.15 + 1.8.5 + + + + + junit + junit + 4.12 + + + + + + + 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 + + + + + + + + + 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..37efd44 100644 --- a/steps-module/pom.xml +++ b/steps-module/pom.xml @@ -1,18 +1,45 @@ - + 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 + + - \ No newline at end of file + From b1972475b0474e46c3a67fcc26dc66e0d0088893 Mon Sep 17 00:00:00 2001 From: vananos Date: Fri, 15 Apr 2016 01:12:13 +0300 Subject: [PATCH 03/15] Place class was deleted --- .../src/main/java/ru/qatools/school/data/Place.java | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 steps-module/src/main/java/ru/qatools/school/data/Place.java 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 -} From 9cc02aa4cbe5eff302fc299ee7df6e81b848cdf8 Mon Sep 17 00:00:00 2001 From: vananos Date: Fri, 15 Apr 2016 01:14:18 +0300 Subject: [PATCH 04/15] MyFirstTest class was deleted --- .../java/ru/qatools/school/MyFirstTest.java | 20 ------------------- 1 file changed, 20 deletions(-) delete mode 100644 commons-module/src/test/java/ru/qatools/school/MyFirstTest.java diff --git a/commons-module/src/test/java/ru/qatools/school/MyFirstTest.java b/commons-module/src/test/java/ru/qatools/school/MyFirstTest.java deleted file mode 100644 index a49c317..0000000 --- a/commons-module/src/test/java/ru/qatools/school/MyFirstTest.java +++ /dev/null @@ -1,20 +0,0 @@ -package ru.qatools.school; - -import static ru.qatools.school.steps.UserSteps.user; -import ru.qatools.school.data.Place; -import org.junit.Test; - -/** - * @author lanwen (Merkushev Kirill) - */ -public class MyFirstTest { - - @Test - public void test() { - user().goTo(Place.AT_YANDEX). - shouldBeAt(Place.AT_YANDEX). - goTo(Place.HOME). - shouldBeAt(Place.HOME); - } - -} From d89beb2f26a52de1db4908fd0c492e9739bb0d75 Mon Sep 17 00:00:00 2001 From: vananos Date: Fri, 15 Apr 2016 01:24:45 +0300 Subject: [PATCH 05/15] little change --- .../ru/qatools/school/steps/UserSteps.java | 30 ------------------- 1 file changed, 30 deletions(-) delete mode 100644 steps-module/src/main/java/ru/qatools/school/steps/UserSteps.java 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 236d17e..0000000 --- a/steps-module/src/main/java/ru/qatools/school/steps/UserSteps.java +++ /dev/null @@ -1,30 +0,0 @@ -package ru.qatools.school.steps; - -import ru.qatools.school.data.Place; -import static org.junit.Assert.assertThat; -import static org.hamcrest.core.Is.is; - -/** - * @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; - } - - public UserSteps shouldBeAt(Place place){ - assertThat(this.place,is(place)); - return this; - } -} From bc05e92be05e8a351673c6b9fd22f2a671b8b0af Mon Sep 17 00:00:00 2001 From: vananos Date: Fri, 15 Apr 2016 01:26:56 +0300 Subject: [PATCH 06/15] add DefaultSteps class --- .../school/steps/websteps/DefaultSteps.java | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java 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..29c2718 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java @@ -0,0 +1,57 @@ +package ru.qatools.school.steps.websteps; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +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.junit.Assert.assertThat; +import static ru.yandex.qatools.htmlelements.matchers.WebElementMatchers.isDisplayed; +import static org.hamcrest.core.Is.is; + + +/** + * Created by kurau. + */ +public class DefaultSteps { + + public static final String MAIN_PAGE = "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, city)); + } + + @Step("Должны видеть на странице «{0}»") + public void shouldSee(WebElement element) { + assertThat("Должны видеть элемент", element, isDisplayed()); + } + + @Step("Заголовок должен быть «{1}»") + public void titleShouldBe(WidgetTitle widgetTitle, String title) { + assertThat(widgetTitle.getCity(), is(title)); + } + + @Step("Количество виджетов должно быть «{0}»") + public void widgetsAmountShouldBe(int n) { + assertThat(onMainPage().getWeatherWidget().size(), is(n)); + } + + @Step("Жмем кнопку добавить виджет n раз") + public void clickAddWidgetButtonNTimes(int n) { + while(n-- > 0) + onMainPage().getNewWidgetButton().click(); + } + + private MainPage onMainPage() { + return new MainPage(driver); + } +} From 33a8217756634bf405d4395c987e930fcdbfabdd Mon Sep 17 00:00:00 2001 From: vananos Date: Fri, 15 Apr 2016 01:28:10 +0300 Subject: [PATCH 07/15] add all classes --- .../ru/qatools/school/pages/MainPage.java | 37 ++++++++++++++++ .../school/pages/blocks/NewWidgetButton.java | 14 ++++++ .../school/pages/blocks/WeatherWidget.java | 43 +++++++++++++++++++ .../pages/blocks/widgetblocks/WidgetText.java | 25 +++++++++++ .../blocks/widgetblocks/WidgetTitle.java | 19 ++++++++ .../qatools/school/rules/WebDriverRule.java | 27 ++++++++++++ 6 files changed, 165 insertions(+) create mode 100644 steps-module/src/main/java/ru/qatools/school/pages/MainPage.java create mode 100644 steps-module/src/main/java/ru/qatools/school/pages/blocks/NewWidgetButton.java create mode 100644 steps-module/src/main/java/ru/qatools/school/pages/blocks/WeatherWidget.java create mode 100644 steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetText.java create mode 100644 steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetTitle.java create mode 100644 steps-module/src/main/java/ru/qatools/school/rules/WebDriverRule.java 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..076e2ad --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/pages/MainPage.java @@ -0,0 +1,37 @@ +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.WeatherWidget; +import ru.qatools.school.pages.blocks.NewWidgetButton; +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 { + + public MainPage(WebDriver driver) { + PageFactory.initElements(new HtmlElementDecorator(new HtmlElementLocatorFactory(driver)), this); + } + + @Name("Список виджетов") + @FindBy(css = ".card.card_md") + private List weatherWidget; + + @Name("Кнопка Новый виджет") + @FindBy(css = ".new-card") + private NewWidgetButton newWidgetBut; + + public List getWeatherWidget() { + 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..3990d85 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/WeatherWidget.java @@ -0,0 +1,43 @@ +package ru.qatools.school.pages.blocks; + +import org.openqa.selenium.Rectangle; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; +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 WebElement actions; + + public WidgetText getWidgetText() { + return widgetText; + } + + public WidgetTitle getWidgetTitle() { + return widgetTitle; + } + + public WebElement getActions() { + return actions; + } + + 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..510d070 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetText.java @@ -0,0 +1,25 @@ +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; + +/** + * Created by kurau. + */ +public class WidgetText extends HtmlElement { + + @Name("Картинка текущей погоды") + @FindBy(css = ".weather-image") + private WebElement weatherImage; + + public WebElement getWeatherImage() { + return weatherImage; + } + + 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..3084b7e --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetTitle.java @@ -0,0 +1,19 @@ +package ru.qatools.school.pages.blocks.widgetblocks; + +import org.openqa.selenium.By; +import org.openqa.selenium.Rectangle; +import ru.yandex.qatools.htmlelements.element.HtmlElement; + +/** + * Created by kurau. + */ +public class WidgetTitle extends HtmlElement { + + public String getCity(){ + return findElement(By.cssSelector(".inplace.inplace_displayed")).getText(); + } + + 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; + } + +} From 046ced1b07f09d2b5ca6b1c808a126fbc2e4cce5 Mon Sep 17 00:00:00 2001 From: vananos Date: Sat, 16 Apr 2016 22:26:31 +0300 Subject: [PATCH 08/15] minor fixes --- .../ru/qatools/school/webtests/AddWidgetButtonTest.java | 2 +- .../test/java/ru/qatools/school/webtests/TitleTest.java | 2 +- .../school/pages/blocks/widgetblocks/WidgetTitle.java | 9 +++++++-- .../ru/qatools/school/steps/websteps/DefaultSteps.java | 8 ++++---- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/AddWidgetButtonTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/AddWidgetButtonTest.java index 5f20535..75e96ec 100644 --- a/commons-module/src/test/java/ru/qatools/school/webtests/AddWidgetButtonTest.java +++ b/commons-module/src/test/java/ru/qatools/school/webtests/AddWidgetButtonTest.java @@ -18,7 +18,7 @@ public class AddWidgetButtonTest { @DataProvider public static Object[][] dataProviderNumber() { return new Object[][]{ - {1},{2},{3},{4},{5},{6},{7},{8},{9},{10} + {1},{10} }; } diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/TitleTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/TitleTest.java index 4fe0403..3c31027 100644 --- a/commons-module/src/test/java/ru/qatools/school/webtests/TitleTest.java +++ b/commons-module/src/test/java/ru/qatools/school/webtests/TitleTest.java @@ -42,7 +42,7 @@ public void initSteps() { @UseDataProvider("dataProviderCity") public void titleShouldBeCity(String city) { defaultSteps.openMainPageWithCity(city); - defaultSteps.titleShouldBe(onMainPage().getWeatherWidget().get(0).getWidgetTitle(), city); + defaultSteps.cityIntitleShouldBe(onMainPage().getWeatherWidget().get(0).getWidgetTitle(), city); } private MainPage onMainPage() { 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 index 3084b7e..79791a2 100644 --- 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 @@ -1,16 +1,21 @@ package ru.qatools.school.pages.blocks.widgetblocks; -import org.openqa.selenium.By; import org.openqa.selenium.Rectangle; +import ru.yandex.qatools.htmlelements.annotations.Name; import ru.yandex.qatools.htmlelements.element.HtmlElement; +import org.openqa.selenium.support.FindBy; /** * Created by kurau. */ public class WidgetTitle extends HtmlElement { + @Name("Город заголовка") + @FindBy(css = ".inplace.inplace_displayed") + private HtmlElement city; + public String getCity(){ - return findElement(By.cssSelector(".inplace.inplace_displayed")).getText(); + return city.getText(); } public Rectangle getRect() { 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 index 29c2718..c0581fd 100644 --- 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 @@ -36,16 +36,16 @@ public void shouldSee(WebElement element) { } @Step("Заголовок должен быть «{1}»") - public void titleShouldBe(WidgetTitle widgetTitle, String title) { - assertThat(widgetTitle.getCity(), is(title)); + public void cityIntitleShouldBe(WidgetTitle widgetTitle, String title) { + assertThat("Город должен быть",widgetTitle.getCity(), is(title)); } @Step("Количество виджетов должно быть «{0}»") public void widgetsAmountShouldBe(int n) { - assertThat(onMainPage().getWeatherWidget().size(), is(n)); + assertThat("Количество виджетов должно быть",onMainPage().getWeatherWidget().size(), is(n)); } - @Step("Жмем кнопку добавить виджет n раз") + @Step("Жмем кнопку добавить виджет «{0}» раз") public void clickAddWidgetButtonNTimes(int n) { while(n-- > 0) onMainPage().getNewWidgetButton().click(); From e652e8ea95a4a96768848606a486fc4d88c0c1a9 Mon Sep 17 00:00:00 2001 From: vananos Date: Sun, 24 Apr 2016 16:30:04 +0300 Subject: [PATCH 09/15] tests for testpalm --- .../school/webtests/AddWidgetButtonTest.java | 9 ++- .../school/webtests/RemoveButtonTest.java | 58 +++++++++++++++ .../school/webtests/TemperatureBlockTest.java | 52 ++++++++++++++ .../ru/qatools/school/webtests/TitleTest.java | 5 ++ .../school/webtests/WeatherWebTest.java | 6 ++ pom.xml | 5 ++ steps-module/pom.xml | 4 ++ .../school/pages/blocks/TemperatureBlock.java | 35 +++++++++ .../school/pages/blocks/WeatherWidget.java | 16 +++++ .../blocks/widgetblocks/WidgetTitle.java | 7 +- .../school/steps/websteps/DefaultSteps.java | 72 +++++++++++++++++-- .../ru/qatools/school/tp/TPInformerRule.java | 64 +++++++++++++++++ .../ru/qatools/school/tp/client/TPClient.java | 51 +++++++++++++ 13 files changed, 376 insertions(+), 8 deletions(-) create mode 100644 commons-module/src/test/java/ru/qatools/school/webtests/RemoveButtonTest.java create mode 100644 commons-module/src/test/java/ru/qatools/school/webtests/TemperatureBlockTest.java create mode 100644 steps-module/src/main/java/ru/qatools/school/pages/blocks/TemperatureBlock.java create mode 100644 steps-module/src/main/java/ru/qatools/school/tp/TPInformerRule.java create mode 100644 steps-module/src/main/java/ru/qatools/school/tp/client/TPClient.java diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/AddWidgetButtonTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/AddWidgetButtonTest.java index 75e96ec..1e68e19 100644 --- a/commons-module/src/test/java/ru/qatools/school/webtests/AddWidgetButtonTest.java +++ b/commons-module/src/test/java/ru/qatools/school/webtests/AddWidgetButtonTest.java @@ -7,10 +7,13 @@ 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; import ru.yandex.qatools.allure.annotations.Title; import com.tngtech.java.junit.dataprovider.DataProvider; import com.tngtech.java.junit.dataprovider.DataProviderRunner; import com.tngtech.java.junit.dataprovider.UseDataProvider; +import ru.yandex.qatools.allure.annotations.TestCaseId; + @RunWith(DataProviderRunner.class) public class AddWidgetButtonTest { @@ -18,7 +21,7 @@ public class AddWidgetButtonTest { @DataProvider public static Object[][] dataProviderNumber() { return new Object[][]{ - {1},{10} + {1},{2} }; } @@ -26,6 +29,9 @@ public static Object[][] dataProviderNumber() { private DefaultSteps defaultSteps; + @Rule + public TPInformerRule tms = new TPInformerRule("vananos"); + @Rule public WebDriverRule webDriverRule = new WebDriverRule(); @@ -34,6 +40,7 @@ public void initSteps() { defaultSteps = new DefaultSteps(webDriverRule.getDriver()); } + @TestCaseId("1") @Test @Title("Жмем на кнопку n раз, должно быть n+1 виджетов") @UseDataProvider("dataProviderNumber") diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/RemoveButtonTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/RemoveButtonTest.java new file mode 100644 index 0000000..3df12f7 --- /dev/null +++ b/commons-module/src/test/java/ru/qatools/school/webtests/RemoveButtonTest.java @@ -0,0 +1,58 @@ +package ru.qatools.school.webtests; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +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; +import ru.yandex.qatools.allure.annotations.Title; +import com.tngtech.java.junit.dataprovider.DataProvider; +import com.tngtech.java.junit.dataprovider.DataProviderRunner; +import com.tngtech.java.junit.dataprovider.UseDataProvider; +import ru.yandex.qatools.allure.annotations.TestCaseId; + + +@RunWith(DataProviderRunner.class) +public class RemoveButtonTest { + + @DataProvider + public static Object[][] dataProviderNumber() { + return new Object[][]{ + {0},{1} + }; + } + + public static final String CITY = "Moscow"; + + private DefaultSteps defaultSteps; + + @Rule + public TPInformerRule tms = new TPInformerRule("vananos"); + @Rule + public WebDriverRule webDriverRule = new WebDriverRule(); + + @Before + public void initSteps() { + defaultSteps = new DefaultSteps(webDriverRule.getDriver()); + } + + @TestCaseId("3") + @Test + @Title("Жмем на кнопку добавления n раз, Затем удаляем средний виджет") + @UseDataProvider("dataProviderNumber") + public void shouldSeeNWidgetsAfterOneClickByRemoveButton(int n) { + defaultSteps.openMainPageWithCity(CITY); + defaultSteps.clickAddWidgetButtonNTimes(n); + defaultSteps.clickRemoveWidgetButton(n/2); + defaultSteps.widgetsAmountShouldBe(n); + } + + + private MainPage onMainPage() { + return new MainPage(webDriverRule.getDriver()); + } + +} \ No newline at end of file diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/TemperatureBlockTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/TemperatureBlockTest.java new file mode 100644 index 0000000..6fc39d8 --- /dev/null +++ b/commons-module/src/test/java/ru/qatools/school/webtests/TemperatureBlockTest.java @@ -0,0 +1,52 @@ +package ru.qatools.school.webtests; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +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; +import ru.yandex.qatools.allure.annotations.Title; +import com.tngtech.java.junit.dataprovider.UseDataProvider; +import ru.yandex.qatools.allure.annotations.TestCaseId; + + +public class TemperatureBlockTest { + + + public static final String CITY = "Moscow"; + + private DefaultSteps defaultSteps; + + @Rule + public TPInformerRule tms = new TPInformerRule("vananos"); + + @Rule + public WebDriverRule webDriverRule = new WebDriverRule(); + + @Before + public void initSteps() { + defaultSteps = new DefaultSteps(webDriverRule.getDriver()); + } + + @TestCaseId("5") + @Test + @Title("Жмем на блок температуры, проверяем что значение и формат температуры были изменены") + @UseDataProvider("dataProviderNumber") + public void temperatureBlockShouldChanges() { + defaultSteps.openMainPageWithCity(CITY); + defaultSteps.saveTemperatureState(0); + defaultSteps.clickTemperatureBlock(0); + defaultSteps.checkThatTemperatureStateWasChanged(); + defaultSteps.saveTemperatureState(0); + defaultSteps.clickTemperatureBlock(0); + defaultSteps.checkThatTemperatureStateWasChanged(); + } + + + private MainPage onMainPage() { + return new MainPage(webDriverRule.getDriver()); + } + +} \ No newline at end of file diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/TitleTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/TitleTest.java index 3c31027..4080a79 100644 --- a/commons-module/src/test/java/ru/qatools/school/webtests/TitleTest.java +++ b/commons-module/src/test/java/ru/qatools/school/webtests/TitleTest.java @@ -7,6 +7,8 @@ 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; +import ru.yandex.qatools.allure.annotations.TestCaseId; import ru.yandex.qatools.allure.annotations.Title; import com.tngtech.java.junit.dataprovider.DataProvider; import com.tngtech.java.junit.dataprovider.DataProviderRunner; @@ -29,6 +31,8 @@ public static Object[][] dataProviderCity() { private DefaultSteps defaultSteps; + @Rule + public TPInformerRule tms = new TPInformerRule("vananos"); @Rule public WebDriverRule webDriverRule = new WebDriverRule(); @@ -37,6 +41,7 @@ public void initSteps() { defaultSteps = new DefaultSteps(webDriverRule.getDriver()); } + @TestCaseId("2") @Test @Title("В названии погоды должен быть город «{0}»") @UseDataProvider("dataProviderCity") diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java index 9b9fcb4..4542be0 100644 --- a/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java +++ b/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java @@ -6,15 +6,20 @@ 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; +import ru.yandex.qatools.allure.annotations.TestCaseId; import ru.yandex.qatools.allure.annotations.Title; + public class WeatherWebTest { public static final String CITY = "Moscow"; private DefaultSteps defaultSteps; + @Rule + public TPInformerRule tms = new TPInformerRule("vananos"); @Rule public WebDriverRule webDriverRule = new WebDriverRule(); @@ -23,6 +28,7 @@ public void initSteps() { defaultSteps = new DefaultSteps(webDriverRule.getDriver()); } + @TestCaseId("4") @Test @Title("Должны видеть виджет на главной странице") public void shouldSeeWidgetOnMainPage() { diff --git a/pom.xml b/pom.xml index 208222f..09b852e 100644 --- a/pom.xml +++ b/pom.xml @@ -66,6 +66,11 @@ htmlelements-matchers 1.12 + + com.jayway.restassured + rest-assured + 2.9.0 + diff --git a/steps-module/pom.xml b/steps-module/pom.xml index 37efd44..145a227 100644 --- a/steps-module/pom.xml +++ b/steps-module/pom.xml @@ -40,6 +40,10 @@ ru.yandex.qatools.htmlelements htmlelements-matchers + + com.jayway.restassured + rest-assured + diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/TemperatureBlock.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/TemperatureBlock.java new file mode 100644 index 0000000..bfb5751 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/TemperatureBlock.java @@ -0,0 +1,35 @@ +package ru.qatools.school.pages.blocks; + +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 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 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 index 3990d85..8fd6a91 100644 --- 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 @@ -25,6 +25,14 @@ public class WeatherWidget extends HtmlElement { @FindBy(css = ".card-actions") private WebElement actions; + @Name("Кнопка удаления виджета") + @FindBy(css = ".remove-card.btn.btn-default") + private WebElement removeButton; + + @Name("Блок температуры") + @FindBy(css = ".weather-temperature") + private TemperatureBlock tempBlock; + public WidgetText getWidgetText() { return widgetText; } @@ -37,6 +45,14 @@ public WebElement getActions() { return actions; } + public WebElement getRemoveButton(){ + return removeButton; + } + + 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 index 79791a2..06da232 100644 --- 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 @@ -12,12 +12,13 @@ public class WidgetTitle extends HtmlElement { @Name("Город заголовка") @FindBy(css = ".inplace.inplace_displayed") - private HtmlElement city; + private HtmlElement cityElement; - public String getCity(){ - return city.getText(); + public HtmlElement getTitleCityElement() { + return cityElement; } + public Rectangle getRect() { return null; } 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 index c0581fd..55ee806 100644 --- 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 @@ -3,14 +3,15 @@ import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import ru.qatools.school.pages.MainPage; +import ru.qatools.school.pages.blocks.TemperatureBlock; import ru.qatools.school.pages.blocks.widgetblocks.WidgetTitle; import ru.yandex.qatools.allure.annotations.Step; - import static java.lang.String.format; import static org.junit.Assert.assertThat; +import static ru.yandex.qatools.htmlelements.matchers.WebElementMatchers.hasText; import static ru.yandex.qatools.htmlelements.matchers.WebElementMatchers.isDisplayed; import static org.hamcrest.core.Is.is; - +import static org.hamcrest.core.IsNot.not; /** * Created by kurau. @@ -21,6 +22,14 @@ public class DefaultSteps { private WebDriver driver; + private class TempState{ + public String temperature, temperatureFormat; + public int n; + } + + private TempState tempState = new TempState(); + + public DefaultSteps(WebDriver driver) { this.driver = driver; } @@ -37,7 +46,7 @@ public void shouldSee(WebElement element) { @Step("Заголовок должен быть «{1}»") public void cityIntitleShouldBe(WidgetTitle widgetTitle, String title) { - assertThat("Город должен быть",widgetTitle.getCity(), is(title)); + assertThat("Город должен быть",widgetTitle.getTitleCityElement(), hasText(title)); } @Step("Количество виджетов должно быть «{0}»") @@ -47,11 +56,66 @@ public void widgetsAmountShouldBe(int n) { @Step("Жмем кнопку добавить виджет «{0}» раз") public void clickAddWidgetButtonNTimes(int n) { - while(n-- > 0) + while(n-- > 0){ onMainPage().getNewWidgetButton().click(); + } + } + + @Step("Жмем кнопку удалить виджет для виджета № «{0}»") + public void clickRemoveWidgetButton(int n) { + onMainPage().getWeatherWidget().get(n).getRemoveButton().click(); + } + + @Step("Жмем на блок температуры") + public void clickTemperatureBlock(int n) { + onMainPage().getWeatherWidget().get(n).getTempBlock().click(); + } + + @Step("Запоминаем состояние температуры") + public void saveTemperatureState(int n) { + TemperatureBlock tb = onMainPage().getWeatherWidget().get(n).getTempBlock(); + tempState.temperature = tb.getTemperatureValueBlock().getText(); + tempState.temperatureFormat = tb.getTemperatureFormatBlock().getText(); + tempState.n = n; + } + + @Step("Проверяем изменилась ли температура") + public void checkThatTemperatureStateWasChanged() { + TemperatureBlock tb = onMainPage().getWeatherWidget().get(tempState.n).getTempBlock(); + assertThat("Значение температуры должно не быть" + ,tb.getTemperatureValueBlock().getText(),is(not(tempState.temperature))); + assertThat("Формат температуры должен не быть" + ,tb.getTemperatureFormatBlock().getText(),is(not(tempState.temperatureFormat))); + } + + @Step("Удаляем содержимое поля Город в заголовке") + public void emptyCityFieldInTitle(int n) { + onMainPage().getWeatherWidget().get(n).getWidgetTitle().sendKeys("HELLOO!!!"); + + } + + @Step("Кликаем по элементу, что бы получить фокус на нем") + public void clickCityField(int n){ + onMainPage().getWeatherWidget().get(n).getWidgetTitle().click(); + } + + @Step("Проверяем что рамзеры поля города не равны 0px") + public void cityTitleFieldShouldNotDisappear(int n) { + assertThat("Высота поля не должна быть нулевой", + onMainPage().getWeatherWidget().get(n).getWidgetTitle().getSize().getHeight(), + is(not(0)) + ); + assertThat("Ширина поля не должна быть нулевой", + onMainPage().getWeatherWidget().get(n).getWidgetTitle().getSize().getWidth(), + is(not(0)) + ); } 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..62857d2 --- /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..b08c5fa --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/tp/client/TPClient.java @@ -0,0 +1,51 @@ +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://testpalm-school.yandex-team.ru/"); + private static final String TOKEN = System.getProperty("tp.api.token", "6c77c209-adb1-48b0-9792-4731cecdbf63"); + private static final String RUN = System.getProperty("tp.api.run", "571b4711071d88000685cfa7"); + + + + 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; + } + } + +} From 05b913d7e4789772485322e95b23e27046827d99 Mon Sep 17 00:00:00 2001 From: vananos Date: Sun, 24 Apr 2016 21:52:23 +0300 Subject: [PATCH 10/15] Weather application smoke tests --- ...erWebTest.java => BaseWeatherAppTest.java} | 30 ++----- .../school/webtests/TemperatureBlockTest.java | 52 ------------ .../ru/qatools/school/webtests/TitleTest.java | 57 ------------- .../{ => pagetest}/AddWidgetButtonTest.java | 42 ++-------- .../webtests/pagetest/PageIsNotEmptyTest.java | 24 ++++++ .../webtests/pagetest/WeatherWebTest.java | 19 +++++ .../webtests/widgettest/DateTimeTest.java | 25 ++++++ .../webtests/widgettest/InfoFieldsTest.java | 31 +++++++ .../{ => widgettest}/RemoveButtonTest.java | 40 ++------- .../widgettest/TemperatureBlockTest.java | 32 ++++++++ .../school/webtests/widgettest/TitleTest.java | 36 ++++++++ .../webtests/widgettest/WeatherImageTest.java | 20 +++++ steps-module/pom.xml | 5 ++ .../school/RepresentationPatterns.java | 32 ++++++++ .../ru/qatools/school/pages/MainPage.java | 18 ++-- .../school/pages/blocks/TemperatureBlock.java | 9 +- .../school/pages/blocks/WeatherWidget.java | 14 ++-- .../blocks/widgetblocks/ActionBlock.java | 25 ++++++ .../pages/blocks/widgetblocks/InfoLine.java | 45 ++++++++++ .../pages/blocks/widgetblocks/WidgetText.java | 10 +++ .../blocks/widgetblocks/WidgetTitle.java | 9 +- .../school/steps/websteps/DefaultSteps.java | 82 ++++++------------- .../ru/qatools/school/tp/TPInformerRule.java | 6 +- .../ru/qatools/school/tp/client/TPClient.java | 1 - 24 files changed, 385 insertions(+), 279 deletions(-) rename commons-module/src/test/java/ru/qatools/school/webtests/{WeatherWebTest.java => BaseWeatherAppTest.java} (54%) delete mode 100644 commons-module/src/test/java/ru/qatools/school/webtests/TemperatureBlockTest.java delete mode 100644 commons-module/src/test/java/ru/qatools/school/webtests/TitleTest.java rename commons-module/src/test/java/ru/qatools/school/webtests/{ => pagetest}/AddWidgetButtonTest.java (50%) create mode 100644 commons-module/src/test/java/ru/qatools/school/webtests/pagetest/PageIsNotEmptyTest.java create mode 100644 commons-module/src/test/java/ru/qatools/school/webtests/pagetest/WeatherWebTest.java create mode 100644 commons-module/src/test/java/ru/qatools/school/webtests/widgettest/DateTimeTest.java create mode 100644 commons-module/src/test/java/ru/qatools/school/webtests/widgettest/InfoFieldsTest.java rename commons-module/src/test/java/ru/qatools/school/webtests/{ => widgettest}/RemoveButtonTest.java (52%) create mode 100644 commons-module/src/test/java/ru/qatools/school/webtests/widgettest/TemperatureBlockTest.java create mode 100644 commons-module/src/test/java/ru/qatools/school/webtests/widgettest/TitleTest.java create mode 100644 commons-module/src/test/java/ru/qatools/school/webtests/widgettest/WeatherImageTest.java create mode 100644 steps-module/src/main/java/ru/qatools/school/RepresentationPatterns.java create mode 100644 steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/ActionBlock.java create mode 100644 steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/InfoLine.java diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/BaseWeatherAppTest.java similarity index 54% rename from commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java rename to commons-module/src/test/java/ru/qatools/school/webtests/BaseWeatherAppTest.java index 4542be0..fe61f8c 100644 --- a/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java +++ b/commons-module/src/test/java/ru/qatools/school/webtests/BaseWeatherAppTest.java @@ -2,42 +2,28 @@ import org.junit.Before; import org.junit.Rule; -import org.junit.Test; 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; -import ru.yandex.qatools.allure.annotations.TestCaseId; -import ru.yandex.qatools.allure.annotations.Title; - - - -public class WeatherWebTest { +/** + * Created by vananos on 4/20/16. + */ +public class BaseWeatherAppTest { public static final String CITY = "Moscow"; - - private DefaultSteps defaultSteps; - - @Rule - public TPInformerRule tms = new TPInformerRule("vananos"); @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()); } - @TestCaseId("4") - @Test - @Title("Должны видеть виджет на главной странице") - public void shouldSeeWidgetOnMainPage() { - defaultSteps.openMainPageWithCity(CITY); - defaultSteps.shouldSee(onMainPage().getWeatherWidget().get(0)); - } - - private MainPage onMainPage() { + protected MainPage onMainPage() { return new MainPage(webDriverRule.getDriver()); } - } diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/TemperatureBlockTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/TemperatureBlockTest.java deleted file mode 100644 index 6fc39d8..0000000 --- a/commons-module/src/test/java/ru/qatools/school/webtests/TemperatureBlockTest.java +++ /dev/null @@ -1,52 +0,0 @@ -package ru.qatools.school.webtests; - -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -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; -import ru.yandex.qatools.allure.annotations.Title; -import com.tngtech.java.junit.dataprovider.UseDataProvider; -import ru.yandex.qatools.allure.annotations.TestCaseId; - - -public class TemperatureBlockTest { - - - public static final String CITY = "Moscow"; - - private DefaultSteps defaultSteps; - - @Rule - public TPInformerRule tms = new TPInformerRule("vananos"); - - @Rule - public WebDriverRule webDriverRule = new WebDriverRule(); - - @Before - public void initSteps() { - defaultSteps = new DefaultSteps(webDriverRule.getDriver()); - } - - @TestCaseId("5") - @Test - @Title("Жмем на блок температуры, проверяем что значение и формат температуры были изменены") - @UseDataProvider("dataProviderNumber") - public void temperatureBlockShouldChanges() { - defaultSteps.openMainPageWithCity(CITY); - defaultSteps.saveTemperatureState(0); - defaultSteps.clickTemperatureBlock(0); - defaultSteps.checkThatTemperatureStateWasChanged(); - defaultSteps.saveTemperatureState(0); - defaultSteps.clickTemperatureBlock(0); - defaultSteps.checkThatTemperatureStateWasChanged(); - } - - - private MainPage onMainPage() { - return new MainPage(webDriverRule.getDriver()); - } - -} \ No newline at end of file diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/TitleTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/TitleTest.java deleted file mode 100644 index 4080a79..0000000 --- a/commons-module/src/test/java/ru/qatools/school/webtests/TitleTest.java +++ /dev/null @@ -1,57 +0,0 @@ -package ru.qatools.school.webtests; - -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -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; -import ru.yandex.qatools.allure.annotations.TestCaseId; -import ru.yandex.qatools.allure.annotations.Title; -import com.tngtech.java.junit.dataprovider.DataProvider; -import com.tngtech.java.junit.dataprovider.DataProviderRunner; -import com.tngtech.java.junit.dataprovider.UseDataProvider; - - -@RunWith(DataProviderRunner.class) - -public class TitleTest { - - @DataProvider - public static Object[][] dataProviderCity() { - return new Object[][] { - { "Moscow"}, - { "Kiev"}, - { "Berlin"}, - { "New York"} - }; - } - - private DefaultSteps defaultSteps; - - @Rule - public TPInformerRule tms = new TPInformerRule("vananos"); - @Rule - public WebDriverRule webDriverRule = new WebDriverRule(); - - @Before - public void initSteps() { - defaultSteps = new DefaultSteps(webDriverRule.getDriver()); - } - - @TestCaseId("2") - @Test - @Title("В названии погоды должен быть город «{0}»") - @UseDataProvider("dataProviderCity") - public void titleShouldBeCity(String city) { - defaultSteps.openMainPageWithCity(city); - defaultSteps.cityIntitleShouldBe(onMainPage().getWeatherWidget().get(0).getWidgetTitle(), city); - } - - private MainPage onMainPage() { - return new MainPage(webDriverRule.getDriver()); - } - -} diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/AddWidgetButtonTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/pagetest/AddWidgetButtonTest.java similarity index 50% rename from commons-module/src/test/java/ru/qatools/school/webtests/AddWidgetButtonTest.java rename to commons-module/src/test/java/ru/qatools/school/webtests/pagetest/AddWidgetButtonTest.java index 1e68e19..fa45089 100644 --- a/commons-module/src/test/java/ru/qatools/school/webtests/AddWidgetButtonTest.java +++ b/commons-module/src/test/java/ru/qatools/school/webtests/pagetest/AddWidgetButtonTest.java @@ -1,58 +1,34 @@ -package ru.qatools.school.webtests; +package ru.qatools.school.webtests.pagetest; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -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; -import ru.yandex.qatools.allure.annotations.Title; 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 { +public class AddWidgetButtonTest extends BaseWeatherAppTest { @DataProvider public static Object[][] dataProviderNumber() { return new Object[][]{ - {1},{2} + {1}, {2} }; } - public static final String CITY = "Moscow"; - - private DefaultSteps defaultSteps; - - @Rule - public TPInformerRule tms = new TPInformerRule("vananos"); - @Rule - public WebDriverRule webDriverRule = new WebDriverRule(); - - @Before - public void initSteps() { - defaultSteps = new DefaultSteps(webDriverRule.getDriver()); - } - - @TestCaseId("1") @Test @Title("Жмем на кнопку n раз, должно быть n+1 виджетов") @UseDataProvider("dataProviderNumber") + @TestCaseId("1") public void shouldSeeNPlusOneWidgetsAfterNClickByAddButton(int n) { defaultSteps.openMainPageWithCity(CITY); defaultSteps.clickAddWidgetButtonNTimes(n); - defaultSteps.widgetsAmountShouldBe(n+1); - } - - - private MainPage onMainPage() { - return new MainPage(webDriverRule.getDriver()); + 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..52c354c --- /dev/null +++ b/commons-module/src/test/java/ru/qatools/school/webtests/pagetest/PageIsNotEmptyTest.java @@ -0,0 +1,24 @@ +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 { + + @TestCaseId("6") + @Test + @Title("При открытии страницы с пустым параметром cites на странице должна быть кнопка добавления виджета") + 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..449f99d --- /dev/null +++ b/commons-module/src/test/java/ru/qatools/school/webtests/pagetest/WeatherWebTest.java @@ -0,0 +1,19 @@ +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 { + + @TestCaseId("4") + @Test + @Title("Должны видеть виджет на главной странице") + public void shouldSeeWidgetOnMainPage() { + defaultSteps.openMainPageWithCity(CITY); + defaultSteps.shouldSee(onMainPage().getWeatherWidget().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..ee0bbc3 --- /dev/null +++ b/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/DateTimeTest.java @@ -0,0 +1,25 @@ +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 { + + @TestCaseId("5") + @Test + @Title("Дата должна отображаться в соответствии с определенным представлением") + public void dateTimeTest() { + defaultSteps.openMainPageWithCity(CITY); + defaultSteps.shouldBeRepresentedAs( + onMainPage().getWeatherWidget().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..09f9b20 --- /dev/null +++ b/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/InfoFieldsTest.java @@ -0,0 +1,31 @@ +package ru.qatools.school.webtests.widgettest; + +import org.junit.Test; +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 java.util.List; + + +public class InfoFieldsTest extends BaseWeatherAppTest { + + @TestCaseId("5") + @Test + @Title("Проверяем, что поля соответствуют паттернам") + public void infoFieldsTest() { + defaultSteps.openMainPageWithCity(CITY); + List il = onMainPage().getWeatherWidget().get(0).getWidgetText().getInfoLines(); + defaultSteps.shouldBeRepresentedAs(il.get(0).getTextRepresentation(), RepresentationPatterns.SUNRISE); + defaultSteps.shouldSee(il.get(0).getImage()); + defaultSteps.shouldBeRepresentedAs(il.get(1).getTextRepresentation(), RepresentationPatterns.SUNSET); + defaultSteps.shouldSee(il.get(1).getImage()); + defaultSteps.shouldBeRepresentedAs(il.get(2).getTextRepresentation(), RepresentationPatterns.WIND); + defaultSteps.shouldSee(il.get(2).getImage()); + defaultSteps.shouldBeRepresentedAs(il.get(3).getTextRepresentation(), RepresentationPatterns.HUMIDITY); + defaultSteps.shouldSee(il.get(3).getImage()); + } + +} \ No newline at end of file diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/RemoveButtonTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/RemoveButtonTest.java similarity index 52% rename from commons-module/src/test/java/ru/qatools/school/webtests/RemoveButtonTest.java rename to commons-module/src/test/java/ru/qatools/school/webtests/widgettest/RemoveButtonTest.java index 3df12f7..f3aaf39 100644 --- a/commons-module/src/test/java/ru/qatools/school/webtests/RemoveButtonTest.java +++ b/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/RemoveButtonTest.java @@ -1,44 +1,25 @@ -package ru.qatools.school.webtests; +package ru.qatools.school.webtests.widgettest; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -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; -import ru.yandex.qatools.allure.annotations.Title; 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 { +public class RemoveButtonTest extends BaseWeatherAppTest { @DataProvider public static Object[][] dataProviderNumber() { return new Object[][]{ - {0},{1} + {0}, {1} }; } - public static final String CITY = "Moscow"; - - private DefaultSteps defaultSteps; - - @Rule - public TPInformerRule tms = new TPInformerRule("vananos"); - @Rule - public WebDriverRule webDriverRule = new WebDriverRule(); - - @Before - public void initSteps() { - defaultSteps = new DefaultSteps(webDriverRule.getDriver()); - } - @TestCaseId("3") @Test @Title("Жмем на кнопку добавления n раз, Затем удаляем средний виджет") @@ -46,13 +27,8 @@ public void initSteps() { public void shouldSeeNWidgetsAfterOneClickByRemoveButton(int n) { defaultSteps.openMainPageWithCity(CITY); defaultSteps.clickAddWidgetButtonNTimes(n); - defaultSteps.clickRemoveWidgetButton(n/2); + defaultSteps.click(onMainPage().getWeatherWidget().get(n / 2).getActionBlock().getRemoveButton()); defaultSteps.widgetsAmountShouldBe(n); } - - private MainPage onMainPage() { - return new MainPage(webDriverRule.getDriver()); - } - } \ 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..279cd07 --- /dev/null +++ b/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/TemperatureBlockTest.java @@ -0,0 +1,32 @@ +package ru.qatools.school.webtests.widgettest; + +import org.junit.Test; +import ru.qatools.school.RepresentationPatterns; +import ru.qatools.school.pages.blocks.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. + */ +public class TemperatureBlockTest extends BaseWeatherAppTest { + + @TestCaseId("5") + @Test + @Title("Температура должна отображаться в соответствии с определенным представлением") + public void temperatureBlockTest() { + defaultSteps.openMainPageWithCity(CITY); + TemperatureBlock tb = onMainPage().getWeatherWidget().get(0).getTempBlock(); + defaultSteps.shouldBeRepresentedAs(tb.getRepresentation(), RepresentationPatterns.CELSIUS); + defaultSteps.click(tb); + defaultSteps.shouldBeRepresentedAs(tb.getRepresentation(), RepresentationPatterns.KELVIN); + defaultSteps.click(tb); + defaultSteps.shouldBeRepresentedAs(tb.getRepresentation(), RepresentationPatterns.FAHRENHEIT); + defaultSteps.click(tb); + defaultSteps.shouldBeRepresentedAs(tb.getRepresentation(), RepresentationPatterns.KAIF); + defaultSteps.click(tb); + defaultSteps.shouldBeRepresentedAs(tb.getRepresentation(), RepresentationPatterns.CELSIUS); + } +} 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..31f5d96 --- /dev/null +++ b/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/TitleTest.java @@ -0,0 +1,36 @@ +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"} + }; + } + + @TestCaseId("2") + @Test + @Title("В названии погоды должен быть город «{0}»") + @UseDataProvider("dataProviderCity") + public void titleShouldBeCity(String city) { + defaultSteps.openMainPageWithCity(city); + defaultSteps.cityIntitleShouldBe(onMainPage().getWeatherWidget().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..08db3cc --- /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 { + + @TestCaseId("5") + @Test + @Title("Проверяет наличие картинки погоды") + public void widgetImageTest() { + defaultSteps.openMainPageWithCity(CITY); + defaultSteps.shouldSee(onMainPage().getWeatherWidget().get(0).getWidgetText().getWeatherImage()); + } +} diff --git a/steps-module/pom.xml b/steps-module/pom.xml index 145a227..3de61a5 100644 --- a/steps-module/pom.xml +++ b/steps-module/pom.xml @@ -44,6 +44,11 @@ com.jayway.restassured rest-assured + + com.jcabi + jcabi-matchers + 1.3 + 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..00abb3b --- /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 s) { + pattern = s; + } + + public String getPattern() { + return pattern; + } + + public String toString() { + return pattern.toString(); + } +} 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 index 076e2ad..c06af7f 100644 --- a/steps-module/src/main/java/ru/qatools/school/pages/MainPage.java +++ b/steps-module/src/main/java/ru/qatools/school/pages/MainPage.java @@ -3,8 +3,8 @@ import org.openqa.selenium.WebDriver; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; -import ru.qatools.school.pages.blocks.WeatherWidget; 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; @@ -16,22 +16,24 @@ */ public class MainPage { - public MainPage(WebDriver driver) { - PageFactory.initElements(new HtmlElementDecorator(new HtmlElementLocatorFactory(driver)), this); - } - @Name("Список виджетов") @FindBy(css = ".card.card_md") private List weatherWidget; - - @Name("Кнопка Новый виджет") + @Name("Кнопка 'Новый виджет' ") @FindBy(css = ".new-card") private NewWidgetButton newWidgetBut; + public MainPage(WebDriver driver) { + PageFactory.initElements(new HtmlElementDecorator(new HtmlElementLocatorFactory(driver)), this); + } + public List getWeatherWidget() { return weatherWidget; } - public NewWidgetButton getNewWidgetButton(){return newWidgetBut;} + + public NewWidgetButton getNewWidgetButton() { + return newWidgetBut; + } } diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/TemperatureBlock.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/TemperatureBlock.java index bfb5751..065729c 100644 --- a/steps-module/src/main/java/ru/qatools/school/pages/blocks/TemperatureBlock.java +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/TemperatureBlock.java @@ -6,7 +6,6 @@ import ru.yandex.qatools.htmlelements.element.HtmlElement; - /** * Created by kurau. */ @@ -21,14 +20,18 @@ public class TemperatureBlock extends HtmlElement { private HtmlElement tempFormat; - public HtmlElement getTemperatureValueBlock(){ + public HtmlElement getTemperatureValueBlock() { return tempVal; } - public HtmlElement getTemperatureFormatBlock(){ + 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/WeatherWidget.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/WeatherWidget.java index 8fd6a91..fb26a69 100644 --- 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 @@ -1,8 +1,8 @@ package ru.qatools.school.pages.blocks; import org.openqa.selenium.Rectangle; -import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; +import ru.qatools.school.pages.blocks.widgetblocks.ActionBlock; import ru.qatools.school.pages.blocks.widgetblocks.WidgetText; import ru.qatools.school.pages.blocks.widgetblocks.WidgetTitle; import ru.yandex.qatools.htmlelements.annotations.Name; @@ -23,16 +23,14 @@ public class WeatherWidget extends HtmlElement { @Name("Панель управления виджетом") @FindBy(css = ".card-actions") - private WebElement actions; + private ActionBlock actions; - @Name("Кнопка удаления виджета") - @FindBy(css = ".remove-card.btn.btn-default") - private WebElement removeButton; @Name("Блок температуры") @FindBy(css = ".weather-temperature") private TemperatureBlock tempBlock; + public WidgetText getWidgetText() { return widgetText; } @@ -41,18 +39,16 @@ public WidgetTitle getWidgetTitle() { return widgetTitle; } - public WebElement getActions() { + public ActionBlock getActionBlock() { return actions; } - public WebElement getRemoveButton(){ - return removeButton; - } public TemperatureBlock getTempBlock() { return tempBlock; } + 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/WidgetText.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetText.java index 510d070..dd445d9 100644 --- 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 @@ -6,6 +6,8 @@ import ru.yandex.qatools.htmlelements.annotations.Name; import ru.yandex.qatools.htmlelements.element.HtmlElement; +import java.util.List; + /** * Created by kurau. */ @@ -15,10 +17,18 @@ public class WidgetText extends HtmlElement { @FindBy(css = ".weather-image") private WebElement weatherImage; + @Name("Поля с дополнительной информацией") + @FindBy(css = ".info-line") + private List infoLines; + public WebElement getWeatherImage() { return weatherImage; } + public List getInfoLines() { + return infoLines; + } + 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 index 06da232..3bf4769 100644 --- 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 @@ -1,9 +1,9 @@ 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; -import org.openqa.selenium.support.FindBy; /** * Created by kurau. @@ -14,10 +14,17 @@ public class WidgetTitle extends HtmlElement { @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/steps/websteps/DefaultSteps.java b/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java index 55ee806..430344c 100644 --- 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 @@ -1,34 +1,31 @@ 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.TemperatureBlock; import ru.qatools.school.pages.blocks.widgetblocks.WidgetTitle; import ru.yandex.qatools.allure.annotations.Step; +import ru.yandex.qatools.htmlelements.element.HtmlElement; + 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; -import static org.hamcrest.core.Is.is; -import static org.hamcrest.core.IsNot.not; + /** * Created by kurau. */ public class DefaultSteps { - public static final String MAIN_PAGE = "http://weather.lanwen.ru/#?cities=%s"; + 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; - private class TempState{ - public String temperature, temperatureFormat; - public int n; - } - - private TempState tempState = new TempState(); - public DefaultSteps(WebDriver driver) { this.driver = driver; @@ -36,7 +33,12 @@ public DefaultSteps(WebDriver driver) { @Step("Открываем главную страницу для города «{0}»") public void openMainPageWithCity(String city) { - driver.get(format(MAIN_PAGE, city)); + driver.get(format(MAIN_PAGE_WITH_CITY, city)); + } + + @Step("Открываем главную страницу без города") + public void openMainPage() { + driver.get(MAIN_PAGE); } @Step("Должны видеть на странице «{0}»") @@ -46,70 +48,34 @@ public void shouldSee(WebElement element) { @Step("Заголовок должен быть «{1}»") public void cityIntitleShouldBe(WidgetTitle widgetTitle, String title) { - assertThat("Город должен быть",widgetTitle.getTitleCityElement(), hasText(title)); + assertThat("Город должен быть", widgetTitle.getTitleCityElement(), hasText(title)); } @Step("Количество виджетов должно быть «{0}»") public void widgetsAmountShouldBe(int n) { - assertThat("Количество виджетов должно быть",onMainPage().getWeatherWidget().size(), is(n)); + assertThat("Количество виджетов должно быть", onMainPage().getWeatherWidget().size(), is(n)); } @Step("Жмем кнопку добавить виджет «{0}» раз") public void clickAddWidgetButtonNTimes(int n) { - while(n-- > 0){ + while (n-- > 0) { onMainPage().getNewWidgetButton().click(); } } - @Step("Жмем кнопку удалить виджет для виджета № «{0}»") - public void clickRemoveWidgetButton(int n) { - onMainPage().getWeatherWidget().get(n).getRemoveButton().click(); + @Step("Жмем на элемент") + public void click(HtmlElement el) { + el.click(); } - @Step("Жмем на блок температуры") - public void clickTemperatureBlock(int n) { - onMainPage().getWeatherWidget().get(n).getTempBlock().click(); - } - - @Step("Запоминаем состояние температуры") - public void saveTemperatureState(int n) { - TemperatureBlock tb = onMainPage().getWeatherWidget().get(n).getTempBlock(); - tempState.temperature = tb.getTemperatureValueBlock().getText(); - tempState.temperatureFormat = tb.getTemperatureFormatBlock().getText(); - tempState.n = n; - } - - @Step("Проверяем изменилась ли температура") - public void checkThatTemperatureStateWasChanged() { - TemperatureBlock tb = onMainPage().getWeatherWidget().get(tempState.n).getTempBlock(); - assertThat("Значение температуры должно не быть" - ,tb.getTemperatureValueBlock().getText(),is(not(tempState.temperature))); - assertThat("Формат температуры должен не быть" - ,tb.getTemperatureFormatBlock().getText(),is(not(tempState.temperatureFormat))); - } - - @Step("Удаляем содержимое поля Город в заголовке") - public void emptyCityFieldInTitle(int n) { - onMainPage().getWeatherWidget().get(n).getWidgetTitle().sendKeys("HELLOO!!!"); - } + @Step("Проверяем что представление элемента соответствует паттерну {1}") + public void shouldBeRepresentedAs(String representation, RepresentationPatterns pattern) { + assertThat("Представление должно соответствовать регулярному выражение", + representation, RegexMatchers.containsPattern(pattern.getPattern())); - @Step("Кликаем по элементу, что бы получить фокус на нем") - public void clickCityField(int n){ - onMainPage().getWeatherWidget().get(n).getWidgetTitle().click(); } - @Step("Проверяем что рамзеры поля города не равны 0px") - public void cityTitleFieldShouldNotDisappear(int n) { - assertThat("Высота поля не должна быть нулевой", - onMainPage().getWeatherWidget().get(n).getWidgetTitle().getSize().getHeight(), - is(not(0)) - ); - assertThat("Ширина поля не должна быть нулевой", - onMainPage().getWeatherWidget().get(n).getWidgetTitle().getSize().getWidth(), - is(not(0)) - ); - } 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 index 62857d2..b52d777 100644 --- a/steps-module/src/main/java/ru/qatools/school/tp/TPInformerRule.java +++ b/steps-module/src/main/java/ru/qatools/school/tp/TPInformerRule.java @@ -35,7 +35,7 @@ protected void skipped(AssumptionViolatedException e, Description description) { @Override protected void failed(Throwable e, Description description) { if (e instanceof AssertionError) { - updateWithStatus("FAILED", description); + updateWithStatus("FAILED", description); } else { updateWithStatus("BROKEN", description); } @@ -50,8 +50,8 @@ 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, + new TPClient.TCaseStatus(new TPClient.TCase(idFrom(description)), + status, currentTimeMillis() - start ))); } 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 index b08c5fa..e088d23 100644 --- 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 @@ -15,7 +15,6 @@ public class TPClient { private static final String RUN = System.getProperty("tp.api.run", "571b4711071d88000685cfa7"); - public static void callUpdate(String project, List statuses) { RestAssured.given() .relaxedHTTPSValidation() From 7aa1a0268271d10d17ecfe875241b7aa3043c200 Mon Sep 17 00:00:00 2001 From: vananos Date: Sun, 24 Apr 2016 21:52:23 +0300 Subject: [PATCH 11/15] Weather application smoke tests --- ...erWebTest.java => BaseWeatherAppTest.java} | 30 ++----- .../school/webtests/TemperatureBlockTest.java | 52 ------------ .../ru/qatools/school/webtests/TitleTest.java | 57 ------------- .../{ => pagetest}/AddWidgetButtonTest.java | 42 ++-------- .../webtests/pagetest/PageIsNotEmptyTest.java | 24 ++++++ .../webtests/pagetest/WeatherWebTest.java | 19 +++++ .../webtests/widgettest/DateTimeTest.java | 25 ++++++ .../webtests/widgettest/InfoFieldsTest.java | 31 +++++++ .../{ => widgettest}/RemoveButtonTest.java | 40 ++------- .../widgettest/TemperatureBlockTest.java | 32 ++++++++ .../school/webtests/widgettest/TitleTest.java | 36 ++++++++ .../webtests/widgettest/WeatherImageTest.java | 20 +++++ steps-module/pom.xml | 5 ++ .../school/RepresentationPatterns.java | 32 ++++++++ .../ru/qatools/school/pages/MainPage.java | 18 ++-- .../school/pages/blocks/TemperatureBlock.java | 9 +- .../school/pages/blocks/WeatherWidget.java | 14 ++-- .../blocks/widgetblocks/ActionBlock.java | 25 ++++++ .../pages/blocks/widgetblocks/InfoLine.java | 45 ++++++++++ .../pages/blocks/widgetblocks/WidgetText.java | 10 +++ .../blocks/widgetblocks/WidgetTitle.java | 9 +- .../school/steps/websteps/DefaultSteps.java | 82 ++++++------------- .../ru/qatools/school/tp/TPInformerRule.java | 6 +- .../ru/qatools/school/tp/client/TPClient.java | 7 +- 24 files changed, 388 insertions(+), 282 deletions(-) rename commons-module/src/test/java/ru/qatools/school/webtests/{WeatherWebTest.java => BaseWeatherAppTest.java} (54%) delete mode 100644 commons-module/src/test/java/ru/qatools/school/webtests/TemperatureBlockTest.java delete mode 100644 commons-module/src/test/java/ru/qatools/school/webtests/TitleTest.java rename commons-module/src/test/java/ru/qatools/school/webtests/{ => pagetest}/AddWidgetButtonTest.java (50%) create mode 100644 commons-module/src/test/java/ru/qatools/school/webtests/pagetest/PageIsNotEmptyTest.java create mode 100644 commons-module/src/test/java/ru/qatools/school/webtests/pagetest/WeatherWebTest.java create mode 100644 commons-module/src/test/java/ru/qatools/school/webtests/widgettest/DateTimeTest.java create mode 100644 commons-module/src/test/java/ru/qatools/school/webtests/widgettest/InfoFieldsTest.java rename commons-module/src/test/java/ru/qatools/school/webtests/{ => widgettest}/RemoveButtonTest.java (52%) create mode 100644 commons-module/src/test/java/ru/qatools/school/webtests/widgettest/TemperatureBlockTest.java create mode 100644 commons-module/src/test/java/ru/qatools/school/webtests/widgettest/TitleTest.java create mode 100644 commons-module/src/test/java/ru/qatools/school/webtests/widgettest/WeatherImageTest.java create mode 100644 steps-module/src/main/java/ru/qatools/school/RepresentationPatterns.java create mode 100644 steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/ActionBlock.java create mode 100644 steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/InfoLine.java diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/BaseWeatherAppTest.java similarity index 54% rename from commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java rename to commons-module/src/test/java/ru/qatools/school/webtests/BaseWeatherAppTest.java index 4542be0..fe61f8c 100644 --- a/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java +++ b/commons-module/src/test/java/ru/qatools/school/webtests/BaseWeatherAppTest.java @@ -2,42 +2,28 @@ import org.junit.Before; import org.junit.Rule; -import org.junit.Test; 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; -import ru.yandex.qatools.allure.annotations.TestCaseId; -import ru.yandex.qatools.allure.annotations.Title; - - - -public class WeatherWebTest { +/** + * Created by vananos on 4/20/16. + */ +public class BaseWeatherAppTest { public static final String CITY = "Moscow"; - - private DefaultSteps defaultSteps; - - @Rule - public TPInformerRule tms = new TPInformerRule("vananos"); @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()); } - @TestCaseId("4") - @Test - @Title("Должны видеть виджет на главной странице") - public void shouldSeeWidgetOnMainPage() { - defaultSteps.openMainPageWithCity(CITY); - defaultSteps.shouldSee(onMainPage().getWeatherWidget().get(0)); - } - - private MainPage onMainPage() { + protected MainPage onMainPage() { return new MainPage(webDriverRule.getDriver()); } - } diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/TemperatureBlockTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/TemperatureBlockTest.java deleted file mode 100644 index 6fc39d8..0000000 --- a/commons-module/src/test/java/ru/qatools/school/webtests/TemperatureBlockTest.java +++ /dev/null @@ -1,52 +0,0 @@ -package ru.qatools.school.webtests; - -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -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; -import ru.yandex.qatools.allure.annotations.Title; -import com.tngtech.java.junit.dataprovider.UseDataProvider; -import ru.yandex.qatools.allure.annotations.TestCaseId; - - -public class TemperatureBlockTest { - - - public static final String CITY = "Moscow"; - - private DefaultSteps defaultSteps; - - @Rule - public TPInformerRule tms = new TPInformerRule("vananos"); - - @Rule - public WebDriverRule webDriverRule = new WebDriverRule(); - - @Before - public void initSteps() { - defaultSteps = new DefaultSteps(webDriverRule.getDriver()); - } - - @TestCaseId("5") - @Test - @Title("Жмем на блок температуры, проверяем что значение и формат температуры были изменены") - @UseDataProvider("dataProviderNumber") - public void temperatureBlockShouldChanges() { - defaultSteps.openMainPageWithCity(CITY); - defaultSteps.saveTemperatureState(0); - defaultSteps.clickTemperatureBlock(0); - defaultSteps.checkThatTemperatureStateWasChanged(); - defaultSteps.saveTemperatureState(0); - defaultSteps.clickTemperatureBlock(0); - defaultSteps.checkThatTemperatureStateWasChanged(); - } - - - private MainPage onMainPage() { - return new MainPage(webDriverRule.getDriver()); - } - -} \ No newline at end of file diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/TitleTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/TitleTest.java deleted file mode 100644 index 4080a79..0000000 --- a/commons-module/src/test/java/ru/qatools/school/webtests/TitleTest.java +++ /dev/null @@ -1,57 +0,0 @@ -package ru.qatools.school.webtests; - -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -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; -import ru.yandex.qatools.allure.annotations.TestCaseId; -import ru.yandex.qatools.allure.annotations.Title; -import com.tngtech.java.junit.dataprovider.DataProvider; -import com.tngtech.java.junit.dataprovider.DataProviderRunner; -import com.tngtech.java.junit.dataprovider.UseDataProvider; - - -@RunWith(DataProviderRunner.class) - -public class TitleTest { - - @DataProvider - public static Object[][] dataProviderCity() { - return new Object[][] { - { "Moscow"}, - { "Kiev"}, - { "Berlin"}, - { "New York"} - }; - } - - private DefaultSteps defaultSteps; - - @Rule - public TPInformerRule tms = new TPInformerRule("vananos"); - @Rule - public WebDriverRule webDriverRule = new WebDriverRule(); - - @Before - public void initSteps() { - defaultSteps = new DefaultSteps(webDriverRule.getDriver()); - } - - @TestCaseId("2") - @Test - @Title("В названии погоды должен быть город «{0}»") - @UseDataProvider("dataProviderCity") - public void titleShouldBeCity(String city) { - defaultSteps.openMainPageWithCity(city); - defaultSteps.cityIntitleShouldBe(onMainPage().getWeatherWidget().get(0).getWidgetTitle(), city); - } - - private MainPage onMainPage() { - return new MainPage(webDriverRule.getDriver()); - } - -} diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/AddWidgetButtonTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/pagetest/AddWidgetButtonTest.java similarity index 50% rename from commons-module/src/test/java/ru/qatools/school/webtests/AddWidgetButtonTest.java rename to commons-module/src/test/java/ru/qatools/school/webtests/pagetest/AddWidgetButtonTest.java index 1e68e19..fa45089 100644 --- a/commons-module/src/test/java/ru/qatools/school/webtests/AddWidgetButtonTest.java +++ b/commons-module/src/test/java/ru/qatools/school/webtests/pagetest/AddWidgetButtonTest.java @@ -1,58 +1,34 @@ -package ru.qatools.school.webtests; +package ru.qatools.school.webtests.pagetest; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -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; -import ru.yandex.qatools.allure.annotations.Title; 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 { +public class AddWidgetButtonTest extends BaseWeatherAppTest { @DataProvider public static Object[][] dataProviderNumber() { return new Object[][]{ - {1},{2} + {1}, {2} }; } - public static final String CITY = "Moscow"; - - private DefaultSteps defaultSteps; - - @Rule - public TPInformerRule tms = new TPInformerRule("vananos"); - @Rule - public WebDriverRule webDriverRule = new WebDriverRule(); - - @Before - public void initSteps() { - defaultSteps = new DefaultSteps(webDriverRule.getDriver()); - } - - @TestCaseId("1") @Test @Title("Жмем на кнопку n раз, должно быть n+1 виджетов") @UseDataProvider("dataProviderNumber") + @TestCaseId("1") public void shouldSeeNPlusOneWidgetsAfterNClickByAddButton(int n) { defaultSteps.openMainPageWithCity(CITY); defaultSteps.clickAddWidgetButtonNTimes(n); - defaultSteps.widgetsAmountShouldBe(n+1); - } - - - private MainPage onMainPage() { - return new MainPage(webDriverRule.getDriver()); + 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..52c354c --- /dev/null +++ b/commons-module/src/test/java/ru/qatools/school/webtests/pagetest/PageIsNotEmptyTest.java @@ -0,0 +1,24 @@ +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 { + + @TestCaseId("6") + @Test + @Title("При открытии страницы с пустым параметром cites на странице должна быть кнопка добавления виджета") + 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..449f99d --- /dev/null +++ b/commons-module/src/test/java/ru/qatools/school/webtests/pagetest/WeatherWebTest.java @@ -0,0 +1,19 @@ +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 { + + @TestCaseId("4") + @Test + @Title("Должны видеть виджет на главной странице") + public void shouldSeeWidgetOnMainPage() { + defaultSteps.openMainPageWithCity(CITY); + defaultSteps.shouldSee(onMainPage().getWeatherWidget().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..ee0bbc3 --- /dev/null +++ b/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/DateTimeTest.java @@ -0,0 +1,25 @@ +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 { + + @TestCaseId("5") + @Test + @Title("Дата должна отображаться в соответствии с определенным представлением") + public void dateTimeTest() { + defaultSteps.openMainPageWithCity(CITY); + defaultSteps.shouldBeRepresentedAs( + onMainPage().getWeatherWidget().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..09f9b20 --- /dev/null +++ b/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/InfoFieldsTest.java @@ -0,0 +1,31 @@ +package ru.qatools.school.webtests.widgettest; + +import org.junit.Test; +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 java.util.List; + + +public class InfoFieldsTest extends BaseWeatherAppTest { + + @TestCaseId("5") + @Test + @Title("Проверяем, что поля соответствуют паттернам") + public void infoFieldsTest() { + defaultSteps.openMainPageWithCity(CITY); + List il = onMainPage().getWeatherWidget().get(0).getWidgetText().getInfoLines(); + defaultSteps.shouldBeRepresentedAs(il.get(0).getTextRepresentation(), RepresentationPatterns.SUNRISE); + defaultSteps.shouldSee(il.get(0).getImage()); + defaultSteps.shouldBeRepresentedAs(il.get(1).getTextRepresentation(), RepresentationPatterns.SUNSET); + defaultSteps.shouldSee(il.get(1).getImage()); + defaultSteps.shouldBeRepresentedAs(il.get(2).getTextRepresentation(), RepresentationPatterns.WIND); + defaultSteps.shouldSee(il.get(2).getImage()); + defaultSteps.shouldBeRepresentedAs(il.get(3).getTextRepresentation(), RepresentationPatterns.HUMIDITY); + defaultSteps.shouldSee(il.get(3).getImage()); + } + +} \ No newline at end of file diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/RemoveButtonTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/RemoveButtonTest.java similarity index 52% rename from commons-module/src/test/java/ru/qatools/school/webtests/RemoveButtonTest.java rename to commons-module/src/test/java/ru/qatools/school/webtests/widgettest/RemoveButtonTest.java index 3df12f7..f3aaf39 100644 --- a/commons-module/src/test/java/ru/qatools/school/webtests/RemoveButtonTest.java +++ b/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/RemoveButtonTest.java @@ -1,44 +1,25 @@ -package ru.qatools.school.webtests; +package ru.qatools.school.webtests.widgettest; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -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; -import ru.yandex.qatools.allure.annotations.Title; 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 { +public class RemoveButtonTest extends BaseWeatherAppTest { @DataProvider public static Object[][] dataProviderNumber() { return new Object[][]{ - {0},{1} + {0}, {1} }; } - public static final String CITY = "Moscow"; - - private DefaultSteps defaultSteps; - - @Rule - public TPInformerRule tms = new TPInformerRule("vananos"); - @Rule - public WebDriverRule webDriverRule = new WebDriverRule(); - - @Before - public void initSteps() { - defaultSteps = new DefaultSteps(webDriverRule.getDriver()); - } - @TestCaseId("3") @Test @Title("Жмем на кнопку добавления n раз, Затем удаляем средний виджет") @@ -46,13 +27,8 @@ public void initSteps() { public void shouldSeeNWidgetsAfterOneClickByRemoveButton(int n) { defaultSteps.openMainPageWithCity(CITY); defaultSteps.clickAddWidgetButtonNTimes(n); - defaultSteps.clickRemoveWidgetButton(n/2); + defaultSteps.click(onMainPage().getWeatherWidget().get(n / 2).getActionBlock().getRemoveButton()); defaultSteps.widgetsAmountShouldBe(n); } - - private MainPage onMainPage() { - return new MainPage(webDriverRule.getDriver()); - } - } \ 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..279cd07 --- /dev/null +++ b/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/TemperatureBlockTest.java @@ -0,0 +1,32 @@ +package ru.qatools.school.webtests.widgettest; + +import org.junit.Test; +import ru.qatools.school.RepresentationPatterns; +import ru.qatools.school.pages.blocks.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. + */ +public class TemperatureBlockTest extends BaseWeatherAppTest { + + @TestCaseId("5") + @Test + @Title("Температура должна отображаться в соответствии с определенным представлением") + public void temperatureBlockTest() { + defaultSteps.openMainPageWithCity(CITY); + TemperatureBlock tb = onMainPage().getWeatherWidget().get(0).getTempBlock(); + defaultSteps.shouldBeRepresentedAs(tb.getRepresentation(), RepresentationPatterns.CELSIUS); + defaultSteps.click(tb); + defaultSteps.shouldBeRepresentedAs(tb.getRepresentation(), RepresentationPatterns.KELVIN); + defaultSteps.click(tb); + defaultSteps.shouldBeRepresentedAs(tb.getRepresentation(), RepresentationPatterns.FAHRENHEIT); + defaultSteps.click(tb); + defaultSteps.shouldBeRepresentedAs(tb.getRepresentation(), RepresentationPatterns.KAIF); + defaultSteps.click(tb); + defaultSteps.shouldBeRepresentedAs(tb.getRepresentation(), RepresentationPatterns.CELSIUS); + } +} 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..31f5d96 --- /dev/null +++ b/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/TitleTest.java @@ -0,0 +1,36 @@ +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"} + }; + } + + @TestCaseId("2") + @Test + @Title("В названии погоды должен быть город «{0}»") + @UseDataProvider("dataProviderCity") + public void titleShouldBeCity(String city) { + defaultSteps.openMainPageWithCity(city); + defaultSteps.cityIntitleShouldBe(onMainPage().getWeatherWidget().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..08db3cc --- /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 { + + @TestCaseId("5") + @Test + @Title("Проверяет наличие картинки погоды") + public void widgetImageTest() { + defaultSteps.openMainPageWithCity(CITY); + defaultSteps.shouldSee(onMainPage().getWeatherWidget().get(0).getWidgetText().getWeatherImage()); + } +} diff --git a/steps-module/pom.xml b/steps-module/pom.xml index 145a227..3de61a5 100644 --- a/steps-module/pom.xml +++ b/steps-module/pom.xml @@ -44,6 +44,11 @@ com.jayway.restassured rest-assured + + com.jcabi + jcabi-matchers + 1.3 + 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..00abb3b --- /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 s) { + pattern = s; + } + + public String getPattern() { + return pattern; + } + + public String toString() { + return pattern.toString(); + } +} 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 index 076e2ad..c06af7f 100644 --- a/steps-module/src/main/java/ru/qatools/school/pages/MainPage.java +++ b/steps-module/src/main/java/ru/qatools/school/pages/MainPage.java @@ -3,8 +3,8 @@ import org.openqa.selenium.WebDriver; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; -import ru.qatools.school.pages.blocks.WeatherWidget; 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; @@ -16,22 +16,24 @@ */ public class MainPage { - public MainPage(WebDriver driver) { - PageFactory.initElements(new HtmlElementDecorator(new HtmlElementLocatorFactory(driver)), this); - } - @Name("Список виджетов") @FindBy(css = ".card.card_md") private List weatherWidget; - - @Name("Кнопка Новый виджет") + @Name("Кнопка 'Новый виджет' ") @FindBy(css = ".new-card") private NewWidgetButton newWidgetBut; + public MainPage(WebDriver driver) { + PageFactory.initElements(new HtmlElementDecorator(new HtmlElementLocatorFactory(driver)), this); + } + public List getWeatherWidget() { return weatherWidget; } - public NewWidgetButton getNewWidgetButton(){return newWidgetBut;} + + public NewWidgetButton getNewWidgetButton() { + return newWidgetBut; + } } diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/TemperatureBlock.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/TemperatureBlock.java index bfb5751..065729c 100644 --- a/steps-module/src/main/java/ru/qatools/school/pages/blocks/TemperatureBlock.java +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/TemperatureBlock.java @@ -6,7 +6,6 @@ import ru.yandex.qatools.htmlelements.element.HtmlElement; - /** * Created by kurau. */ @@ -21,14 +20,18 @@ public class TemperatureBlock extends HtmlElement { private HtmlElement tempFormat; - public HtmlElement getTemperatureValueBlock(){ + public HtmlElement getTemperatureValueBlock() { return tempVal; } - public HtmlElement getTemperatureFormatBlock(){ + 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/WeatherWidget.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/WeatherWidget.java index 8fd6a91..fb26a69 100644 --- 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 @@ -1,8 +1,8 @@ package ru.qatools.school.pages.blocks; import org.openqa.selenium.Rectangle; -import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; +import ru.qatools.school.pages.blocks.widgetblocks.ActionBlock; import ru.qatools.school.pages.blocks.widgetblocks.WidgetText; import ru.qatools.school.pages.blocks.widgetblocks.WidgetTitle; import ru.yandex.qatools.htmlelements.annotations.Name; @@ -23,16 +23,14 @@ public class WeatherWidget extends HtmlElement { @Name("Панель управления виджетом") @FindBy(css = ".card-actions") - private WebElement actions; + private ActionBlock actions; - @Name("Кнопка удаления виджета") - @FindBy(css = ".remove-card.btn.btn-default") - private WebElement removeButton; @Name("Блок температуры") @FindBy(css = ".weather-temperature") private TemperatureBlock tempBlock; + public WidgetText getWidgetText() { return widgetText; } @@ -41,18 +39,16 @@ public WidgetTitle getWidgetTitle() { return widgetTitle; } - public WebElement getActions() { + public ActionBlock getActionBlock() { return actions; } - public WebElement getRemoveButton(){ - return removeButton; - } public TemperatureBlock getTempBlock() { return tempBlock; } + 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/WidgetText.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetText.java index 510d070..dd445d9 100644 --- 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 @@ -6,6 +6,8 @@ import ru.yandex.qatools.htmlelements.annotations.Name; import ru.yandex.qatools.htmlelements.element.HtmlElement; +import java.util.List; + /** * Created by kurau. */ @@ -15,10 +17,18 @@ public class WidgetText extends HtmlElement { @FindBy(css = ".weather-image") private WebElement weatherImage; + @Name("Поля с дополнительной информацией") + @FindBy(css = ".info-line") + private List infoLines; + public WebElement getWeatherImage() { return weatherImage; } + public List getInfoLines() { + return infoLines; + } + 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 index 06da232..3bf4769 100644 --- 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 @@ -1,9 +1,9 @@ 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; -import org.openqa.selenium.support.FindBy; /** * Created by kurau. @@ -14,10 +14,17 @@ public class WidgetTitle extends HtmlElement { @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/steps/websteps/DefaultSteps.java b/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java index 55ee806..430344c 100644 --- 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 @@ -1,34 +1,31 @@ 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.TemperatureBlock; import ru.qatools.school.pages.blocks.widgetblocks.WidgetTitle; import ru.yandex.qatools.allure.annotations.Step; +import ru.yandex.qatools.htmlelements.element.HtmlElement; + 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; -import static org.hamcrest.core.Is.is; -import static org.hamcrest.core.IsNot.not; + /** * Created by kurau. */ public class DefaultSteps { - public static final String MAIN_PAGE = "http://weather.lanwen.ru/#?cities=%s"; + 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; - private class TempState{ - public String temperature, temperatureFormat; - public int n; - } - - private TempState tempState = new TempState(); - public DefaultSteps(WebDriver driver) { this.driver = driver; @@ -36,7 +33,12 @@ public DefaultSteps(WebDriver driver) { @Step("Открываем главную страницу для города «{0}»") public void openMainPageWithCity(String city) { - driver.get(format(MAIN_PAGE, city)); + driver.get(format(MAIN_PAGE_WITH_CITY, city)); + } + + @Step("Открываем главную страницу без города") + public void openMainPage() { + driver.get(MAIN_PAGE); } @Step("Должны видеть на странице «{0}»") @@ -46,70 +48,34 @@ public void shouldSee(WebElement element) { @Step("Заголовок должен быть «{1}»") public void cityIntitleShouldBe(WidgetTitle widgetTitle, String title) { - assertThat("Город должен быть",widgetTitle.getTitleCityElement(), hasText(title)); + assertThat("Город должен быть", widgetTitle.getTitleCityElement(), hasText(title)); } @Step("Количество виджетов должно быть «{0}»") public void widgetsAmountShouldBe(int n) { - assertThat("Количество виджетов должно быть",onMainPage().getWeatherWidget().size(), is(n)); + assertThat("Количество виджетов должно быть", onMainPage().getWeatherWidget().size(), is(n)); } @Step("Жмем кнопку добавить виджет «{0}» раз") public void clickAddWidgetButtonNTimes(int n) { - while(n-- > 0){ + while (n-- > 0) { onMainPage().getNewWidgetButton().click(); } } - @Step("Жмем кнопку удалить виджет для виджета № «{0}»") - public void clickRemoveWidgetButton(int n) { - onMainPage().getWeatherWidget().get(n).getRemoveButton().click(); + @Step("Жмем на элемент") + public void click(HtmlElement el) { + el.click(); } - @Step("Жмем на блок температуры") - public void clickTemperatureBlock(int n) { - onMainPage().getWeatherWidget().get(n).getTempBlock().click(); - } - - @Step("Запоминаем состояние температуры") - public void saveTemperatureState(int n) { - TemperatureBlock tb = onMainPage().getWeatherWidget().get(n).getTempBlock(); - tempState.temperature = tb.getTemperatureValueBlock().getText(); - tempState.temperatureFormat = tb.getTemperatureFormatBlock().getText(); - tempState.n = n; - } - - @Step("Проверяем изменилась ли температура") - public void checkThatTemperatureStateWasChanged() { - TemperatureBlock tb = onMainPage().getWeatherWidget().get(tempState.n).getTempBlock(); - assertThat("Значение температуры должно не быть" - ,tb.getTemperatureValueBlock().getText(),is(not(tempState.temperature))); - assertThat("Формат температуры должен не быть" - ,tb.getTemperatureFormatBlock().getText(),is(not(tempState.temperatureFormat))); - } - - @Step("Удаляем содержимое поля Город в заголовке") - public void emptyCityFieldInTitle(int n) { - onMainPage().getWeatherWidget().get(n).getWidgetTitle().sendKeys("HELLOO!!!"); - } + @Step("Проверяем что представление элемента соответствует паттерну {1}") + public void shouldBeRepresentedAs(String representation, RepresentationPatterns pattern) { + assertThat("Представление должно соответствовать регулярному выражение", + representation, RegexMatchers.containsPattern(pattern.getPattern())); - @Step("Кликаем по элементу, что бы получить фокус на нем") - public void clickCityField(int n){ - onMainPage().getWeatherWidget().get(n).getWidgetTitle().click(); } - @Step("Проверяем что рамзеры поля города не равны 0px") - public void cityTitleFieldShouldNotDisappear(int n) { - assertThat("Высота поля не должна быть нулевой", - onMainPage().getWeatherWidget().get(n).getWidgetTitle().getSize().getHeight(), - is(not(0)) - ); - assertThat("Ширина поля не должна быть нулевой", - onMainPage().getWeatherWidget().get(n).getWidgetTitle().getSize().getWidth(), - is(not(0)) - ); - } 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 index 62857d2..b52d777 100644 --- a/steps-module/src/main/java/ru/qatools/school/tp/TPInformerRule.java +++ b/steps-module/src/main/java/ru/qatools/school/tp/TPInformerRule.java @@ -35,7 +35,7 @@ protected void skipped(AssumptionViolatedException e, Description description) { @Override protected void failed(Throwable e, Description description) { if (e instanceof AssertionError) { - updateWithStatus("FAILED", description); + updateWithStatus("FAILED", description); } else { updateWithStatus("BROKEN", description); } @@ -50,8 +50,8 @@ 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, + new TPClient.TCaseStatus(new TPClient.TCase(idFrom(description)), + status, currentTimeMillis() - start ))); } 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 index b08c5fa..165a427 100644 --- 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 @@ -10,10 +10,9 @@ */ public class TPClient { - private static final String ENDPOINT = System.getProperty("tp.api.endpoint", "https://testpalm-school.yandex-team.ru/"); - private static final String TOKEN = System.getProperty("tp.api.token", "6c77c209-adb1-48b0-9792-4731cecdbf63"); - private static final String RUN = System.getProperty("tp.api.run", "571b4711071d88000685cfa7"); - + 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) { From 9bf1ab3bc334053c208e7a1e4042a4ba7f8c0e1e Mon Sep 17 00:00:00 2001 From: vananos Date: Mon, 25 Apr 2016 08:09:15 +0300 Subject: [PATCH 12/15] add parametrization for InfoFieldsTest and TemperatureBlockTest, rename some variables and methods --- .../pagetest/AddWidgetButtonTest.java | 2 +- .../webtests/pagetest/WeatherWebTest.java | 2 +- .../webtests/widgettest/DateTimeTest.java | 2 +- .../webtests/widgettest/InfoFieldsTest.java | 34 +++++++++++------ .../webtests/widgettest/RemoveButtonTest.java | 6 +-- .../widgettest/TemperatureBlockTest.java | 37 +++++++++++++------ .../school/webtests/widgettest/TitleTest.java | 2 +- .../webtests/widgettest/WeatherImageTest.java | 2 +- .../school/RepresentationPatterns.java | 4 +- .../ru/qatools/school/pages/MainPage.java | 2 +- .../school/pages/blocks/WeatherWidget.java | 9 +---- .../{ => widgetblocks}/TemperatureBlock.java | 6 +-- .../pages/blocks/widgetblocks/WidgetText.java | 8 ++++ .../school/steps/websteps/DefaultSteps.java | 21 ++++++----- 14 files changed, 82 insertions(+), 55 deletions(-) rename steps-module/src/main/java/ru/qatools/school/pages/blocks/{ => widgetblocks}/TemperatureBlock.java (92%) 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 index fa45089..87ecbb1 100644 --- 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 @@ -27,7 +27,7 @@ public static Object[][] dataProviderNumber() { @TestCaseId("1") public void shouldSeeNPlusOneWidgetsAfterNClickByAddButton(int n) { defaultSteps.openMainPageWithCity(CITY); - defaultSteps.clickAddWidgetButtonNTimes(n); + defaultSteps.clickNTimes(onMainPage().getNewWidgetButton(),n); defaultSteps.widgetsAmountShouldBe(n + 1); } 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 index a009aa1..cfa5d1b 100644 --- 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 @@ -14,7 +14,7 @@ public class WeatherWebTest extends BaseWeatherAppTest { @TestCaseId("4") public void shouldSeeWidgetOnMainPage() { defaultSteps.openMainPageWithCity(CITY); - defaultSteps.shouldSee(onMainPage().getWeatherWidget().get(0)); + 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 index d72fe7d..d77408a 100644 --- 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 @@ -19,7 +19,7 @@ public class DateTimeTest extends BaseWeatherAppTest { public void dateTimeTest() { defaultSteps.openMainPageWithCity(CITY); defaultSteps.shouldBeRepresentedAs( - onMainPage().getWeatherWidget().get(0).getWidgetTitle().getDateTime().getText() + 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 index b530ff9..a432b65 100644 --- 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 @@ -1,32 +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() { + public void infoFieldsTest(int n, RepresentationPatterns pattern) { defaultSteps.openMainPageWithCity(CITY); - List il = onMainPage().getWeatherWidget().get(0).getWidgetText().getInfoLines(); - defaultSteps.shouldBeRepresentedAs(il.get(0).getTextRepresentation(), RepresentationPatterns.SUNRISE); - defaultSteps.shouldSee(il.get(0).getImage()); - defaultSteps.shouldBeRepresentedAs(il.get(1).getTextRepresentation(), RepresentationPatterns.SUNSET); - defaultSteps.shouldSee(il.get(1).getImage()); - defaultSteps.shouldBeRepresentedAs(il.get(2).getTextRepresentation(), RepresentationPatterns.WIND); - defaultSteps.shouldSee(il.get(2).getImage()); - defaultSteps.shouldBeRepresentedAs(il.get(3).getTextRepresentation(), RepresentationPatterns.HUMIDITY); - defaultSteps.shouldSee(il.get(3).getImage()); + 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 index fee5d97..0470ab5 100644 --- 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 @@ -16,7 +16,7 @@ public class RemoveButtonTest extends BaseWeatherAppTest { @DataProvider public static Object[][] dataProviderNumber() { return new Object[][]{ - {0}, {1} + {0}, {3} }; } @@ -27,8 +27,8 @@ public static Object[][] dataProviderNumber() { @TestCaseId("3") public void shouldSeeNWidgetsAfterOneClickByRemoveButton(int n) { defaultSteps.openMainPageWithCity(CITY); - defaultSteps.clickAddWidgetButtonNTimes(n); - defaultSteps.click(onMainPage().getWeatherWidget().get(n / 2).getActionBlock().getRemoveButton()); + defaultSteps.clickNTimes(onMainPage().getNewWidgetButton(), n); + defaultSteps.click(onMainPage().getWeatherWidgetList().get(n / 2).getActionBlock().getRemoveButton()); defaultSteps.widgetsAmountShouldBe(n); } 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 index 74629af..8a1b55d 100644 --- 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 @@ -1,8 +1,12 @@ 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.TemperatureBlock; +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; @@ -11,23 +15,32 @@ /** * 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() { + public void temperatureBlockTest(int n,RepresentationPatterns pattern) { defaultSteps.openMainPageWithCity(CITY); - TemperatureBlock tb = onMainPage().getWeatherWidget().get(0).getTempBlock(); - defaultSteps.shouldBeRepresentedAs(tb.getRepresentation(), RepresentationPatterns.CELSIUS); - defaultSteps.click(tb); - defaultSteps.shouldBeRepresentedAs(tb.getRepresentation(), RepresentationPatterns.KELVIN); - defaultSteps.click(tb); - defaultSteps.shouldBeRepresentedAs(tb.getRepresentation(), RepresentationPatterns.FAHRENHEIT); - defaultSteps.click(tb); - defaultSteps.shouldBeRepresentedAs(tb.getRepresentation(), RepresentationPatterns.KAIF); - defaultSteps.click(tb); - defaultSteps.shouldBeRepresentedAs(tb.getRepresentation(), RepresentationPatterns.CELSIUS); + 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 index d6151d8..11869dd 100644 --- 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 @@ -31,7 +31,7 @@ public static Object[][] dataProviderCity() { @TestCaseId("2") public void titleShouldBeCity(String city) { defaultSteps.openMainPageWithCity(city); - defaultSteps.cityIntitleShouldBe(onMainPage().getWeatherWidget().get(0).getWidgetTitle(), 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 index e6e3f81..34fea44 100644 --- 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 @@ -15,6 +15,6 @@ public class WeatherImageTest extends BaseWeatherAppTest { @TestCaseId("9") public void widgetImageTest() { defaultSteps.openMainPageWithCity(CITY); - defaultSteps.shouldSee(onMainPage().getWeatherWidget().get(0).getWidgetText().getWeatherImage()); + defaultSteps.shouldSee(onMainPage().getWeatherWidgetList().get(0).getWidgetText().getWeatherImage()); } } diff --git a/steps-module/src/main/java/ru/qatools/school/RepresentationPatterns.java b/steps-module/src/main/java/ru/qatools/school/RepresentationPatterns.java index 00abb3b..1d2aa77 100644 --- a/steps-module/src/main/java/ru/qatools/school/RepresentationPatterns.java +++ b/steps-module/src/main/java/ru/qatools/school/RepresentationPatterns.java @@ -18,8 +18,8 @@ public enum RepresentationPatterns { private final String pattern; - RepresentationPatterns(String s) { - pattern = s; + RepresentationPatterns(String pattern) { + this.pattern = pattern; } public String getPattern() { 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 index c06af7f..71ea860 100644 --- a/steps-module/src/main/java/ru/qatools/school/pages/MainPage.java +++ b/steps-module/src/main/java/ru/qatools/school/pages/MainPage.java @@ -27,7 +27,7 @@ public MainPage(WebDriver driver) { PageFactory.initElements(new HtmlElementDecorator(new HtmlElementLocatorFactory(driver)), this); } - public List getWeatherWidget() { + public List getWeatherWidgetList() { return weatherWidget; } 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 index fb26a69..a90ba0b 100644 --- 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 @@ -3,6 +3,7 @@ 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; @@ -26,9 +27,7 @@ public class WeatherWidget extends HtmlElement { private ActionBlock actions; - @Name("Блок температуры") - @FindBy(css = ".weather-temperature") - private TemperatureBlock tempBlock; + public WidgetText getWidgetText() { @@ -44,10 +43,6 @@ public ActionBlock getActionBlock() { } - public TemperatureBlock getTempBlock() { - return tempBlock; - } - public Rectangle getRect() { return null; diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/TemperatureBlock.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/TemperatureBlock.java similarity index 92% rename from steps-module/src/main/java/ru/qatools/school/pages/blocks/TemperatureBlock.java rename to steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/TemperatureBlock.java index 065729c..6f894e3 100644 --- a/steps-module/src/main/java/ru/qatools/school/pages/blocks/TemperatureBlock.java +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/TemperatureBlock.java @@ -1,4 +1,4 @@ -package ru.qatools.school.pages.blocks; +package ru.qatools.school.pages.blocks.widgetblocks; import org.openqa.selenium.Rectangle; import org.openqa.selenium.support.FindBy; @@ -6,9 +6,7 @@ import ru.yandex.qatools.htmlelements.element.HtmlElement; -/** - * Created by kurau. - */ + public class TemperatureBlock extends HtmlElement { @Name("Значение температуры") 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 index dd445d9..aed9373 100644 --- 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 @@ -21,6 +21,10 @@ public class WidgetText extends HtmlElement { @FindBy(css = ".info-line") private List infoLines; + @Name("Блок температуры") + @FindBy(css = ".weather-temperature") + private TemperatureBlock tempBlock; + public WebElement getWeatherImage() { return weatherImage; } @@ -29,6 +33,10 @@ 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/steps/websteps/DefaultSteps.java b/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java index 430344c..97f0ff0 100644 --- 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 @@ -7,7 +7,6 @@ import ru.qatools.school.pages.MainPage; import ru.qatools.school.pages.blocks.widgetblocks.WidgetTitle; import ru.yandex.qatools.allure.annotations.Step; -import ru.yandex.qatools.htmlelements.element.HtmlElement; import static java.lang.String.format; import static org.hamcrest.core.Is.is; @@ -53,23 +52,25 @@ public void cityIntitleShouldBe(WidgetTitle widgetTitle, String title) { @Step("Количество виджетов должно быть «{0}»") public void widgetsAmountShouldBe(int n) { - assertThat("Количество виджетов должно быть", onMainPage().getWeatherWidget().size(), is(n)); + assertThat("Количество виджетов должно быть", onMainPage().getWeatherWidgetList().size(), is(n)); } - @Step("Жмем кнопку добавить виджет «{0}» раз") - public void clickAddWidgetButtonNTimes(int n) { - while (n-- > 0) { - onMainPage().getNewWidgetButton().click(); - } - } @Step("Жмем на элемент") - public void click(HtmlElement el) { + public void click(WebElement el) { el.click(); } + @Step("Жмем на элемент n раз") + public void clickNTimes(WebElement el, int n) { + while(n-- > 0) { + el.click(); + } + } + + - @Step("Проверяем что представление элемента соответствует паттерну {1}") + @Step("Проверяем что представление элемента {0} соответствует паттерну {1}") public void shouldBeRepresentedAs(String representation, RepresentationPatterns pattern) { assertThat("Представление должно соответствовать регулярному выражение", representation, RegexMatchers.containsPattern(pattern.getPattern())); From 6de5d2b562214b0151633d13ec5a77810c738a48 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 5 May 2016 21:04:18 +0300 Subject: [PATCH 13/15] added readme.md --- readme.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 readme.md diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..e9f9400 --- /dev/null +++ b/readme.md @@ -0,0 +1 @@ +Ссылка на репозиторий с докер файлом: https://github.com/vananos/Docker.git From 307d4038e200e88021630ee5b8ff5e714caec07d Mon Sep 17 00:00:00 2001 From: root Date: Thu, 5 May 2016 21:04:18 +0300 Subject: [PATCH 14/15] added readme.md --- README.md | 4 +--- readme.md | 1 + 2 files changed, 2 insertions(+), 3 deletions(-) create mode 100644 readme.md 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/readme.md b/readme.md new file mode 100644 index 0000000..e9f9400 --- /dev/null +++ b/readme.md @@ -0,0 +1 @@ +Ссылка на репозиторий с докер файлом: https://github.com/vananos/Docker.git From 851e71e82544a480d6708a82a5dde32419d569e0 Mon Sep 17 00:00:00 2001 From: Ivan Date: Thu, 5 May 2016 22:10:48 +0400 Subject: [PATCH 15/15] Delete readme.md --- readme.md | 1 - 1 file changed, 1 deletion(-) delete mode 100644 readme.md diff --git a/readme.md b/readme.md deleted file mode 100644 index e9f9400..0000000 --- a/readme.md +++ /dev/null @@ -1 +0,0 @@ -Ссылка на репозиторий с докер файлом: https://github.com/vananos/Docker.git