From a342d6a1e7bace305fce2b10ee939f10eef15bdb Mon Sep 17 00:00:00 2001 From: Gregory Date: Fri, 15 Apr 2016 00:14:04 +0300 Subject: [PATCH 1/8] added scenario#1 - rewrote all russian names and comms to english - added to block WidgetTitle a WebElement widgetCity which is found by card-title_primary and returns the city of widget - added to block WidgetTitle method getWidgetCity() that returns a widgetCity - added to DefaultSteps a Step called "Should be city, mentioned in URL" which asserts that city mentioned in widget is that one refecenced from URL - added neu test with title "City from widget must match city from URL" and a method public void shouldWidgetCityBeExpectedCity() which opens page, then asserts that cities matches --- .../ru/qatools/school/webtests/WeatherWebTest.java | 10 +++++++++- .../school/pages/blocks/widgetblocks/WidgetTitle.java | 9 +++++++++ .../ru/qatools/school/steps/websteps/DefaultSteps.java | 10 +++++++--- 3 files changed, 25 insertions(+), 4 deletions(-) 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 a4c5a40..38071e3 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 @@ -4,6 +4,7 @@ import org.junit.Rule; import org.junit.Test; import ru.qatools.school.pages.MainPage; +import ru.qatools.school.pages.blocks.widgetblocks.WidgetTitle; import ru.qatools.school.rules.WebDriverRule; import ru.qatools.school.steps.websteps.DefaultSteps; import ru.yandex.qatools.allure.annotations.Title; @@ -23,12 +24,19 @@ public void initSteps() { } @Test - @Title("Должны видеть виджет на главной странице") + @Title("Must see widget on main page") public void shouldSeeWidgetOnMainPage() { defaultSteps.openMainPageWithCity(MOSCOW); defaultSteps.shouldSee(onMainPage().getWeatherWidget().get(0)); } + @Test + @Title("City from widget must match city from URL") + public void shouldWidgetCityBeExpectedCity() { + defaultSteps.openMainPageWithCity(MOSCOW); + defaultSteps.shouldBeWeatherOfRightCity(MOSCOW, onMainPage().getWeatherWidget().get(0).getWidgetTitle().getWidgetCity()); + } + private MainPage onMainPage() { return new MainPage(webDriverRule.getDriver()); } 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 8a88782..d371988 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,6 +1,9 @@ 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; /** @@ -8,6 +11,12 @@ */ public class WidgetTitle extends HtmlElement { + @Name("Название города") + @FindBy(css = ".card-title__primary") + private WebElement widgetCity; + + public WebElement getWidgetCity() {return widgetCity;} + 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 1425a42..5edf8ce 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 @@ -6,6 +6,7 @@ import ru.yandex.qatools.allure.annotations.Step; import static java.lang.String.format; +import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertThat; import static ru.yandex.qatools.htmlelements.matchers.WebElementMatchers.isDisplayed; @@ -22,16 +23,19 @@ public DefaultSteps(WebDriver driver) { this.driver = driver; } - @Step("Открываем главную страницу для города «{0}»") + @Step("Open main page of city «{0}»") public void openMainPageWithCity(String city) { driver.get(format(MAIN_PAGE, city)); } - @Step("Должны видеть на странице «{0}»") + @Step("Should see this element: «{0}»") public void shouldSee(WebElement element) { - assertThat("Должны видеть элемент", element, isDisplayed()); + assertThat("Should see element", element, isDisplayed()); } + @Step("Should be city, mentioned in URL") + public void shouldBeWeatherOfRightCity(String linkCity, WebElement widgetCity){ assertThat("Should be same city, that expected", linkCity, is(widgetCity.getText()));} + private MainPage onMainPage() { return new MainPage(driver); } From 000257afa9e2e1af7b28b30ddb9f38514f138279 Mon Sep 17 00:00:00 2001 From: Gregory Date: Fri, 15 Apr 2016 03:50:50 +0300 Subject: [PATCH 2/8] added scenario #2 (#1 scenario improved) - further translations to english and names improvement - added new block to "MainPage"class called "New weather widget" - it contains webElement with button and a method to get the instance of it - additions to "DefaultSteps": - step "All elements should be seen" which checks if all widgets found in "Widgets list" is visible - step "Push "add new weather widget" button", which clicks the button - step "Push "add new weather widget" button N times", which clicks button N times -step "Exact number of elements should exist", whicj checks if there were created as much widgets as were expected - additions to "WeatherWebTest" test class -added test "Widget must be added after pushing "add new widget" button", whisck checks if amount of widgets were incremented after pushing a button. Amount of pushes is set automatically. --- .../school/webtests/WeatherWebTest.java | 19 ++++++--- .../ru/qatools/school/pages/MainPage.java | 17 ++++++-- .../school/pages/blocks/NewWeatherWidget.java | 30 ++++++++++++++ .../school/pages/blocks/WeatherWidget.java | 6 +-- .../pages/blocks/widgetblocks/WidgetText.java | 2 +- .../school/steps/websteps/DefaultSteps.java | 40 +++++++++++++++++-- 6 files changed, 97 insertions(+), 17 deletions(-) create mode 100644 steps-module/src/main/java/ru/qatools/school/pages/blocks/NewWeatherWidget.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/WeatherWebTest.java index 38071e3..ce24ad1 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 @@ -4,7 +4,6 @@ import org.junit.Rule; import org.junit.Test; import ru.qatools.school.pages.MainPage; -import ru.qatools.school.pages.blocks.widgetblocks.WidgetTitle; import ru.qatools.school.rules.WebDriverRule; import ru.qatools.school.steps.websteps.DefaultSteps; import ru.yandex.qatools.allure.annotations.Title; @@ -24,17 +23,27 @@ public void initSteps() { } @Test - @Title("Must see widget on main page") + @Title("Widget on main page must be seen") public void shouldSeeWidgetOnMainPage() { defaultSteps.openMainPageWithCity(MOSCOW); - defaultSteps.shouldSee(onMainPage().getWeatherWidget().get(0)); + defaultSteps.shouldBeSeen(onMainPage().getWeatherWidgets().get(0)); } @Test @Title("City from widget must match city from URL") - public void shouldWidgetCityBeExpectedCity() { + public void shouldWidgetCityBeLinkCity() { defaultSteps.openMainPageWithCity(MOSCOW); - defaultSteps.shouldBeWeatherOfRightCity(MOSCOW, onMainPage().getWeatherWidget().get(0).getWidgetTitle().getWidgetCity()); + defaultSteps.shouldBeWeatherOfLinkCity(MOSCOW, onMainPage().getWeatherWidgets().get(0).getWidgetTitle().getWidgetCity()); + } + + @Test + @Title("Widget must be added after pushing \"add new widget\" button") + public void shouldWidgetBeAdded() { + defaultSteps.openMainPageWithCity(MOSCOW); + int buttonTimesPushed = 5; + defaultSteps.pushNewWeatherButtonNTimes(buttonTimesPushed); + defaultSteps.shouldExistAsMuchWidgetsAs(buttonTimesPushed + 1, onMainPage().getWeatherWidgets()); + defaultSteps.shouldBeSeen(onMainPage().getWeatherWidgets()); } private MainPage onMainPage() { 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 4d75376..27ef632 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 @@ -4,6 +4,7 @@ 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.NewWeatherWidget; import ru.yandex.qatools.htmlelements.annotations.Name; import ru.yandex.qatools.htmlelements.loader.decorator.HtmlElementDecorator; import ru.yandex.qatools.htmlelements.loader.decorator.HtmlElementLocatorFactory; @@ -19,12 +20,20 @@ public MainPage(WebDriver driver) { PageFactory.initElements(new HtmlElementDecorator(new HtmlElementLocatorFactory(driver)), this); } - @Name("Список виджетов") + @Name("Widgets list") @FindBy(css = ".card.card_md") - private List weatherWidget; + private List weatherWidgets; - public List getWeatherWidget() { - return weatherWidget; + @Name("New weather widget") + @FindBy(css = ".new-card") + private List newWeatherWidget; + + public List getNewWeatherWidget() { + return newWeatherWidget; + } + + public List getWeatherWidgets() { + return weatherWidgets; } } diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/NewWeatherWidget.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/NewWeatherWidget.java new file mode 100644 index 0000000..a0a0ec4 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/NewWeatherWidget.java @@ -0,0 +1,30 @@ +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 Gregory on 4/15/2016. + */ + + +public class NewWeatherWidget extends HtmlElement { + + @Name("New widget button") + @FindBy(css = ".new-card__symbol") + private WebElement newWeatherWidgetButton; + + public WebElement getNewWeatherWidgetButton() { + return newWeatherWidgetButton; + } + + + 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..400f87a 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 @@ -13,15 +13,15 @@ */ public class WeatherWidget extends HtmlElement { - @Name("Заголовок виджета") + @Name("Widget title") @FindBy(css = ".card-title") private WidgetTitle widgetTitle; - @Name("Текст виджета") + @Name("Widget text") @FindBy(css = ".card-text") private WidgetText widgetText; - @Name("Панель управления виджетом") + @Name("Widget actions") @FindBy(css = ".card-actions") private WebElement actions; 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..fbf918e 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 @@ -11,7 +11,7 @@ */ public class WidgetText extends HtmlElement { - @Name("Картинка текущей погоды") + @Name("Current weather image") @FindBy(css = ".weather-image") private WebElement weatherImage; 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 5edf8ce..e67b4e8 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,11 +1,16 @@ package ru.qatools.school.steps.websteps; +import org.hamcrest.CoreMatchers; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import ru.qatools.school.pages.MainPage; +import ru.qatools.school.pages.blocks.WeatherWidget; import ru.yandex.qatools.allure.annotations.Step; +import java.util.List; + import static java.lang.String.format; +import static org.hamcrest.CoreMatchers.everyItem; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertThat; import static ru.yandex.qatools.htmlelements.matchers.WebElementMatchers.isDisplayed; @@ -23,18 +28,45 @@ public DefaultSteps(WebDriver driver) { this.driver = driver; } - @Step("Open main page of city «{0}»") + @Step("Open main page of city given") public void openMainPageWithCity(String city) { driver.get(format(MAIN_PAGE, city)); } - @Step("Should see this element: «{0}»") - public void shouldSee(WebElement element) { + @Step("Element given should be seen") + public void shouldBeSeen(WeatherWidget element) { assertThat("Should see element", element, isDisplayed()); } + @Step("All elements should be seen") + public void shouldBeSeen(List elements) { + elements.forEach(this::shouldBeSeen); + +// assertThat("Should see elements", elements, everyItem(is(isDisplayed()); why not work? + } + + @Step("Exact number of elements should exist") + public void shouldExistAsMuchWidgetsAs(int num, List elements) { + assertThat("Must be " + num + " elements", elements.size(), is(num)); + } + @Step("Should be city, mentioned in URL") - public void shouldBeWeatherOfRightCity(String linkCity, WebElement widgetCity){ assertThat("Should be same city, that expected", linkCity, is(widgetCity.getText()));} + public void shouldBeWeatherOfLinkCity(String linkCity, WebElement widgetCity) { + assertThat("Should be same city, that was in URL", linkCity, is(widgetCity.getText())); + } + + @Step("Push \"add new weather widget\" button") + public void pushNewWeatherButton() { + onMainPage().getNewWeatherWidget().get(0).getNewWeatherWidgetButton().click(); + } + + @Step("Push \"add new weather widget\" button N times") + public void pushNewWeatherButtonNTimes(int n) { + for (int i = 0; i < n; i++) { + pushNewWeatherButton(); + } + } + private MainPage onMainPage() { return new MainPage(driver); From d02198626a321764013418cee5702ab6c640129b Mon Sep 17 00:00:00 2001 From: Gregory Date: Sun, 24 Apr 2016 03:13:58 +0300 Subject: [PATCH 3/8] added new test class for smoke test added "remove" button and actions with it --- .../school/webtests/WeatherWebTest.java | 7 +- .../webtests/WeatherWidgetSmokeTest.java | 74 +++++++++++++++++++ pom.xml | 20 ++--- .../ru/qatools/school/pages/MainPage.java | 16 ++-- ...rWidget.java => NewWeatherWidgetCard.java} | 14 ++-- .../school/pages/blocks/WeatherWidget.java | 7 +- .../blocks/widgetblocks/WidgetActions.java | 23 ++++++ .../school/steps/websteps/DefaultSteps.java | 61 +++++++++++---- 8 files changed, 174 insertions(+), 48 deletions(-) create mode 100644 commons-module/src/test/java/ru/qatools/school/webtests/WeatherWidgetSmokeTest.java rename steps-module/src/main/java/ru/qatools/school/pages/blocks/{NewWeatherWidget.java => NewWeatherWidgetCard.java} (50%) create mode 100644 steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetActions.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/WeatherWebTest.java index ce24ad1..19c2f12 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 @@ -26,14 +26,14 @@ public void initSteps() { @Title("Widget on main page must be seen") public void shouldSeeWidgetOnMainPage() { defaultSteps.openMainPageWithCity(MOSCOW); - defaultSteps.shouldBeSeen(onMainPage().getWeatherWidgets().get(0)); + defaultSteps.shouldSeeWidget(onMainPage().getWeatherWidgetList().get(0)); } @Test @Title("City from widget must match city from URL") public void shouldWidgetCityBeLinkCity() { defaultSteps.openMainPageWithCity(MOSCOW); - defaultSteps.shouldBeWeatherOfLinkCity(MOSCOW, onMainPage().getWeatherWidgets().get(0).getWidgetTitle().getWidgetCity()); + defaultSteps.shouldBeWeatherOfLinkCity(MOSCOW, onMainPage().getWeatherWidgetList().get(0).getWidgetTitle().getWidgetCity()); } @Test @@ -42,8 +42,7 @@ public void shouldWidgetBeAdded() { defaultSteps.openMainPageWithCity(MOSCOW); int buttonTimesPushed = 5; defaultSteps.pushNewWeatherButtonNTimes(buttonTimesPushed); - defaultSteps.shouldExistAsMuchWidgetsAs(buttonTimesPushed + 1, onMainPage().getWeatherWidgets()); - defaultSteps.shouldBeSeen(onMainPage().getWeatherWidgets()); + defaultSteps.shouldSeeNumWidgets(buttonTimesPushed + 1, onMainPage().getWeatherWidgetList()); } private MainPage onMainPage() { diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWidgetSmokeTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWidgetSmokeTest.java new file mode 100644 index 0000000..a000cff --- /dev/null +++ b/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWidgetSmokeTest.java @@ -0,0 +1,74 @@ +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 WeatherWidgetSmokeTest { + + public static final String CITY = "Winnipeg"; + + private MainPage onMainPage() { + return new MainPage(webDriverRule.getDriver()); + } + + private DefaultSteps defaultSteps; + + + @Rule + public WebDriverRule webDriverRule = new WebDriverRule(); + + @Before + public void initSteps() { defaultSteps = new DefaultSteps(webDriverRule.getDriver());} + + @Test + @Title("Should open main page with widget") + @ru.yandex.qatools.allure.annotations.TestCaseId("2") + public void shouldOpenMainPageWithWidget(){ + defaultSteps.openMainPageWithCity(CITY); + defaultSteps.shouldSeeWidget(onMainPage().getWeatherWidgetList().get(0)); + } + + @Test + @Title("Should see \"add new widget\" button") + @ru.yandex.qatools.allure.annotations.TestCaseId("2") + public void shouldSeeAddWidgetButton(){ + defaultSteps.openMainPageWithCity(CITY); + defaultSteps.shouldSeeAddWidgetButton(onMainPage().getNewWeatherWidgetCard().get(0)); + } + + @Test + @Title("Should see \"remove widget\" button") + @ru.yandex.qatools.allure.annotations.TestCaseId("3") + public void shouldSeeRemoveWidgetButton(){ + defaultSteps.openMainPageWithCity(CITY); + defaultSteps.shouldSeeRemoveWidgetButton(onMainPage().getWeatherWidgetList().get(0).getWidgetActions().getRemoveWidgetButton()); + } + + @Test + @Title("\"Add new widget\" button should add widget") + @ru.yandex.qatools.allure.annotations.TestCaseId("4") + public void shouldAddNewWidget(){ + defaultSteps.openMainPageWithCity(CITY); + int buttonPushes = 3; + defaultSteps.pushNewWeatherButtonNTimes(buttonPushes); + defaultSteps.shouldSeeNumWidgets(buttonPushes + 1, onMainPage().getWeatherWidgetList()); + } + + @Test + @Title("Should remove all widgets") + @ru.yandex.qatools.allure.annotations.TestCaseId("5") + public void shouldRemoveWidgets(){ + defaultSteps.openMainPageWithCity(CITY); + int buttonPushes = 1; //why not work on bigger clicks + defaultSteps.pushNewWeatherButtonNTimes(buttonPushes); + defaultSteps.removeNWidgets(buttonPushes+1); + defaultSteps.shouldBeNoWidgets(onMainPage().getWeatherWidgetList()); + } +} diff --git a/pom.xml b/pom.xml index 208222f..bb662e8 100644 --- a/pom.xml +++ b/pom.xml @@ -26,16 +26,19 @@ 1.8.5 - - - junit - junit - 4.12 - - - + + + com.jayway.restassured + rest-assured + 2.9.0 + + + junit + junit + 4.12 + ru.yandex.qatools.allure allure-junit-adaptor @@ -108,5 +111,4 @@ - 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 27ef632..7a1d2a4 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 @@ -4,7 +4,7 @@ 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.NewWeatherWidget; +import ru.qatools.school.pages.blocks.NewWeatherWidgetCard; import ru.yandex.qatools.htmlelements.annotations.Name; import ru.yandex.qatools.htmlelements.loader.decorator.HtmlElementDecorator; import ru.yandex.qatools.htmlelements.loader.decorator.HtmlElementLocatorFactory; @@ -22,18 +22,18 @@ public MainPage(WebDriver driver) { @Name("Widgets list") @FindBy(css = ".card.card_md") - private List weatherWidgets; + private List weatherWidgetList; - @Name("New weather widget") + @Name("New weather widget card") @FindBy(css = ".new-card") - private List newWeatherWidget; + private List newWeatherWidgetCard; - public List getNewWeatherWidget() { - return newWeatherWidget; + public List getNewWeatherWidgetCard() { + return newWeatherWidgetCard; } - public List getWeatherWidgets() { - return weatherWidgets; + public List getWeatherWidgetList() { + return weatherWidgetList; } } diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/NewWeatherWidget.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/NewWeatherWidgetCard.java similarity index 50% rename from steps-module/src/main/java/ru/qatools/school/pages/blocks/NewWeatherWidget.java rename to steps-module/src/main/java/ru/qatools/school/pages/blocks/NewWeatherWidgetCard.java index a0a0ec4..d3912ef 100644 --- a/steps-module/src/main/java/ru/qatools/school/pages/blocks/NewWeatherWidget.java +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/NewWeatherWidgetCard.java @@ -1,11 +1,9 @@ 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.Button; import ru.yandex.qatools.htmlelements.element.HtmlElement; /** @@ -13,14 +11,14 @@ */ -public class NewWeatherWidget extends HtmlElement { +public class NewWeatherWidgetCard extends HtmlElement { - @Name("New widget button") + @Name("Add widget button") @FindBy(css = ".new-card__symbol") - private WebElement newWeatherWidgetButton; + private Button addWidgetButton; - public WebElement getNewWeatherWidgetButton() { - return newWeatherWidgetButton; + public Button getAddWidgetButton() { + return addWidgetButton; } 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 400f87a..373ea3b 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.WebElement; import org.openqa.selenium.support.FindBy; +import ru.qatools.school.pages.blocks.widgetblocks.WidgetActions; import ru.qatools.school.pages.blocks.widgetblocks.WidgetText; import ru.qatools.school.pages.blocks.widgetblocks.WidgetTitle; import ru.yandex.qatools.htmlelements.annotations.Name; @@ -23,7 +24,7 @@ public class WeatherWidget extends HtmlElement { @Name("Widget actions") @FindBy(css = ".card-actions") - private WebElement actions; + private WidgetActions widgetActions; public WidgetText getWidgetText() { return widgetText; @@ -33,8 +34,8 @@ public WidgetTitle getWidgetTitle() { return widgetTitle; } - public WebElement getActions() { - return actions; + public WidgetActions getWidgetActions() { + return widgetActions; } public Rectangle getRect() { diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetActions.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetActions.java new file mode 100644 index 0000000..bb194ab --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetActions.java @@ -0,0 +1,23 @@ +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.Button; +import ru.yandex.qatools.htmlelements.element.HtmlElement; + +public class WidgetActions extends HtmlElement { + + @Name("Remove widget button") + @FindBy(css = ".remove-card.btn.btn-default") + private WebElement removeWidgetButton; + + public WebElement getRemoveWidgetButton() { + return removeWidgetButton; + } + + public Rectangle getRect() { + return null; + } +} \ No newline at end of file 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 e67b4e8..4d04a30 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,17 +1,20 @@ package ru.qatools.school.steps.websteps; -import org.hamcrest.CoreMatchers; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import ru.qatools.school.pages.MainPage; +import ru.qatools.school.pages.blocks.NewWeatherWidgetCard; import ru.qatools.school.pages.blocks.WeatherWidget; import ru.yandex.qatools.allure.annotations.Step; +import ru.yandex.qatools.htmlelements.element.Button; +import java.util.ArrayList; import java.util.List; import static java.lang.String.format; -import static org.hamcrest.CoreMatchers.everyItem; +import static org.hamcrest.core.Every.everyItem; import static org.hamcrest.core.Is.is; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import static ru.yandex.qatools.htmlelements.matchers.WebElementMatchers.isDisplayed; @@ -28,45 +31,71 @@ public DefaultSteps(WebDriver driver) { this.driver = driver; } - @Step("Open main page of city given") + @Step("Open main page with weather of {0}") public void openMainPageWithCity(String city) { driver.get(format(MAIN_PAGE, city)); } - @Step("Element given should be seen") - public void shouldBeSeen(WeatherWidget element) { + @Step("Should see weather widget") + public void shouldSeeWidget(WeatherWidget element) { assertThat("Should see element", element, isDisplayed()); } - @Step("All elements should be seen") - public void shouldBeSeen(List elements) { - elements.forEach(this::shouldBeSeen); + @Step("Should see \"add new widget\" button") + public void shouldSeeAddWidgetButton(NewWeatherWidgetCard element) { + assertThat("Should see button", element, isDisplayed()); + } + + @Step("Should see \"remove widget\" button") + public void shouldSeeRemoveWidgetButton(WebElement button) { + assertThat("Should see button", button, isDisplayed()); + } -// assertThat("Should see elements", elements, everyItem(is(isDisplayed()); why not work? + @Step("Should see all widgets") + public void shouldSeeWidget(List elements) { + assertThat("Should see elements", new ArrayList<>(elements), everyItem(isDisplayed())); } - @Step("Exact number of elements should exist") - public void shouldExistAsMuchWidgetsAs(int num, List elements) { + @Step("Should see {0} widgets") + public void shouldSeeNumWidgets(int num, List elements) { assertThat("Must be " + num + " elements", elements.size(), is(num)); + shouldSeeWidget(elements); } - @Step("Should be city, mentioned in URL") + @Step("Widget city should be {0}") public void shouldBeWeatherOfLinkCity(String linkCity, WebElement widgetCity) { assertThat("Should be same city, that was in URL", linkCity, is(widgetCity.getText())); } @Step("Push \"add new weather widget\" button") - public void pushNewWeatherButton() { - onMainPage().getNewWeatherWidget().get(0).getNewWeatherWidgetButton().click(); + public void pushAddWidgetButton() { + onMainPage().getNewWeatherWidgetCard().get(0).getAddWidgetButton().click(); + } + + @Step("Push \"remove widget\" button") + public void pushRemoveWidgetButton() { + onMainPage().getWeatherWidgetList().get(0).getWidgetActions().getRemoveWidgetButton().click(); } - @Step("Push \"add new weather widget\" button N times") + @Step("Remove {0} first widgets") + public void removeNWidgets(int n){ + for(int i=0;i widgets){ + assertEquals(0,widgets.size()); + } + private MainPage onMainPage() { return new MainPage(driver); From 2a96b24ed59a1fff9fd7c6581e5fd9f2979bb6b3 Mon Sep 17 00:00:00 2001 From: Gregory Date: Fri, 15 Apr 2016 00:14:04 +0300 Subject: [PATCH 4/8] added scenario#1 - rewrote all russian names and comms to english - added to block WidgetTitle a WebElement widgetCity which is found by card-title_primary and returns the city of widget - added to block WidgetTitle method getWidgetCity() that returns a widgetCity - added to DefaultSteps a Step called "Should be city, mentioned in URL" which asserts that city mentioned in widget is that one refecenced from URL - added neu test with title "City from widget must match city from URL" and a method public void shouldWidgetCityBeExpectedCity() which opens page, then asserts that cities matches --- .../ru/qatools/school/webtests/WeatherWebTest.java | 10 +++++++++- .../school/pages/blocks/widgetblocks/WidgetTitle.java | 9 +++++++++ .../ru/qatools/school/steps/websteps/DefaultSteps.java | 10 +++++++--- 3 files changed, 25 insertions(+), 4 deletions(-) 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 a4c5a40..38071e3 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 @@ -4,6 +4,7 @@ import org.junit.Rule; import org.junit.Test; import ru.qatools.school.pages.MainPage; +import ru.qatools.school.pages.blocks.widgetblocks.WidgetTitle; import ru.qatools.school.rules.WebDriverRule; import ru.qatools.school.steps.websteps.DefaultSteps; import ru.yandex.qatools.allure.annotations.Title; @@ -23,12 +24,19 @@ public void initSteps() { } @Test - @Title("Должны видеть виджет на главной странице") + @Title("Must see widget on main page") public void shouldSeeWidgetOnMainPage() { defaultSteps.openMainPageWithCity(MOSCOW); defaultSteps.shouldSee(onMainPage().getWeatherWidget().get(0)); } + @Test + @Title("City from widget must match city from URL") + public void shouldWidgetCityBeExpectedCity() { + defaultSteps.openMainPageWithCity(MOSCOW); + defaultSteps.shouldBeWeatherOfRightCity(MOSCOW, onMainPage().getWeatherWidget().get(0).getWidgetTitle().getWidgetCity()); + } + private MainPage onMainPage() { return new MainPage(webDriverRule.getDriver()); } 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 8a88782..d371988 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,6 +1,9 @@ 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; /** @@ -8,6 +11,12 @@ */ public class WidgetTitle extends HtmlElement { + @Name("Название города") + @FindBy(css = ".card-title__primary") + private WebElement widgetCity; + + public WebElement getWidgetCity() {return widgetCity;} + 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 1425a42..5edf8ce 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 @@ -6,6 +6,7 @@ import ru.yandex.qatools.allure.annotations.Step; import static java.lang.String.format; +import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertThat; import static ru.yandex.qatools.htmlelements.matchers.WebElementMatchers.isDisplayed; @@ -22,16 +23,19 @@ public DefaultSteps(WebDriver driver) { this.driver = driver; } - @Step("Открываем главную страницу для города «{0}»") + @Step("Open main page of city «{0}»") public void openMainPageWithCity(String city) { driver.get(format(MAIN_PAGE, city)); } - @Step("Должны видеть на странице «{0}»") + @Step("Should see this element: «{0}»") public void shouldSee(WebElement element) { - assertThat("Должны видеть элемент", element, isDisplayed()); + assertThat("Should see element", element, isDisplayed()); } + @Step("Should be city, mentioned in URL") + public void shouldBeWeatherOfRightCity(String linkCity, WebElement widgetCity){ assertThat("Should be same city, that expected", linkCity, is(widgetCity.getText()));} + private MainPage onMainPage() { return new MainPage(driver); } From e837120b000829b638ea13b60d0f4f7883911797 Mon Sep 17 00:00:00 2001 From: Gregory Date: Fri, 15 Apr 2016 03:50:50 +0300 Subject: [PATCH 5/8] added scenario #2 (#1 scenario improved) - further translations to english and names improvement - added new block to "MainPage"class called "New weather widget" - it contains webElement with button and a method to get the instance of it - additions to "DefaultSteps": - step "All elements should be seen" which checks if all widgets found in "Widgets list" is visible - step "Push "add new weather widget" button", which clicks the button - step "Push "add new weather widget" button N times", which clicks button N times -step "Exact number of elements should exist", whicj checks if there were created as much widgets as were expected - additions to "WeatherWebTest" test class -added test "Widget must be added after pushing "add new widget" button", whisck checks if amount of widgets were incremented after pushing a button. Amount of pushes is set automatically. --- .../school/webtests/WeatherWebTest.java | 19 ++++++--- .../ru/qatools/school/pages/MainPage.java | 17 ++++++-- .../school/pages/blocks/NewWeatherWidget.java | 30 ++++++++++++++ .../school/pages/blocks/WeatherWidget.java | 6 +-- .../pages/blocks/widgetblocks/WidgetText.java | 2 +- .../school/steps/websteps/DefaultSteps.java | 40 +++++++++++++++++-- 6 files changed, 97 insertions(+), 17 deletions(-) create mode 100644 steps-module/src/main/java/ru/qatools/school/pages/blocks/NewWeatherWidget.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/WeatherWebTest.java index 38071e3..ce24ad1 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 @@ -4,7 +4,6 @@ import org.junit.Rule; import org.junit.Test; import ru.qatools.school.pages.MainPage; -import ru.qatools.school.pages.blocks.widgetblocks.WidgetTitle; import ru.qatools.school.rules.WebDriverRule; import ru.qatools.school.steps.websteps.DefaultSteps; import ru.yandex.qatools.allure.annotations.Title; @@ -24,17 +23,27 @@ public void initSteps() { } @Test - @Title("Must see widget on main page") + @Title("Widget on main page must be seen") public void shouldSeeWidgetOnMainPage() { defaultSteps.openMainPageWithCity(MOSCOW); - defaultSteps.shouldSee(onMainPage().getWeatherWidget().get(0)); + defaultSteps.shouldBeSeen(onMainPage().getWeatherWidgets().get(0)); } @Test @Title("City from widget must match city from URL") - public void shouldWidgetCityBeExpectedCity() { + public void shouldWidgetCityBeLinkCity() { defaultSteps.openMainPageWithCity(MOSCOW); - defaultSteps.shouldBeWeatherOfRightCity(MOSCOW, onMainPage().getWeatherWidget().get(0).getWidgetTitle().getWidgetCity()); + defaultSteps.shouldBeWeatherOfLinkCity(MOSCOW, onMainPage().getWeatherWidgets().get(0).getWidgetTitle().getWidgetCity()); + } + + @Test + @Title("Widget must be added after pushing \"add new widget\" button") + public void shouldWidgetBeAdded() { + defaultSteps.openMainPageWithCity(MOSCOW); + int buttonTimesPushed = 5; + defaultSteps.pushNewWeatherButtonNTimes(buttonTimesPushed); + defaultSteps.shouldExistAsMuchWidgetsAs(buttonTimesPushed + 1, onMainPage().getWeatherWidgets()); + defaultSteps.shouldBeSeen(onMainPage().getWeatherWidgets()); } private MainPage onMainPage() { 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 4d75376..27ef632 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 @@ -4,6 +4,7 @@ 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.NewWeatherWidget; import ru.yandex.qatools.htmlelements.annotations.Name; import ru.yandex.qatools.htmlelements.loader.decorator.HtmlElementDecorator; import ru.yandex.qatools.htmlelements.loader.decorator.HtmlElementLocatorFactory; @@ -19,12 +20,20 @@ public MainPage(WebDriver driver) { PageFactory.initElements(new HtmlElementDecorator(new HtmlElementLocatorFactory(driver)), this); } - @Name("Список виджетов") + @Name("Widgets list") @FindBy(css = ".card.card_md") - private List weatherWidget; + private List weatherWidgets; - public List getWeatherWidget() { - return weatherWidget; + @Name("New weather widget") + @FindBy(css = ".new-card") + private List newWeatherWidget; + + public List getNewWeatherWidget() { + return newWeatherWidget; + } + + public List getWeatherWidgets() { + return weatherWidgets; } } diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/NewWeatherWidget.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/NewWeatherWidget.java new file mode 100644 index 0000000..a0a0ec4 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/NewWeatherWidget.java @@ -0,0 +1,30 @@ +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 Gregory on 4/15/2016. + */ + + +public class NewWeatherWidget extends HtmlElement { + + @Name("New widget button") + @FindBy(css = ".new-card__symbol") + private WebElement newWeatherWidgetButton; + + public WebElement getNewWeatherWidgetButton() { + return newWeatherWidgetButton; + } + + + 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..400f87a 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 @@ -13,15 +13,15 @@ */ public class WeatherWidget extends HtmlElement { - @Name("Заголовок виджета") + @Name("Widget title") @FindBy(css = ".card-title") private WidgetTitle widgetTitle; - @Name("Текст виджета") + @Name("Widget text") @FindBy(css = ".card-text") private WidgetText widgetText; - @Name("Панель управления виджетом") + @Name("Widget actions") @FindBy(css = ".card-actions") private WebElement actions; 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..fbf918e 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 @@ -11,7 +11,7 @@ */ public class WidgetText extends HtmlElement { - @Name("Картинка текущей погоды") + @Name("Current weather image") @FindBy(css = ".weather-image") private WebElement weatherImage; 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 5edf8ce..e67b4e8 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,11 +1,16 @@ package ru.qatools.school.steps.websteps; +import org.hamcrest.CoreMatchers; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import ru.qatools.school.pages.MainPage; +import ru.qatools.school.pages.blocks.WeatherWidget; import ru.yandex.qatools.allure.annotations.Step; +import java.util.List; + import static java.lang.String.format; +import static org.hamcrest.CoreMatchers.everyItem; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertThat; import static ru.yandex.qatools.htmlelements.matchers.WebElementMatchers.isDisplayed; @@ -23,18 +28,45 @@ public DefaultSteps(WebDriver driver) { this.driver = driver; } - @Step("Open main page of city «{0}»") + @Step("Open main page of city given") public void openMainPageWithCity(String city) { driver.get(format(MAIN_PAGE, city)); } - @Step("Should see this element: «{0}»") - public void shouldSee(WebElement element) { + @Step("Element given should be seen") + public void shouldBeSeen(WeatherWidget element) { assertThat("Should see element", element, isDisplayed()); } + @Step("All elements should be seen") + public void shouldBeSeen(List elements) { + elements.forEach(this::shouldBeSeen); + +// assertThat("Should see elements", elements, everyItem(is(isDisplayed()); why not work? + } + + @Step("Exact number of elements should exist") + public void shouldExistAsMuchWidgetsAs(int num, List elements) { + assertThat("Must be " + num + " elements", elements.size(), is(num)); + } + @Step("Should be city, mentioned in URL") - public void shouldBeWeatherOfRightCity(String linkCity, WebElement widgetCity){ assertThat("Should be same city, that expected", linkCity, is(widgetCity.getText()));} + public void shouldBeWeatherOfLinkCity(String linkCity, WebElement widgetCity) { + assertThat("Should be same city, that was in URL", linkCity, is(widgetCity.getText())); + } + + @Step("Push \"add new weather widget\" button") + public void pushNewWeatherButton() { + onMainPage().getNewWeatherWidget().get(0).getNewWeatherWidgetButton().click(); + } + + @Step("Push \"add new weather widget\" button N times") + public void pushNewWeatherButtonNTimes(int n) { + for (int i = 0; i < n; i++) { + pushNewWeatherButton(); + } + } + private MainPage onMainPage() { return new MainPage(driver); From 10331c5262bd76dd9a3bc0962f170a6abab18758 Mon Sep 17 00:00:00 2001 From: Gregory Date: Sun, 24 Apr 2016 03:13:58 +0300 Subject: [PATCH 6/8] added new test class for smoke test added "remove" button and actions with it --- .../school/webtests/WeatherWebTest.java | 7 +- .../webtests/WeatherWidgetSmokeTest.java | 74 +++++++++++++++++++ pom.xml | 2 +- .../ru/qatools/school/pages/MainPage.java | 16 ++-- ...rWidget.java => NewWeatherWidgetCard.java} | 14 ++-- .../school/pages/blocks/WeatherWidget.java | 7 +- .../blocks/widgetblocks/WidgetActions.java | 23 ++++++ .../school/steps/websteps/DefaultSteps.java | 61 +++++++++++---- 8 files changed, 164 insertions(+), 40 deletions(-) create mode 100644 commons-module/src/test/java/ru/qatools/school/webtests/WeatherWidgetSmokeTest.java rename steps-module/src/main/java/ru/qatools/school/pages/blocks/{NewWeatherWidget.java => NewWeatherWidgetCard.java} (50%) create mode 100644 steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetActions.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/WeatherWebTest.java index ce24ad1..19c2f12 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 @@ -26,14 +26,14 @@ public void initSteps() { @Title("Widget on main page must be seen") public void shouldSeeWidgetOnMainPage() { defaultSteps.openMainPageWithCity(MOSCOW); - defaultSteps.shouldBeSeen(onMainPage().getWeatherWidgets().get(0)); + defaultSteps.shouldSeeWidget(onMainPage().getWeatherWidgetList().get(0)); } @Test @Title("City from widget must match city from URL") public void shouldWidgetCityBeLinkCity() { defaultSteps.openMainPageWithCity(MOSCOW); - defaultSteps.shouldBeWeatherOfLinkCity(MOSCOW, onMainPage().getWeatherWidgets().get(0).getWidgetTitle().getWidgetCity()); + defaultSteps.shouldBeWeatherOfLinkCity(MOSCOW, onMainPage().getWeatherWidgetList().get(0).getWidgetTitle().getWidgetCity()); } @Test @@ -42,8 +42,7 @@ public void shouldWidgetBeAdded() { defaultSteps.openMainPageWithCity(MOSCOW); int buttonTimesPushed = 5; defaultSteps.pushNewWeatherButtonNTimes(buttonTimesPushed); - defaultSteps.shouldExistAsMuchWidgetsAs(buttonTimesPushed + 1, onMainPage().getWeatherWidgets()); - defaultSteps.shouldBeSeen(onMainPage().getWeatherWidgets()); + defaultSteps.shouldSeeNumWidgets(buttonTimesPushed + 1, onMainPage().getWeatherWidgetList()); } private MainPage onMainPage() { diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWidgetSmokeTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWidgetSmokeTest.java new file mode 100644 index 0000000..a000cff --- /dev/null +++ b/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWidgetSmokeTest.java @@ -0,0 +1,74 @@ +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 WeatherWidgetSmokeTest { + + public static final String CITY = "Winnipeg"; + + private MainPage onMainPage() { + return new MainPage(webDriverRule.getDriver()); + } + + private DefaultSteps defaultSteps; + + + @Rule + public WebDriverRule webDriverRule = new WebDriverRule(); + + @Before + public void initSteps() { defaultSteps = new DefaultSteps(webDriverRule.getDriver());} + + @Test + @Title("Should open main page with widget") + @ru.yandex.qatools.allure.annotations.TestCaseId("2") + public void shouldOpenMainPageWithWidget(){ + defaultSteps.openMainPageWithCity(CITY); + defaultSteps.shouldSeeWidget(onMainPage().getWeatherWidgetList().get(0)); + } + + @Test + @Title("Should see \"add new widget\" button") + @ru.yandex.qatools.allure.annotations.TestCaseId("2") + public void shouldSeeAddWidgetButton(){ + defaultSteps.openMainPageWithCity(CITY); + defaultSteps.shouldSeeAddWidgetButton(onMainPage().getNewWeatherWidgetCard().get(0)); + } + + @Test + @Title("Should see \"remove widget\" button") + @ru.yandex.qatools.allure.annotations.TestCaseId("3") + public void shouldSeeRemoveWidgetButton(){ + defaultSteps.openMainPageWithCity(CITY); + defaultSteps.shouldSeeRemoveWidgetButton(onMainPage().getWeatherWidgetList().get(0).getWidgetActions().getRemoveWidgetButton()); + } + + @Test + @Title("\"Add new widget\" button should add widget") + @ru.yandex.qatools.allure.annotations.TestCaseId("4") + public void shouldAddNewWidget(){ + defaultSteps.openMainPageWithCity(CITY); + int buttonPushes = 3; + defaultSteps.pushNewWeatherButtonNTimes(buttonPushes); + defaultSteps.shouldSeeNumWidgets(buttonPushes + 1, onMainPage().getWeatherWidgetList()); + } + + @Test + @Title("Should remove all widgets") + @ru.yandex.qatools.allure.annotations.TestCaseId("5") + public void shouldRemoveWidgets(){ + defaultSteps.openMainPageWithCity(CITY); + int buttonPushes = 1; //why not work on bigger clicks + defaultSteps.pushNewWeatherButtonNTimes(buttonPushes); + defaultSteps.removeNWidgets(buttonPushes+1); + defaultSteps.shouldBeNoWidgets(onMainPage().getWeatherWidgetList()); + } +} diff --git a/pom.xml b/pom.xml index a32202a..a6da03d 100644 --- a/pom.xml +++ b/pom.xml @@ -43,7 +43,7 @@ rest-assured 2.9.0 - + ru.yandex.qatools.allure allure-junit-adaptor 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 27ef632..7a1d2a4 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 @@ -4,7 +4,7 @@ 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.NewWeatherWidget; +import ru.qatools.school.pages.blocks.NewWeatherWidgetCard; import ru.yandex.qatools.htmlelements.annotations.Name; import ru.yandex.qatools.htmlelements.loader.decorator.HtmlElementDecorator; import ru.yandex.qatools.htmlelements.loader.decorator.HtmlElementLocatorFactory; @@ -22,18 +22,18 @@ public MainPage(WebDriver driver) { @Name("Widgets list") @FindBy(css = ".card.card_md") - private List weatherWidgets; + private List weatherWidgetList; - @Name("New weather widget") + @Name("New weather widget card") @FindBy(css = ".new-card") - private List newWeatherWidget; + private List newWeatherWidgetCard; - public List getNewWeatherWidget() { - return newWeatherWidget; + public List getNewWeatherWidgetCard() { + return newWeatherWidgetCard; } - public List getWeatherWidgets() { - return weatherWidgets; + public List getWeatherWidgetList() { + return weatherWidgetList; } } diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/NewWeatherWidget.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/NewWeatherWidgetCard.java similarity index 50% rename from steps-module/src/main/java/ru/qatools/school/pages/blocks/NewWeatherWidget.java rename to steps-module/src/main/java/ru/qatools/school/pages/blocks/NewWeatherWidgetCard.java index a0a0ec4..d3912ef 100644 --- a/steps-module/src/main/java/ru/qatools/school/pages/blocks/NewWeatherWidget.java +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/NewWeatherWidgetCard.java @@ -1,11 +1,9 @@ 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.Button; import ru.yandex.qatools.htmlelements.element.HtmlElement; /** @@ -13,14 +11,14 @@ */ -public class NewWeatherWidget extends HtmlElement { +public class NewWeatherWidgetCard extends HtmlElement { - @Name("New widget button") + @Name("Add widget button") @FindBy(css = ".new-card__symbol") - private WebElement newWeatherWidgetButton; + private Button addWidgetButton; - public WebElement getNewWeatherWidgetButton() { - return newWeatherWidgetButton; + public Button getAddWidgetButton() { + return addWidgetButton; } 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 400f87a..373ea3b 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.WebElement; import org.openqa.selenium.support.FindBy; +import ru.qatools.school.pages.blocks.widgetblocks.WidgetActions; import ru.qatools.school.pages.blocks.widgetblocks.WidgetText; import ru.qatools.school.pages.blocks.widgetblocks.WidgetTitle; import ru.yandex.qatools.htmlelements.annotations.Name; @@ -23,7 +24,7 @@ public class WeatherWidget extends HtmlElement { @Name("Widget actions") @FindBy(css = ".card-actions") - private WebElement actions; + private WidgetActions widgetActions; public WidgetText getWidgetText() { return widgetText; @@ -33,8 +34,8 @@ public WidgetTitle getWidgetTitle() { return widgetTitle; } - public WebElement getActions() { - return actions; + public WidgetActions getWidgetActions() { + return widgetActions; } public Rectangle getRect() { diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetActions.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetActions.java new file mode 100644 index 0000000..bb194ab --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetActions.java @@ -0,0 +1,23 @@ +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.Button; +import ru.yandex.qatools.htmlelements.element.HtmlElement; + +public class WidgetActions extends HtmlElement { + + @Name("Remove widget button") + @FindBy(css = ".remove-card.btn.btn-default") + private WebElement removeWidgetButton; + + public WebElement getRemoveWidgetButton() { + return removeWidgetButton; + } + + public Rectangle getRect() { + return null; + } +} \ No newline at end of file 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 e67b4e8..4d04a30 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,17 +1,20 @@ package ru.qatools.school.steps.websteps; -import org.hamcrest.CoreMatchers; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import ru.qatools.school.pages.MainPage; +import ru.qatools.school.pages.blocks.NewWeatherWidgetCard; import ru.qatools.school.pages.blocks.WeatherWidget; import ru.yandex.qatools.allure.annotations.Step; +import ru.yandex.qatools.htmlelements.element.Button; +import java.util.ArrayList; import java.util.List; import static java.lang.String.format; -import static org.hamcrest.CoreMatchers.everyItem; +import static org.hamcrest.core.Every.everyItem; import static org.hamcrest.core.Is.is; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import static ru.yandex.qatools.htmlelements.matchers.WebElementMatchers.isDisplayed; @@ -28,45 +31,71 @@ public DefaultSteps(WebDriver driver) { this.driver = driver; } - @Step("Open main page of city given") + @Step("Open main page with weather of {0}") public void openMainPageWithCity(String city) { driver.get(format(MAIN_PAGE, city)); } - @Step("Element given should be seen") - public void shouldBeSeen(WeatherWidget element) { + @Step("Should see weather widget") + public void shouldSeeWidget(WeatherWidget element) { assertThat("Should see element", element, isDisplayed()); } - @Step("All elements should be seen") - public void shouldBeSeen(List elements) { - elements.forEach(this::shouldBeSeen); + @Step("Should see \"add new widget\" button") + public void shouldSeeAddWidgetButton(NewWeatherWidgetCard element) { + assertThat("Should see button", element, isDisplayed()); + } + + @Step("Should see \"remove widget\" button") + public void shouldSeeRemoveWidgetButton(WebElement button) { + assertThat("Should see button", button, isDisplayed()); + } -// assertThat("Should see elements", elements, everyItem(is(isDisplayed()); why not work? + @Step("Should see all widgets") + public void shouldSeeWidget(List elements) { + assertThat("Should see elements", new ArrayList<>(elements), everyItem(isDisplayed())); } - @Step("Exact number of elements should exist") - public void shouldExistAsMuchWidgetsAs(int num, List elements) { + @Step("Should see {0} widgets") + public void shouldSeeNumWidgets(int num, List elements) { assertThat("Must be " + num + " elements", elements.size(), is(num)); + shouldSeeWidget(elements); } - @Step("Should be city, mentioned in URL") + @Step("Widget city should be {0}") public void shouldBeWeatherOfLinkCity(String linkCity, WebElement widgetCity) { assertThat("Should be same city, that was in URL", linkCity, is(widgetCity.getText())); } @Step("Push \"add new weather widget\" button") - public void pushNewWeatherButton() { - onMainPage().getNewWeatherWidget().get(0).getNewWeatherWidgetButton().click(); + public void pushAddWidgetButton() { + onMainPage().getNewWeatherWidgetCard().get(0).getAddWidgetButton().click(); + } + + @Step("Push \"remove widget\" button") + public void pushRemoveWidgetButton() { + onMainPage().getWeatherWidgetList().get(0).getWidgetActions().getRemoveWidgetButton().click(); } - @Step("Push \"add new weather widget\" button N times") + @Step("Remove {0} first widgets") + public void removeNWidgets(int n){ + for(int i=0;i widgets){ + assertEquals(0,widgets.size()); + } + private MainPage onMainPage() { return new MainPage(driver); From f6c57fab3f21ca61584d533651d29d1fa552429a Mon Sep 17 00:00:00 2001 From: Gregory Date: Sun, 24 Apr 2016 15:16:42 +0300 Subject: [PATCH 7/8] added main autotests for smoke case and annotations for palma --- .../school/webtests/WeatherWidgetSmokeTest.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWidgetSmokeTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWidgetSmokeTest.java index a000cff..3f482cf 100644 --- a/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWidgetSmokeTest.java +++ b/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWidgetSmokeTest.java @@ -6,7 +6,9 @@ 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 ru.yandex.qatools.allure.annotations.TestCaseId; @@ -20,6 +22,8 @@ private MainPage onMainPage() { private DefaultSteps defaultSteps; + @Rule + public TPInformerRule tms = new TPInformerRule("thebaldsoprano"); @Rule public WebDriverRule webDriverRule = new WebDriverRule(); @@ -29,7 +33,7 @@ private MainPage onMainPage() { @Test @Title("Should open main page with widget") - @ru.yandex.qatools.allure.annotations.TestCaseId("2") + @TestCaseId("2") public void shouldOpenMainPageWithWidget(){ defaultSteps.openMainPageWithCity(CITY); defaultSteps.shouldSeeWidget(onMainPage().getWeatherWidgetList().get(0)); @@ -37,7 +41,7 @@ public void shouldOpenMainPageWithWidget(){ @Test @Title("Should see \"add new widget\" button") - @ru.yandex.qatools.allure.annotations.TestCaseId("2") + @TestCaseId("3") public void shouldSeeAddWidgetButton(){ defaultSteps.openMainPageWithCity(CITY); defaultSteps.shouldSeeAddWidgetButton(onMainPage().getNewWeatherWidgetCard().get(0)); @@ -45,7 +49,7 @@ public void shouldSeeAddWidgetButton(){ @Test @Title("Should see \"remove widget\" button") - @ru.yandex.qatools.allure.annotations.TestCaseId("3") + @TestCaseId("4") public void shouldSeeRemoveWidgetButton(){ defaultSteps.openMainPageWithCity(CITY); defaultSteps.shouldSeeRemoveWidgetButton(onMainPage().getWeatherWidgetList().get(0).getWidgetActions().getRemoveWidgetButton()); @@ -53,7 +57,7 @@ public void shouldSeeRemoveWidgetButton(){ @Test @Title("\"Add new widget\" button should add widget") - @ru.yandex.qatools.allure.annotations.TestCaseId("4") + @TestCaseId("5") public void shouldAddNewWidget(){ defaultSteps.openMainPageWithCity(CITY); int buttonPushes = 3; @@ -63,7 +67,7 @@ public void shouldAddNewWidget(){ @Test @Title("Should remove all widgets") - @ru.yandex.qatools.allure.annotations.TestCaseId("5") + @TestCaseId("6") public void shouldRemoveWidgets(){ defaultSteps.openMainPageWithCity(CITY); int buttonPushes = 1; //why not work on bigger clicks From a2edfcb1083d8a06b7b35a64713c70f9f4969083 Mon Sep 17 00:00:00 2001 From: Gregory Date: Tue, 10 May 2016 00:18:50 +0300 Subject: [PATCH 8/8] added link to repo with Dockerfile --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 69e007d..cf0f045 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,7 @@ # Practice of automation school 2016 See all info in repo [autoschool/autoschool.github.io](https://github.com/autoschool/autoschool.github.io) + +HERE link for my repo with copy of Dockerfile + +https://github.com/theBaldSoprano/ubuntuWithCurlGit