From 0002484f7b9f5fe7b92de6ccf21065a7f0d2d172 Mon Sep 17 00:00:00 2001 From: OneginES Date: Fri, 15 Apr 2016 02:50:02 +0300 Subject: [PATCH 01/26] Two web autotests --- .../school/webtests/WeatherWebTest.java | 28 +++++++++++++++++ .../ru/qatools/school/pages/MainPage.java | 9 ++++++ .../blocks/widgetblocks/WidgetTitle.java | 11 +++++++ .../school/steps/websteps/DefaultSteps.java | 30 +++++++++++++++++++ 4 files changed, 78 insertions(+) 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..d6d349a 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 @@ -1,6 +1,7 @@ package ru.qatools.school.webtests; import org.junit.Before; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import ru.qatools.school.pages.MainPage; @@ -11,6 +12,7 @@ public class WeatherWebTest { public static final String MOSCOW = "Moscow"; + public static final String PETERSBURG = "Saint Petersburg"; private DefaultSteps defaultSteps; @@ -29,6 +31,32 @@ public void shouldSeeWidgetOnMainPage() { defaultSteps.shouldSee(onMainPage().getWeatherWidget().get(0)); } + @Test + @Title("Должны видеть виджет Москвы") + public void shouldSeeMoscowCityWidget() { + defaultSteps.openMainPageWithCity(MOSCOW); + defaultSteps.shouldSeeWidgetWithCity(onMainPage().getWeatherWidget().get(0).getWidgetTitle().getCityNameInLastWidget().getText(), MOSCOW); + } + + @Test + @Title("Должен добавиться новый виджет") + public void shouldBeAdditionalCity() { + defaultSteps.openMainPageWithCity(MOSCOW); + int numberOfWidgets = onMainPage().getWeatherWidget().size(); + defaultSteps.addNewWidget(); + defaultSteps.shouldSeeThisNumberOfWidgets(numberOfWidgets + 1); + } + + @Ignore("Не дописан выбор города из контекстного меню") + @Test + @Title("Должен измениться город в последнем виджете") + public void shouldBeRenamedCityInLastWidget() { + defaultSteps.openMainPageWithCity(MOSCOW); + defaultSteps.addNewWidget(); + defaultSteps.editLastWidget(PETERSBURG); + defaultSteps.shouldSeeWidgetWithCity(onMainPage().getWeatherWidget().get(0).getWidgetTitle().getCityNameInLastWidget().getText(), PETERSBURG); + } + private MainPage onMainPage() { return new MainPage(webDriverRule.getDriver()); } 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..ed005a6 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 @@ -1,6 +1,7 @@ package ru.qatools.school.pages; import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; import ru.qatools.school.pages.blocks.WeatherWidget; @@ -23,8 +24,16 @@ public MainPage(WebDriver driver) { @FindBy(css = ".card.card_md") private List weatherWidget; + @Name("Кнопка добавления города") + @FindBy(css = ".new-card") + private WebElement addCityButton; + public List getWeatherWidget() { return weatherWidget; } + public WebElement getAddCityButton() { + return addCityButton; + } + } 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..2a24229 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,7 +11,15 @@ */ public class WidgetTitle extends HtmlElement { + @Name("Название города в последнем виджете") + @FindBy(css = ".inplace") + private WebElement cityNameInLastWidget; + public Rectangle getRect() { return null; } + + public WebElement getCityNameInLastWidget() { + return cityNameInLastWidget; + } } 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..125dfe1 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; @@ -32,6 +33,35 @@ public void shouldSee(WebElement element) { assertThat("Должны видеть элемент", element, isDisplayed()); } + @Step("Должны видеть город «{0}»") + public void shouldSeeWidgetWithCity(String actual, String expected) { + assertThat("Ожидали другой город", actual, is(expected)); + } + + @Step("Добавляем еще один виджет") + public void addNewWidget() { + onMainPage().getAddCityButton().click(); + } + + @Step("Должны увидеть {0} виджета(ов)") + public void shouldSeeThisNumberOfWidgets(int count) { + assertThat("Количество виджетов не соответствует ожидаемому", onMainPage().getWeatherWidget().size(), is(count)); + } + + @Step("Последнему виджету назначаем город") + public void editLastWidget(String cityName) { + onMainPage().getWeatherWidget().get(0).getWidgetTitle().getCityNameInLastWidget().click(); + onMainPage().getWeatherWidget().get(0).getWidgetTitle().getCityNameInLastWidget().clear(); + onMainPage().getWeatherWidget().get(0).getWidgetTitle().getCityNameInLastWidget().sendKeys(cityName); + // В этом месте надо было добраться до контекстного меню и кликнуть туда, но опять 2:44... + // ...поэтому кликать надо вручную :( + try { + Thread.sleep(3000); + } catch (InterruptedException ex) { + Thread.currentThread().interrupt(); + } + } + private MainPage onMainPage() { return new MainPage(driver); } From d15a93a8188c778ec6d54a36cc63342172bc125f Mon Sep 17 00:00:00 2001 From: OneginES Date: Fri, 15 Apr 2016 14:18:54 +0300 Subject: [PATCH 02/26] Add test for choose another city --- .../qatools/school/webtests/WeatherWebTest.java | 4 +--- .../java/ru/qatools/school/pages/MainPage.java | 8 ++++++++ .../school/steps/websteps/DefaultSteps.java | 15 ++++++--------- 3 files changed, 15 insertions(+), 12 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 d6d349a..1366c47 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 @@ -1,7 +1,6 @@ package ru.qatools.school.webtests; import org.junit.Before; -import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import ru.qatools.school.pages.MainPage; @@ -40,14 +39,13 @@ public void shouldSeeMoscowCityWidget() { @Test @Title("Должен добавиться новый виджет") - public void shouldBeAdditionalCity() { + public void shouldBeAdditionalWidget() { defaultSteps.openMainPageWithCity(MOSCOW); int numberOfWidgets = onMainPage().getWeatherWidget().size(); defaultSteps.addNewWidget(); defaultSteps.shouldSeeThisNumberOfWidgets(numberOfWidgets + 1); } - @Ignore("Не дописан выбор города из контекстного меню") @Test @Title("Должен измениться город в последнем виджете") public void shouldBeRenamedCityInLastWidget() { 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 ed005a6..a725984 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 @@ -28,6 +28,10 @@ public MainPage(WebDriver driver) { @FindBy(css = ".new-card") private WebElement addCityButton; + @Name("Всплывающее меню") + @FindBy(css = ".city") + private WebElement popUpMenu; + public List getWeatherWidget() { return weatherWidget; } @@ -36,4 +40,8 @@ public WebElement getAddCityButton() { return addCityButton; } + public WebElement getPopUpMenu() { + return popUpMenu; + } + } 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 125dfe1..d841196 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 @@ -2,6 +2,7 @@ import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; +import org.openqa.selenium.interactions.Actions; import ru.qatools.school.pages.MainPage; import ru.yandex.qatools.allure.annotations.Step; @@ -33,7 +34,7 @@ public void shouldSee(WebElement element) { assertThat("Должны видеть элемент", element, isDisplayed()); } - @Step("Должны видеть город «{0}»") + @Step("Должны видеть виджет с городом «{0}»") public void shouldSeeWidgetWithCity(String actual, String expected) { assertThat("Ожидали другой город", actual, is(expected)); } @@ -48,18 +49,14 @@ public void shouldSeeThisNumberOfWidgets(int count) { assertThat("Количество виджетов не соответствует ожидаемому", onMainPage().getWeatherWidget().size(), is(count)); } - @Step("Последнему виджету назначаем город") + @Step("Последнему виджету назначаем город «{0}»") public void editLastWidget(String cityName) { onMainPage().getWeatherWidget().get(0).getWidgetTitle().getCityNameInLastWidget().click(); onMainPage().getWeatherWidget().get(0).getWidgetTitle().getCityNameInLastWidget().clear(); onMainPage().getWeatherWidget().get(0).getWidgetTitle().getCityNameInLastWidget().sendKeys(cityName); - // В этом месте надо было добраться до контекстного меню и кликнуть туда, но опять 2:44... - // ...поэтому кликать надо вручную :( - try { - Thread.sleep(3000); - } catch (InterruptedException ex) { - Thread.currentThread().interrupt(); - } + + Actions actions = new Actions(driver); + actions.moveToElement(onMainPage().getPopUpMenu(), 1, 1).click().build().perform(); } private MainPage onMainPage() { From 2911e2ac2427ebf3e4971f5ebf98a505906f753e Mon Sep 17 00:00:00 2001 From: OneginES Date: Fri, 15 Apr 2016 19:07:57 +0300 Subject: [PATCH 03/26] Fix some bugs... --- steps-module/pom.xml | 8 ++++++++ .../src/main/java/ru/qatools/school/pages/MainPage.java | 8 ++++---- .../ru/qatools/school/steps/websteps/DefaultSteps.java | 8 ++++---- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/steps-module/pom.xml b/steps-module/pom.xml index 37efd44..9e60bb8 100644 --- a/steps-module/pom.xml +++ b/steps-module/pom.xml @@ -40,6 +40,14 @@ ru.yandex.qatools.htmlelements htmlelements-matchers + + + + + org.slf4j + slf4j-simple + 1.7.21 + 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 a725984..a01a3d5 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 @@ -24,9 +24,9 @@ public MainPage(WebDriver driver) { @FindBy(css = ".card.card_md") private List weatherWidget; - @Name("Кнопка добавления города") + @Name("Кнопка добавления виджета") @FindBy(css = ".new-card") - private WebElement addCityButton; + private WebElement addWidgetButton; @Name("Всплывающее меню") @FindBy(css = ".city") @@ -36,8 +36,8 @@ public List getWeatherWidget() { return weatherWidget; } - public WebElement getAddCityButton() { - return addCityButton; + public WebElement getAddWidgetButton() { + return addWidgetButton; } public WebElement getPopUpMenu() { 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 d841196..8e173cf 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 @@ -2,7 +2,6 @@ import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; -import org.openqa.selenium.interactions.Actions; import ru.qatools.school.pages.MainPage; import ru.yandex.qatools.allure.annotations.Step; @@ -41,7 +40,7 @@ public void shouldSeeWidgetWithCity(String actual, String expected) { @Step("Добавляем еще один виджет") public void addNewWidget() { - onMainPage().getAddCityButton().click(); + onMainPage().getAddWidgetButton().click(); } @Step("Должны увидеть {0} виджета(ов)") @@ -55,8 +54,9 @@ public void editLastWidget(String cityName) { onMainPage().getWeatherWidget().get(0).getWidgetTitle().getCityNameInLastWidget().clear(); onMainPage().getWeatherWidget().get(0).getWidgetTitle().getCityNameInLastWidget().sendKeys(cityName); - Actions actions = new Actions(driver); - actions.moveToElement(onMainPage().getPopUpMenu(), 1, 1).click().build().perform(); +// Actions actions = new Actions(driver); +// actions.moveToElement(onMainPage().getPopUpMenu(), 1, 1).click().build().perform(); + onMainPage().getPopUpMenu().click(); } private MainPage onMainPage() { From 7a275c0d0e610c154d45ffc5586d9ad9d709b273 Mon Sep 17 00:00:00 2001 From: OneginES Date: Mon, 18 Apr 2016 00:01:16 +0300 Subject: [PATCH 04/26] Fix code according to comments --- .../school/webtests/WeatherWebTest.java | 45 +++++++++++-------- steps-module/pom.xml | 3 -- .../ru/qatools/school/pages/MainPage.java | 23 +++++----- .../school/pages/blocks/WeatherWidget.java | 1 + .../blocks/widgetblocks/WidgetTitle.java | 9 ++-- .../school/steps/websteps/DefaultSteps.java | 35 ++++++++++----- 6 files changed, 70 insertions(+), 46 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 1366c47..81002cf 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 @@ -8,15 +8,17 @@ import ru.qatools.school.steps.websteps.DefaultSteps; import ru.yandex.qatools.allure.annotations.Title; +/** + * Created by kurau. + * Changed by onegines (Eugene Kirienko). + */ public class WeatherWebTest { - public static final String MOSCOW = "Moscow"; - public static final String PETERSBURG = "Saint Petersburg"; - - private DefaultSteps defaultSteps; - + private static final String CITY = "Moscow"; + private static final String CITY2 = "Saint Petersburg"; @Rule public WebDriverRule webDriverRule = new WebDriverRule(); + private DefaultSteps defaultSteps; @Before public void initSteps() { @@ -26,33 +28,40 @@ public void initSteps() { @Test @Title("Должны видеть виджет на главной странице") public void shouldSeeWidgetOnMainPage() { - defaultSteps.openMainPageWithCity(MOSCOW); - defaultSteps.shouldSee(onMainPage().getWeatherWidget().get(0)); + defaultSteps.openMainPageWithCity(CITY); + defaultSteps.shouldSee(onMainPage().getFirstWidget()); } @Test - @Title("Должны видеть виджет Москвы") - public void shouldSeeMoscowCityWidget() { - defaultSteps.openMainPageWithCity(MOSCOW); - defaultSteps.shouldSeeWidgetWithCity(onMainPage().getWeatherWidget().get(0).getWidgetTitle().getCityNameInLastWidget().getText(), MOSCOW); + @Title("Должны видеть виджет города из запроса") + public void shouldSeeWidgetFromQuery() { + defaultSteps.openMainPageWithCity(CITY); + defaultSteps.shouldSeeWidgetWithCity(onMainPage().getFirstWidget(), CITY); } @Test @Title("Должен добавиться новый виджет") public void shouldBeAdditionalWidget() { - defaultSteps.openMainPageWithCity(MOSCOW); + defaultSteps.openMainPageWithCity(CITY); int numberOfWidgets = onMainPage().getWeatherWidget().size(); defaultSteps.addNewWidget(); defaultSteps.shouldSeeThisNumberOfWidgets(numberOfWidgets + 1); } @Test - @Title("Должен измениться город в последнем виджете") - public void shouldBeRenamedCityInLastWidget() { - defaultSteps.openMainPageWithCity(MOSCOW); - defaultSteps.addNewWidget(); - defaultSteps.editLastWidget(PETERSBURG); - defaultSteps.shouldSeeWidgetWithCity(onMainPage().getWeatherWidget().get(0).getWidgetTitle().getCityNameInLastWidget().getText(), PETERSBURG); + @Title("Должен измениться город в первом виджете: после ввода полного названия города и Return") + public void shouldBeRenamedFirstWidgetAfterEnterFullName() { + defaultSteps.openMainPageWithCity(CITY); + defaultSteps.editLastWidgetWithEnterFullName(CITY2); + defaultSteps.shouldSeeWidgetWithCity(onMainPage().getFirstWidget(), CITY2); + } + + @Test + @Title("Должен измениться город в первом виджете: после ввода начала названия и выбора пункта во всплывающем меню") + public void shouldBeRenamedFirstWidgetWithChooseItemInPopup() { + defaultSteps.openMainPageWithCity(CITY); + defaultSteps.editLastWidgetWithPopup(CITY2); + defaultSteps.shouldSeeWidgetWithCity(onMainPage().getFirstWidget(), CITY2); } private MainPage onMainPage() { diff --git a/steps-module/pom.xml b/steps-module/pom.xml index 9e60bb8..4c401a2 100644 --- a/steps-module/pom.xml +++ b/steps-module/pom.xml @@ -40,9 +40,6 @@ ru.yandex.qatools.htmlelements htmlelements-matchers - - - org.slf4j slf4j-simple 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 a01a3d5..a502268 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 @@ -13,35 +13,38 @@ /** * Created by kurau. + * Changed by onegines (Eugene Kirienko). */ 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 WebElement addWidgetButton; - - @Name("Всплывающее меню") + @Name("Всплывающее меню с названиями городов") @FindBy(css = ".city") - private WebElement popUpMenu; + private WebElement cityChoosePopup; + + public MainPage(WebDriver driver) { + PageFactory.initElements(new HtmlElementDecorator(new HtmlElementLocatorFactory(driver)), this); + } public List getWeatherWidget() { return weatherWidget; } + public WeatherWidget getFirstWidget() { + return getWeatherWidget().get(0); + } + public WebElement getAddWidgetButton() { return addWidgetButton; } - public WebElement getPopUpMenu() { - return popUpMenu; + public WebElement getCityChoosePopup() { + return cityChoosePopup; } } 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..39e8d5b 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 @@ -10,6 +10,7 @@ /** * Created by kurau. + * Changed by onegines (Eugene Kirienko). */ public class WeatherWidget extends HtmlElement { 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 2a24229..921a733 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 @@ -8,18 +8,19 @@ /** * Created by kurau. + * Changed by onegines (Eugene Kirienko). */ public class WidgetTitle extends HtmlElement { - @Name("Название города в последнем виджете") + @Name("Название города в заголовке") @FindBy(css = ".inplace") - private WebElement cityNameInLastWidget; + private WebElement cityNameInTitle; public Rectangle getRect() { return null; } - public WebElement getCityNameInLastWidget() { - return cityNameInLastWidget; + public WebElement getCityNameInTitle() { + return cityNameInTitle; } } 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 8e173cf..55e3739 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,10 +1,14 @@ package ru.qatools.school.steps.websteps; +import org.openqa.selenium.Keys; 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.concurrent.TimeUnit; + import static java.lang.String.format; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertThat; @@ -12,10 +16,11 @@ /** * Created by kurau. + * Changed by onegines (Eugene Kirienko). */ public class DefaultSteps { - public static final String MAIN_PAGE = "http://weather.lanwen.ru/#?cities=%s"; + private static final String MAIN_PAGE = "http://weather.lanwen.ru/#?cities=%s"; private WebDriver driver; @@ -33,8 +38,9 @@ public void shouldSee(WebElement element) { assertThat("Должны видеть элемент", element, isDisplayed()); } - @Step("Должны видеть виджет с городом «{0}»") - public void shouldSeeWidgetWithCity(String actual, String expected) { + @Step("Должны видеть виджет с городом «{1}»") + public void shouldSeeWidgetWithCity(WeatherWidget widget, String expected) { + String actual = widget.getWidgetTitle().getCityNameInTitle().getText(); assertThat("Ожидали другой город", actual, is(expected)); } @@ -48,15 +54,22 @@ public void shouldSeeThisNumberOfWidgets(int count) { assertThat("Количество виджетов не соответствует ожидаемому", onMainPage().getWeatherWidget().size(), is(count)); } - @Step("Последнему виджету назначаем город «{0}»") - public void editLastWidget(String cityName) { - onMainPage().getWeatherWidget().get(0).getWidgetTitle().getCityNameInLastWidget().click(); - onMainPage().getWeatherWidget().get(0).getWidgetTitle().getCityNameInLastWidget().clear(); - onMainPage().getWeatherWidget().get(0).getWidgetTitle().getCityNameInLastWidget().sendKeys(cityName); + @Step("Первому виджету назначаем город «{0}», вводя полное название и нажимая 'Return'") + public void editLastWidgetWithEnterFullName(String cityName) { + onMainPage().getFirstWidget().getWidgetTitle().getCityNameInTitle().click(); + onMainPage().getFirstWidget().getWidgetTitle().getCityNameInTitle().clear(); + onMainPage().getFirstWidget().getWidgetTitle().getCityNameInTitle().sendKeys(cityName + Keys.RETURN); + } + + @Step("Первому виджету назначаем город «{0}, вводя начало название и кликая по всплывающему меню»") + public void editLastWidgetWithPopup(String cityName) { + String beginOfCityName = cityName.substring(0, (cityName.length() > 4 ? 4 : cityName.length())); -// Actions actions = new Actions(driver); -// actions.moveToElement(onMainPage().getPopUpMenu(), 1, 1).click().build().perform(); - onMainPage().getPopUpMenu().click(); + onMainPage().getFirstWidget().getWidgetTitle().getCityNameInTitle().click(); + onMainPage().getFirstWidget().getWidgetTitle().getCityNameInTitle().clear(); + onMainPage().getFirstWidget().getWidgetTitle().getCityNameInTitle().sendKeys(beginOfCityName); + driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS); + onMainPage().getCityChoosePopup().click(); } private MainPage onMainPage() { From 34245ce8ee5a9cd62c46d9143a41c49d21550cc3 Mon Sep 17 00:00:00 2001 From: OneginES Date: Tue, 19 Apr 2016 17:20:39 +0300 Subject: [PATCH 05/26] Rewrite part of code according to comments --- .../school/webtests/WeatherWebTest.java | 21 ++++---- .../ru/qatools/school/pages/MainPage.java | 13 ++--- .../school/pages/blocks/WeatherWidget.java | 2 +- .../blocks/widgetblocks/WidgetTitle.java | 22 +++++++-- .../suggestblocks/CitySuggest.java | 26 ++++++++++ .../qatools/school/rules/WebDriverRule.java | 3 ++ .../school/steps/websteps/DefaultSteps.java | 48 ++++++++++--------- 7 files changed, 90 insertions(+), 45 deletions(-) create mode 100644 steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/suggestblocks/CitySuggest.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 81002cf..163cc2e 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 @@ -16,6 +16,7 @@ public class WeatherWebTest { private static final String CITY = "Moscow"; private static final String CITY2 = "Saint Petersburg"; + @Rule public WebDriverRule webDriverRule = new WebDriverRule(); private DefaultSteps defaultSteps; @@ -36,32 +37,34 @@ public void shouldSeeWidgetOnMainPage() { @Title("Должны видеть виджет города из запроса") public void shouldSeeWidgetFromQuery() { defaultSteps.openMainPageWithCity(CITY); - defaultSteps.shouldSeeWidgetWithCity(onMainPage().getFirstWidget(), CITY); + defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), CITY); } @Test @Title("Должен добавиться новый виджет") - public void shouldBeAdditionalWidget() { + public void shouldBeAddedNewWidget() { defaultSteps.openMainPageWithCity(CITY); int numberOfWidgets = onMainPage().getWeatherWidget().size(); - defaultSteps.addNewWidget(); + defaultSteps.clickOn(onMainPage().getAddWidgetButton()); defaultSteps.shouldSeeThisNumberOfWidgets(numberOfWidgets + 1); } @Test - @Title("Должен измениться город в первом виджете: после ввода полного названия города и Return") + @Title("Должен измениться город в первом виджете после ввода полного названия города и Return") public void shouldBeRenamedFirstWidgetAfterEnterFullName() { defaultSteps.openMainPageWithCity(CITY); - defaultSteps.editLastWidgetWithEnterFullName(CITY2); + defaultSteps.editFirstWidgetWithEnterFullName(CITY2); defaultSteps.shouldSeeWidgetWithCity(onMainPage().getFirstWidget(), CITY2); } @Test - @Title("Должен измениться город в первом виджете: после ввода начала названия и выбора пункта во всплывающем меню") - public void shouldBeRenamedFirstWidgetWithChooseItemInPopup() { + @Title("Должны видеть саджест после ввода начала названия города") + public void shouldSeeSuggestAfterEnterCityNameBegin() { + String cityNameBegin = CITY2.substring(0, (CITY2.length() > 4 ? 4 : CITY2.length())); + defaultSteps.openMainPageWithCity(CITY); - defaultSteps.editLastWidgetWithPopup(CITY2); - defaultSteps.shouldSeeWidgetWithCity(onMainPage().getFirstWidget(), CITY2); + defaultSteps.enterCityName(cityNameBegin); + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetTitle().getFirstSuggest()); } 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 a502268..78caf12 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 @@ -6,6 +6,7 @@ import org.openqa.selenium.support.PageFactory; import ru.qatools.school.pages.blocks.WeatherWidget; import ru.yandex.qatools.htmlelements.annotations.Name; +import ru.yandex.qatools.htmlelements.element.HtmlElement; import ru.yandex.qatools.htmlelements.loader.decorator.HtmlElementDecorator; import ru.yandex.qatools.htmlelements.loader.decorator.HtmlElementLocatorFactory; @@ -20,12 +21,10 @@ public class MainPage { @Name("Список виджетов") @FindBy(css = ".card.card_md") private List weatherWidget; + @Name("Кнопка добавления виджета") @FindBy(css = ".new-card") - private WebElement addWidgetButton; - @Name("Всплывающее меню с названиями городов") - @FindBy(css = ".city") - private WebElement cityChoosePopup; + private HtmlElement addWidgetButton; public MainPage(WebDriver driver) { PageFactory.initElements(new HtmlElementDecorator(new HtmlElementLocatorFactory(driver)), this); @@ -39,12 +38,8 @@ public WeatherWidget getFirstWidget() { return getWeatherWidget().get(0); } - public WebElement getAddWidgetButton() { + public HtmlElement getAddWidgetButton() { return addWidgetButton; } - public WebElement getCityChoosePopup() { - return cityChoosePopup; - } - } 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 39e8d5b..45d6616 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 @@ -24,7 +24,7 @@ public class WeatherWidget extends HtmlElement { @Name("Панель управления виджетом") @FindBy(css = ".card-actions") - private WebElement actions; + private HtmlElement actions; public WidgetText getWidgetText() { return widgetText; 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 921a733..89ac242 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,11 +1,13 @@ 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.qatools.school.pages.blocks.widgetblocks.suggestblocks.CitySuggest; import ru.yandex.qatools.htmlelements.annotations.Name; import ru.yandex.qatools.htmlelements.element.HtmlElement; +import java.util.List; + /** * Created by kurau. * Changed by onegines (Eugene Kirienko). @@ -14,13 +16,25 @@ public class WidgetTitle extends HtmlElement { @Name("Название города в заголовке") @FindBy(css = ".inplace") - private WebElement cityNameInTitle; + private HtmlElement cityName; + + @Name("Список предложенных городов") + @FindBy(css = ".city-suggest") + private List citySuggest; public Rectangle getRect() { return null; } - public WebElement getCityNameInTitle() { - return cityNameInTitle; + public HtmlElement getCityName() { + return cityName; + } + + public List getCitySuggest() { + return citySuggest; + } + + public CitySuggest getFirstSuggest() { + return getCitySuggest().get(0); } } diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/suggestblocks/CitySuggest.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/suggestblocks/CitySuggest.java new file mode 100644 index 0000000..f41aee7 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/suggestblocks/CitySuggest.java @@ -0,0 +1,26 @@ +package ru.qatools.school.pages.blocks.widgetblocks.suggestblocks; + +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. + * Changed by onegines (Eugene Kirienko). + */ +public class CitySuggest extends HtmlElement { + + @Name("Предложенный город") + @FindBy(css = ".city") + private WebElement citySuggest; + + public Rectangle getRect() { + return null; + } + + public WebElement getCitySuggest() { + return citySuggest; + } +} 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 index 418c363..9a7af74 100644 --- a/steps-module/src/main/java/ru/qatools/school/rules/WebDriverRule.java +++ b/steps-module/src/main/java/ru/qatools/school/rules/WebDriverRule.java @@ -4,6 +4,8 @@ import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; +import java.util.concurrent.TimeUnit; + /** * Created by kurau. */ @@ -13,6 +15,7 @@ public class WebDriverRule extends ExternalResource { protected void before() throws Throwable { this.driver = new FirefoxDriver(); + this.driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS); } protected void after() { 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 55e3739..b376ad0 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,12 +6,14 @@ import ru.qatools.school.pages.MainPage; import ru.qatools.school.pages.blocks.WeatherWidget; import ru.yandex.qatools.allure.annotations.Step; - -import java.util.concurrent.TimeUnit; +import ru.yandex.qatools.htmlelements.element.HtmlElement; import static java.lang.String.format; +import static org.hamcrest.CoreMatchers.both; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertThat; +import static ru.yandex.qatools.htmlelements.matchers.WebElementMatchers.exists; +import static ru.yandex.qatools.htmlelements.matchers.WebElementMatchers.hasText; import static ru.yandex.qatools.htmlelements.matchers.WebElementMatchers.isDisplayed; /** @@ -33,43 +35,45 @@ public void openMainPageWithCity(String city) { driver.get(format(MAIN_PAGE, city)); } - @Step("Должны видеть на странице «{0}»") + @Step("Должны видеть на странице элемент «{0}»") public void shouldSee(WebElement element) { - assertThat("Должны видеть элемент", element, isDisplayed()); + assertThat("Должны видеть элемент", element, both(exists()).and(isDisplayed())); } @Step("Должны видеть виджет с городом «{1}»") public void shouldSeeWidgetWithCity(WeatherWidget widget, String expected) { - String actual = widget.getWidgetTitle().getCityNameInTitle().getText(); + String actual = widget.getWidgetTitle().getCityName().getText(); assertThat("Ожидали другой город", actual, is(expected)); } - @Step("Добавляем еще один виджет") - public void addNewWidget() { - onMainPage().getAddWidgetButton().click(); - } - @Step("Должны увидеть {0} виджета(ов)") public void shouldSeeThisNumberOfWidgets(int count) { assertThat("Количество виджетов не соответствует ожидаемому", onMainPage().getWeatherWidget().size(), is(count)); } @Step("Первому виджету назначаем город «{0}», вводя полное название и нажимая 'Return'") - public void editLastWidgetWithEnterFullName(String cityName) { - onMainPage().getFirstWidget().getWidgetTitle().getCityNameInTitle().click(); - onMainPage().getFirstWidget().getWidgetTitle().getCityNameInTitle().clear(); - onMainPage().getFirstWidget().getWidgetTitle().getCityNameInTitle().sendKeys(cityName + Keys.RETURN); + public void editFirstWidgetWithEnterFullName(String cityName) { + onMainPage().getFirstWidget().getWidgetTitle().getCityName().click(); + onMainPage().getFirstWidget().getWidgetTitle().getCityName().clear(); + onMainPage().getFirstWidget().getWidgetTitle().getCityName().sendKeys(cityName); + onMainPage().getFirstWidget().getWidgetTitle().getCityName().sendKeys(Keys.RETURN); } - @Step("Первому виджету назначаем город «{0}, вводя начало название и кликая по всплывающему меню»") - public void editLastWidgetWithPopup(String cityName) { - String beginOfCityName = cityName.substring(0, (cityName.length() > 4 ? 4 : cityName.length())); + @Step("Вводим название города «{0}»") + public void enterCityName(String cityName) { + onMainPage().getFirstWidget().getWidgetTitle().getCityName().click(); + onMainPage().getFirstWidget().getWidgetTitle().getCityName().clear(); + onMainPage().getFirstWidget().getWidgetTitle().getCityName().sendKeys(cityName); + } + + @Step("Кликаем по элементу {0}") + public void clickOn(HtmlElement element) { + element.click(); + } - onMainPage().getFirstWidget().getWidgetTitle().getCityNameInTitle().click(); - onMainPage().getFirstWidget().getWidgetTitle().getCityNameInTitle().clear(); - onMainPage().getFirstWidget().getWidgetTitle().getCityNameInTitle().sendKeys(beginOfCityName); - driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS); - onMainPage().getCityChoosePopup().click(); + @Step("Элемент «{0}» должен содержать текст «{1}»") + public void shouldHaveText(HtmlElement element, String text) { + assertThat("Текст в элементе не соответствует ожидаемому", element, hasText(text)); } private MainPage onMainPage() { From 3b25d1db4684467499ecdea89039feb2a0c8a6e4 Mon Sep 17 00:00:00 2001 From: OneginES Date: Wed, 20 Apr 2016 11:19:59 +0300 Subject: [PATCH 06/26] Change maven encoding to UTF-8. --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 208222f..d748268 100644 --- a/pom.xml +++ b/pom.xml @@ -79,6 +79,7 @@ ${compiler.version} ${compiler.version} + UTF-8 From f94c32d4766b774d7b56159e4d016c59b0bdf3fe Mon Sep 17 00:00:00 2001 From: OneginES Date: Wed, 20 Apr 2016 11:51:44 +0300 Subject: [PATCH 07/26] Merge with init for TestPalma --- .../qatools/school/tp/ConnectedToTPTest.java | 48 ++++++++++++++ pom.xml | 8 +++ steps-module/pom.xml | 4 ++ .../qatools/school/rules/WebDriverRule.java | 1 + .../ru/qatools/school/tp/TPInformerRule.java | 64 +++++++++++++++++++ .../ru/qatools/school/tp/client/TPClient.java | 49 ++++++++++++++ 6 files changed, 174 insertions(+) create mode 100644 commons-module/src/test/java/ru/qatools/school/tp/ConnectedToTPTest.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/tp/ConnectedToTPTest.java b/commons-module/src/test/java/ru/qatools/school/tp/ConnectedToTPTest.java new file mode 100644 index 0000000..cc66bbe --- /dev/null +++ b/commons-module/src/test/java/ru/qatools/school/tp/ConnectedToTPTest.java @@ -0,0 +1,48 @@ +package ru.qatools.school.tp; + +import org.junit.Rule; +import org.junit.Test; +import ru.yandex.qatools.allure.annotations.TestCaseId; + +import java.io.IOException; + +import static java.util.concurrent.TimeUnit.SECONDS; +import static junit.framework.TestCase.fail; +import static org.hamcrest.Matchers.is; +import static org.junit.Assume.assumeThat; + + +public class ConnectedToTPTest { + + @Rule + public TPInformerRule tms = new TPInformerRule("ruletest"); + + + @Test + @TestCaseId("1") + public void shouldMarkCaseStatusAsPassed() throws IOException, InterruptedException { + SECONDS.sleep(15); + } + + + @Test + @TestCaseId("2") + public void shouldFail() throws IOException, InterruptedException { + SECONDS.sleep(5); + fail(); + } + + @Test + @TestCaseId("3") + public void shouldBroke() throws IOException, InterruptedException { + SECONDS.sleep(5); + throw new RuntimeException(); + } + + @Test + @TestCaseId("4") + public void shouldBeSkipped() throws IOException, InterruptedException { + SECONDS.sleep(5); + assumeThat(true, is(false)); + } +} diff --git a/pom.xml b/pom.xml index d748268..767f14f 100644 --- a/pom.xml +++ b/pom.xml @@ -36,6 +36,14 @@ + + + + com.jayway.restassured + rest-assured + 2.9.0 + + ru.yandex.qatools.allure allure-junit-adaptor diff --git a/steps-module/pom.xml b/steps-module/pom.xml index 4c401a2..7e8b809 100644 --- a/steps-module/pom.xml +++ b/steps-module/pom.xml @@ -45,6 +45,10 @@ slf4j-simple 1.7.21 + + com.jayway.restassured + rest-assured + 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 index 9a7af74..6e75d0f 100644 --- a/steps-module/src/main/java/ru/qatools/school/rules/WebDriverRule.java +++ b/steps-module/src/main/java/ru/qatools/school/rules/WebDriverRule.java @@ -8,6 +8,7 @@ /** * Created by kurau. + * Changed by onegines (Eugene Kirienko). */ public class WebDriverRule extends ExternalResource { 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..85016ff --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/tp/client/TPClient.java @@ -0,0 +1,49 @@ +package ru.qatools.school.tp.client; + +import com.jayway.restassured.RestAssured; +import com.jayway.restassured.http.ContentType; + +import java.util.List; + +/** + * @author lanwen (Merkushev Kirill) + */ +public class TPClient { + + private static final String ENDPOINT = System.getProperty("tp.api.endpoint", "http://localhost/"); + private static final String TOKEN = System.getProperty("tp.api.token", "empty"); + private static final String RUN = System.getProperty("tp.api.run", "empty"); + + 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 dbff25c7da5f778e1f3729a05123306e2b72c008 Mon Sep 17 00:00:00 2001 From: OneginES Date: Fri, 22 Apr 2016 22:11:07 +0300 Subject: [PATCH 08/26] Add some new tests, some tests and steps refactoring. --- .../school/webtests/WeatherWebTest.java | 85 +++++++++++++++---- .../ru/qatools/school/pages/MainPage.java | 9 +- .../blocks/widgetblocks/WidgetTitle.java | 8 +- .../qatools/school/rules/WebDriverRule.java | 2 +- .../school/steps/websteps/DefaultSteps.java | 79 +++++++++++------ 5 files changed, 127 insertions(+), 56 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 163cc2e..48b0da9 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,6 +6,7 @@ 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; /** @@ -14,12 +15,16 @@ */ public class WeatherWebTest { - private static final String CITY = "Moscow"; - private static final String CITY2 = "Saint Petersburg"; + private static final String CITY = "Saint Petersburg"; + private static final String CITY2 = "Moscow"; + + private DefaultSteps defaultSteps; @Rule public WebDriverRule webDriverRule = new WebDriverRule(); - private DefaultSteps defaultSteps; + + @Rule + public TPInformerRule tms = new TPInformerRule("onegines"); @Before public void initSteps() { @@ -27,34 +32,64 @@ public void initSteps() { } @Test - @Title("Должны видеть виджет на главной странице") - public void shouldSeeWidgetOnMainPage() { - defaultSteps.openMainPageWithCity(CITY); - defaultSteps.shouldSee(onMainPage().getFirstWidget()); + @Title("Должна открыться нужная страница") +// @ru.yandex.qatools.allure.annotations.TestCaseId("NUM") + public void shouldBeOnCorrectPage() { + defaultSteps.openMainPage(); + defaultSteps.shouldBeUrl("http://weather.lanwen.ru/"); + defaultSteps.shouldBeTitle("Weather"); + } + + @Test + @Title("Должны видеть кнопку '+' на странице, открытой без параметров") +// @ru.yandex.qatools.allure.annotations.TestCaseId("NUM") + public void shouldSeeAddWidgetButtonOnPageWithNoQuery() { + defaultSteps.openMainPage(); + defaultSteps.shouldSee(onMainPage().getAddWidgetButton()); + } + + @Test + @Title("Должны видеть кнопку '+' на странице, открытой с указанием городов в параметрах") +// @ru.yandex.qatools.allure.annotations.TestCaseId("NUM") + public void shouldSeeAddWidgetButtonOnPageWithQuery() { + defaultSteps.openMainPageWithCities(CITY); + defaultSteps.shouldSee(onMainPage().getAddWidgetButton()); + } + + @Test + @Title("Должны видеть два виджета на главной странице после загрузки") + public void shouldSeeTwoWidgetsOnMainPage() { + defaultSteps.openMainPageWithCities(CITY, CITY2); + defaultSteps.shouldBeThisNumberOfWidgets(2); + defaultSteps.shouldSee(onMainPage().getWeatherWidgets()); } @Test @Title("Должны видеть виджет города из запроса") public void shouldSeeWidgetFromQuery() { - defaultSteps.openMainPageWithCity(CITY); + defaultSteps.openMainPageWithCities(CITY); defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), CITY); } @Test - @Title("Должен добавиться новый виджет") + @Title("Должен добавиться новый виджет после щелчка на кнопке '+'") +// @ru.yandex.qatools.allure.annotations.TestCaseId("4") public void shouldBeAddedNewWidget() { - defaultSteps.openMainPageWithCity(CITY); - int numberOfWidgets = onMainPage().getWeatherWidget().size(); + defaultSteps.openMainPageWithCities(CITY); + int numberOfWidgets = onMainPage().getWeatherWidgets().size(); defaultSteps.clickOn(onMainPage().getAddWidgetButton()); - defaultSteps.shouldSeeThisNumberOfWidgets(numberOfWidgets + 1); + defaultSteps.shouldBeThisNumberOfWidgets(numberOfWidgets + 1); } @Test @Title("Должен измениться город в первом виджете после ввода полного названия города и Return") public void shouldBeRenamedFirstWidgetAfterEnterFullName() { - defaultSteps.openMainPageWithCity(CITY); - defaultSteps.editFirstWidgetWithEnterFullName(CITY2); - defaultSteps.shouldSeeWidgetWithCity(onMainPage().getFirstWidget(), CITY2); + defaultSteps.openMainPageWithCities(CITY); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.eraseText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.enterText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), CITY2); + defaultSteps.confirmText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), CITY2); } @Test @@ -62,9 +97,23 @@ public void shouldBeRenamedFirstWidgetAfterEnterFullName() { public void shouldSeeSuggestAfterEnterCityNameBegin() { String cityNameBegin = CITY2.substring(0, (CITY2.length() > 4 ? 4 : CITY2.length())); - defaultSteps.openMainPageWithCity(CITY); - defaultSteps.enterCityName(cityNameBegin); - defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetTitle().getFirstSuggest()); + defaultSteps.openMainPageWithCities(CITY); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.eraseText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.enterText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), cityNameBegin); + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetTitle().getCitySuggests()); + } + + @Test + @Title("Должны видеть поле с названием города после после удаления текста в нём") + public void shouldSeeCityNameInTitleAfterEraseTextInIt() { + + defaultSteps.openMainPageWithCities(CITY); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.eraseText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.confirmText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); } 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 78caf12..99f2da0 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 @@ -1,7 +1,6 @@ package ru.qatools.school.pages; import org.openqa.selenium.WebDriver; -import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; import ru.qatools.school.pages.blocks.WeatherWidget; @@ -20,7 +19,7 @@ public class MainPage { @Name("Список виджетов") @FindBy(css = ".card.card_md") - private List weatherWidget; + private List weatherWidgets; @Name("Кнопка добавления виджета") @FindBy(css = ".new-card") @@ -30,12 +29,12 @@ public MainPage(WebDriver driver) { PageFactory.initElements(new HtmlElementDecorator(new HtmlElementLocatorFactory(driver)), this); } - public List getWeatherWidget() { - return weatherWidget; + public List getWeatherWidgets() { + return weatherWidgets; } public WeatherWidget getFirstWidget() { - return getWeatherWidget().get(0); + return getWeatherWidgets().get(0); } public HtmlElement getAddWidgetButton() { 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 89ac242..81ed43f 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 @@ -20,7 +20,7 @@ public class WidgetTitle extends HtmlElement { @Name("Список предложенных городов") @FindBy(css = ".city-suggest") - private List citySuggest; + private List citySuggests; public Rectangle getRect() { return null; @@ -30,11 +30,11 @@ public HtmlElement getCityName() { return cityName; } - public List getCitySuggest() { - return citySuggest; + public List getCitySuggests() { + return citySuggests; } public CitySuggest getFirstSuggest() { - return getCitySuggest().get(0); + return getCitySuggests().get(0); } } 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 index 6e75d0f..a79aac4 100644 --- a/steps-module/src/main/java/ru/qatools/school/rules/WebDriverRule.java +++ b/steps-module/src/main/java/ru/qatools/school/rules/WebDriverRule.java @@ -16,7 +16,7 @@ public class WebDriverRule extends ExternalResource { protected void before() throws Throwable { this.driver = new FirefoxDriver(); - this.driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS); + this.driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS); } protected void after() { 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 b376ad0..225da7a 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,20 +1,20 @@ package ru.qatools.school.steps.websteps; +import org.apache.commons.lang3.StringUtils; import org.openqa.selenium.Keys; 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 ru.yandex.qatools.htmlelements.element.HtmlElement; +import java.util.List; + import static java.lang.String.format; import static org.hamcrest.CoreMatchers.both; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertThat; -import static ru.yandex.qatools.htmlelements.matchers.WebElementMatchers.exists; -import static ru.yandex.qatools.htmlelements.matchers.WebElementMatchers.hasText; -import static ru.yandex.qatools.htmlelements.matchers.WebElementMatchers.isDisplayed; +import static ru.yandex.qatools.htmlelements.matchers.WebElementMatchers.*; /** * Created by kurau. @@ -22,7 +22,8 @@ */ public class DefaultSteps { - private static final String MAIN_PAGE = "http://weather.lanwen.ru/#?cities=%s"; + private static final String MAIN_PAGE = "http://weather.lanwen.ru/"; + private static final String QUERY = "#?cities=%s"; private WebDriver driver; @@ -30,9 +31,29 @@ public DefaultSteps(WebDriver driver) { this.driver = driver; } - @Step("Открываем главную страницу для города «{0}»") - public void openMainPageWithCity(String city) { - driver.get(format(MAIN_PAGE, city)); + @Step("Открываем главную страницу без параметров»") + public void openMainPage() { + driver.get(MAIN_PAGE); + } + +// @Step("Открываем главную страницу для города «{0}»") +// public void openMainPageWithCity(String city) { +// driver.get(MAIN_PAGE + format(QUERY, city)); +// } + + @Step("Открываем главную страницу для городов «{0}»") + public void openMainPageWithCities(String... cities) { + driver.get(MAIN_PAGE + format(QUERY, StringUtils.join(cities, ','))); + } + + @Step("Должен быть заголовок «{0}»") + public void shouldBeTitle(String title) { + assertThat("Заголовок страницы не совпадает", driver.getTitle(), is(title)); + } + + @Step("Должен быть URL «{0}»") + public void shouldBeUrl(String url) { + assertThat("URL страницы не совпадает", driver.getCurrentUrl(), is(url)); } @Step("Должны видеть на странице элемент «{0}»") @@ -40,35 +61,37 @@ public void shouldSee(WebElement element) { assertThat("Должны видеть элемент", element, both(exists()).and(isDisplayed())); } - @Step("Должны видеть виджет с городом «{1}»") - public void shouldSeeWidgetWithCity(WeatherWidget widget, String expected) { - String actual = widget.getWidgetTitle().getCityName().getText(); - assertThat("Ожидали другой город", actual, is(expected)); + @Step("Должны видеть на странице элементы «{0}»") + public void shouldSee(List elements) { + for (WebElement element : elements) { + assertThat("Должен существовать элемент", element, exists()); + assertThat("Должны видеть элемент", element, isDisplayed()); + } } @Step("Должны увидеть {0} виджета(ов)") - public void shouldSeeThisNumberOfWidgets(int count) { - assertThat("Количество виджетов не соответствует ожидаемому", onMainPage().getWeatherWidget().size(), is(count)); + public void shouldBeThisNumberOfWidgets(int count) { + assertThat("Количество виджетов не соответствует ожидаемому", onMainPage().getWeatherWidgets().size(), is(count)); } - @Step("Первому виджету назначаем город «{0}», вводя полное название и нажимая 'Return'") - public void editFirstWidgetWithEnterFullName(String cityName) { - onMainPage().getFirstWidget().getWidgetTitle().getCityName().click(); - onMainPage().getFirstWidget().getWidgetTitle().getCityName().clear(); - onMainPage().getFirstWidget().getWidgetTitle().getCityName().sendKeys(cityName); - onMainPage().getFirstWidget().getWidgetTitle().getCityName().sendKeys(Keys.RETURN); + @Step("Кликаем по элементу {0}") + public void clickOn(HtmlElement element) { + element.click(); } - @Step("Вводим название города «{0}»") - public void enterCityName(String cityName) { - onMainPage().getFirstWidget().getWidgetTitle().getCityName().click(); - onMainPage().getFirstWidget().getWidgetTitle().getCityName().clear(); - onMainPage().getFirstWidget().getWidgetTitle().getCityName().sendKeys(cityName); + @Step("Удаляем текст в элементе «{0}»") + public void eraseText(WebElement element) { + element.clear(); } - @Step("Кликаем по элементу {0}") - public void clickOn(HtmlElement element) { - element.click(); + @Step("Вводим текст «{1}» в элемент «{0}»") + public void enterText(WebElement element, String text) { + element.sendKeys(text); + } + + @Step("Подтверждаем нажатием Return ввод в элементе «{0}»") + public void confirmText(WebElement element) { + element.sendKeys(Keys.RETURN); } @Step("Элемент «{0}» должен содержать текст «{1}»") From 66e302db4cbfdfc1cb97467e0d361b7151ae512b Mon Sep 17 00:00:00 2001 From: OneginES Date: Sat, 23 Apr 2016 17:48:12 +0300 Subject: [PATCH 09/26] Add step for waiting until changing element is ready. Add some tests. --- .../school/webtests/WeatherWebTest.java | 50 ++++++++++++++++++- .../school/pages/blocks/WeatherWidget.java | 7 +-- .../blocks/widgetblocks/WidgetActions.java | 24 +++++++++ .../pages/blocks/widgetblocks/WidgetText.java | 5 +- .../suggestblocks/CitySuggest.java | 22 +++++--- .../school/steps/websteps/DefaultSteps.java | 38 +++++++++++--- 6 files changed, 124 insertions(+), 22 deletions(-) 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 48b0da9..e8f3898 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 @@ -89,6 +89,7 @@ public void shouldBeRenamedFirstWidgetAfterEnterFullName() { defaultSteps.eraseText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); defaultSteps.enterText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), CITY2); defaultSteps.confirmText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.waitUntilElementReady(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), 10000); defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), CITY2); } @@ -104,16 +105,63 @@ public void shouldSeeSuggestAfterEnterCityNameBegin() { defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetTitle().getCitySuggests()); } + @Test + @Title("Должен измениться город в виджете после выбора города в саджесте") + public void shouldSeeCityInWidgetChosenInSuggest() { + String cityNameBegin = CITY2.substring(0, (CITY2.length() > 4 ? 4 : CITY2.length())); + + defaultSteps.openMainPageWithCities(CITY); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.eraseText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.enterText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), cityNameBegin); + + String cityNameInSuggest = onMainPage().getFirstWidget().getWidgetTitle().getFirstSuggest().getCityName().getText(); + + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getFirstSuggest()); + + defaultSteps.waitUntilElementReady(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), 10000); + defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), cityNameInSuggest); + + } + @Test @Title("Должны видеть поле с названием города после после удаления текста в нём") public void shouldSeeCityNameInTitleAfterEraseTextInIt() { + defaultSteps.openMainPageWithCities(CITY); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.eraseText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.confirmText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + } + @Test + @Title("Должны видеть 0 виджетов после удаления ") + public void shouldSeeNullWidgetsAfterDelete() { + defaultSteps.openMainPageWithCities(CITY, CITY2); + defaultSteps.shouldBeThisNumberOfWidgets(2); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetActions().getRemoveWidgetButton()); + defaultSteps.shouldBeThisNumberOfWidgets(1); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetActions().getRemoveWidgetButton()); + defaultSteps.shouldBeThisNumberOfWidgets(0); + } + + @Test + @Title("После изменения города в виджете должен поменяться URL") + public void shouldChangeUrlAfterWidgetRename() { defaultSteps.openMainPageWithCities(CITY); defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); defaultSteps.eraseText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.enterText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), CITY2); defaultSteps.confirmText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.shouldBeUrl("http://weather.lanwen.ru/#?cities=" + CITY2); + } - defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + @Test + @Title("После удаления города в виджете должен поменяться URL") + public void shouldChangeUrlAfterWidgetRemove() { + defaultSteps.openMainPageWithCities(CITY, CITY2); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetActions().getRemoveWidgetButton()); + defaultSteps.shouldBeUrl("http://weather.lanwen.ru/#?cities=" + CITY2.replace(" ", "%20")); } private MainPage onMainPage() { 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 45d6616..44294c8 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; @@ -24,7 +25,7 @@ public class WeatherWidget extends HtmlElement { @Name("Панель управления виджетом") @FindBy(css = ".card-actions") - private HtmlElement actions; + private WidgetActions widgetActions; public WidgetText getWidgetText() { return widgetText; @@ -34,8 +35,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..0985961 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetActions.java @@ -0,0 +1,24 @@ +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 onegines (Eugene Kirienko). + */ +public class WidgetActions extends HtmlElement { + + @Name("Кнопка удаления виджета") + @FindBy(css = ".remove-card") + private HtmlElement removeWidgetButton; + + public HtmlElement getRemoveWidgetButton() { + return removeWidgetButton; + } + + 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..b96254b 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 @@ -1,7 +1,6 @@ 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; @@ -13,9 +12,9 @@ public class WidgetText extends HtmlElement { @Name("Картинка текущей погоды") @FindBy(css = ".weather-image") - private WebElement weatherImage; + private HtmlElement weatherImage; - public WebElement getWeatherImage() { + public HtmlElement getWeatherImage() { return weatherImage; } diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/suggestblocks/CitySuggest.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/suggestblocks/CitySuggest.java index f41aee7..6e271a1 100644 --- a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/suggestblocks/CitySuggest.java +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/suggestblocks/CitySuggest.java @@ -1,26 +1,32 @@ package ru.qatools.school.pages.blocks.widgetblocks.suggestblocks; 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. - * Changed by onegines (Eugene Kirienko). + * Created by onegines (Eugene Kirienko). */ public class CitySuggest extends HtmlElement { - @Name("Предложенный город") - @FindBy(css = ".city") - private WebElement citySuggest; + @Name("Название города") + @FindBy(css = ".city__name") + private HtmlElement cityName; + + @Name("Регион") + @FindBy(css = ".city__country") + private HtmlElement countryName; public Rectangle getRect() { return null; } - public WebElement getCitySuggest() { - return citySuggest; + public HtmlElement getCityName() { + return cityName; + } + + public HtmlElement getCountryName() { + return countryName; } } 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 225da7a..eddd453 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 @@ -2,6 +2,7 @@ import org.apache.commons.lang3.StringUtils; import org.openqa.selenium.Keys; +import org.openqa.selenium.StaleElementReferenceException; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import ru.qatools.school.pages.MainPage; @@ -11,7 +12,6 @@ import java.util.List; import static java.lang.String.format; -import static org.hamcrest.CoreMatchers.both; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertThat; import static ru.yandex.qatools.htmlelements.matchers.WebElementMatchers.*; @@ -31,16 +31,19 @@ public DefaultSteps(WebDriver driver) { this.driver = driver; } + public static String getMainPage() { + return MAIN_PAGE; + } + + public static String getQuery() { + return QUERY; + } + @Step("Открываем главную страницу без параметров»") public void openMainPage() { driver.get(MAIN_PAGE); } -// @Step("Открываем главную страницу для города «{0}»") -// public void openMainPageWithCity(String city) { -// driver.get(MAIN_PAGE + format(QUERY, city)); -// } - @Step("Открываем главную страницу для городов «{0}»") public void openMainPageWithCities(String... cities) { driver.get(MAIN_PAGE + format(QUERY, StringUtils.join(cities, ','))); @@ -58,7 +61,8 @@ public void shouldBeUrl(String url) { @Step("Должны видеть на странице элемент «{0}»") public void shouldSee(WebElement element) { - assertThat("Должны видеть элемент", element, both(exists()).and(isDisplayed())); + assertThat("Должен существовать элемент", element, exists()); + assertThat("Должны видеть элемент", element, isDisplayed()); } @Step("Должны видеть на странице элементы «{0}»") @@ -99,6 +103,26 @@ public void shouldHaveText(HtmlElement element, String text) { assertThat("Текст в элементе не соответствует ожидаемому", element, hasText(text)); } + @Step("Элемент «{0}» должен содержать текст «{1}»") + public void waitUntilElementReady(HtmlElement element, int timeOut) { + int pause = 10; // milliseconds + for (int milliSeconds = 0; ; milliSeconds += pause) { + try { + element.isDisplayed(); + break; + } catch (StaleElementReferenceException e) { + if (milliSeconds > timeOut) { + throw e; + } + try { + Thread.sleep(pause); + } catch (InterruptedException e2) { + e.printStackTrace(); + } + } + } + } + private MainPage onMainPage() { return new MainPage(driver); } From eeb3d13d43d5d40612cfd57a8e17d0ed53458c07 Mon Sep 17 00:00:00 2001 From: OneginES Date: Sat, 23 Apr 2016 21:28:39 +0300 Subject: [PATCH 10/26] Add some tests. Add some objects in pageObject. --- .../school/webtests/WeatherWebTest.java | 45 ++++++++++++++++--- .../pages/blocks/widgetblocks/WidgetText.java | 43 ++++++++++++++++++ .../blocks/widgetblocks/WidgetTitle.java | 10 ++++- .../widgetblocks/infoline/InfoLine.java | 40 +++++++++++++++++ .../school/steps/websteps/DefaultSteps.java | 16 ++----- 5 files changed, 135 insertions(+), 19 deletions(-) create mode 100644 steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/infoline/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/WeatherWebTest.java index e8f3898..8f5fb6d 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 @@ -60,7 +60,7 @@ public void shouldSeeAddWidgetButtonOnPageWithQuery() { @Title("Должны видеть два виджета на главной странице после загрузки") public void shouldSeeTwoWidgetsOnMainPage() { defaultSteps.openMainPageWithCities(CITY, CITY2); - defaultSteps.shouldBeThisNumberOfWidgets(2); + defaultSteps.shouldBeThisNumberOfElements(onMainPage().getWeatherWidgets(), 2); defaultSteps.shouldSee(onMainPage().getWeatherWidgets()); } @@ -71,6 +71,39 @@ public void shouldSeeWidgetFromQuery() { defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), CITY); } + @Test + @Title("Должны видеть виджет со всеми компонентами") + public void shouldSeeAllWidgetBlocks() { + defaultSteps.openMainPageWithCities(CITY); + + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetTitle().getCurrentTimeAndData()); + + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getWeatherImage()); + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperatureDigit()); + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperatureUnit()); + + defaultSteps.shouldBeThisNumberOfElements(onMainPage().getFirstWidget().getWidgetText().getInfoLines(), 4); + + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getSunriseLine().getTitle()); + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getSunriseLine().getImage()); + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getSunriseLine().getValue()); + + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getSunsetLine().getTitle()); + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getSunsetLine().getImage()); + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getSunsetLine().getValue()); + + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getWindLine().getTitle()); + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getWindLine().getImage()); + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getWindLine().getValue()); + + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getHumidityLine().getTitle()); + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getHumidityLine().getImage()); + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getHumidityLine().getValue()); + + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetActions().getRemoveWidgetButton()); + } + @Test @Title("Должен добавиться новый виджет после щелчка на кнопке '+'") // @ru.yandex.qatools.allure.annotations.TestCaseId("4") @@ -78,7 +111,7 @@ public void shouldBeAddedNewWidget() { defaultSteps.openMainPageWithCities(CITY); int numberOfWidgets = onMainPage().getWeatherWidgets().size(); defaultSteps.clickOn(onMainPage().getAddWidgetButton()); - defaultSteps.shouldBeThisNumberOfWidgets(numberOfWidgets + 1); + defaultSteps.shouldBeThisNumberOfElements(onMainPage().getWeatherWidgets(), numberOfWidgets + 1); } @Test @@ -102,6 +135,7 @@ public void shouldSeeSuggestAfterEnterCityNameBegin() { defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); defaultSteps.eraseText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); defaultSteps.enterText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), cityNameBegin); + defaultSteps.waitUntilElementReady(onMainPage().getFirstWidget().getWidgetTitle().getFirstSuggest(), 10000); defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetTitle().getCitySuggests()); } @@ -118,7 +152,6 @@ public void shouldSeeCityInWidgetChosenInSuggest() { String cityNameInSuggest = onMainPage().getFirstWidget().getWidgetTitle().getFirstSuggest().getCityName().getText(); defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getFirstSuggest()); - defaultSteps.waitUntilElementReady(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), 10000); defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), cityNameInSuggest); @@ -138,11 +171,11 @@ public void shouldSeeCityNameInTitleAfterEraseTextInIt() { @Title("Должны видеть 0 виджетов после удаления ") public void shouldSeeNullWidgetsAfterDelete() { defaultSteps.openMainPageWithCities(CITY, CITY2); - defaultSteps.shouldBeThisNumberOfWidgets(2); + defaultSteps.shouldBeThisNumberOfElements(onMainPage().getWeatherWidgets(), 2); defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetActions().getRemoveWidgetButton()); - defaultSteps.shouldBeThisNumberOfWidgets(1); + defaultSteps.shouldBeThisNumberOfElements(onMainPage().getWeatherWidgets(), 1); defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetActions().getRemoveWidgetButton()); - defaultSteps.shouldBeThisNumberOfWidgets(0); + defaultSteps.shouldBeThisNumberOfElements(onMainPage().getWeatherWidgets(), 0); } @Test 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 b96254b..6bfe891 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 @@ -2,9 +2,12 @@ import org.openqa.selenium.Rectangle; import org.openqa.selenium.support.FindBy; +import ru.qatools.school.pages.blocks.widgetblocks.infoline.InfoLine; import ru.yandex.qatools.htmlelements.annotations.Name; import ru.yandex.qatools.htmlelements.element.HtmlElement; +import java.util.List; + /** * Created by kurau. */ @@ -14,10 +17,50 @@ public class WidgetText extends HtmlElement { @FindBy(css = ".weather-image") private HtmlElement weatherImage; + @Name("Цифра градусов") + @FindBy(css = ".weather-temperature__digit") + private HtmlElement weatherTemperatureDigit; + + @Name("Условная единица градусов") + @FindBy(css = ".weather-temperature__unit") + private HtmlElement weatherTemperatureUnit; + + @Name("Строки дополнительной информации") + @FindBy(css = ".line.info-line") + private List infoLines; + public HtmlElement getWeatherImage() { return weatherImage; } + public HtmlElement getWeatherTemperatureDigit() { + return weatherTemperatureDigit; + } + + public HtmlElement getWeatherTemperatureUnit() { + return weatherTemperatureUnit; + } + + public List getInfoLines() { + return infoLines; + } + + public InfoLine getSunriseLine() { + return getInfoLines().get(0); + } + + public InfoLine getSunsetLine() { + return getInfoLines().get(1); + } + + public InfoLine getWindLine() { + return getInfoLines().get(2); + } + + public InfoLine getHumidityLine() { + return getInfoLines().get(3); + } + 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 81ed43f..cfb8944 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 @@ -14,10 +14,14 @@ */ public class WidgetTitle extends HtmlElement { - @Name("Название города в заголовке") + @Name("Название города") @FindBy(css = ".inplace") private HtmlElement cityName; + @Name("Текущее время и дата") + @FindBy(css = ".card-title__secondary > div > div") + private HtmlElement currentTimeAndData; + @Name("Список предложенных городов") @FindBy(css = ".city-suggest") private List citySuggests; @@ -34,6 +38,10 @@ public List getCitySuggests() { return citySuggests; } + public HtmlElement getCurrentTimeAndData() { + return currentTimeAndData; + } + public CitySuggest getFirstSuggest() { return getCitySuggests().get(0); } diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/infoline/InfoLine.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/infoline/InfoLine.java new file mode 100644 index 0000000..e689331 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/infoline/InfoLine.java @@ -0,0 +1,40 @@ +package ru.qatools.school.pages.blocks.widgetblocks.infoline; + +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 onegines (Eugene Kirienko). + */ +public class InfoLine extends HtmlElement { + + @Name("Параметр") + @FindBy(css = ".info-line__title") + private HtmlElement title; + + @Name("Значение") + @FindBy(css = ".info-line__value") + private HtmlElement value; + + @Name("Иконка") + @FindBy(css = ".info-line__image") + private HtmlElement image; + + public Rectangle getRect() { + return null; + } + + public HtmlElement getTitle() { + return title; + } + + public HtmlElement getValue() { + return value; + } + + public HtmlElement getImage() { + return image; + } +} 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 eddd453..005ccd6 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 @@ -31,14 +31,6 @@ public DefaultSteps(WebDriver driver) { this.driver = driver; } - public static String getMainPage() { - return MAIN_PAGE; - } - - public static String getQuery() { - return QUERY; - } - @Step("Открываем главную страницу без параметров»") public void openMainPage() { driver.get(MAIN_PAGE); @@ -73,9 +65,9 @@ public void shouldSee(List elements) { } } - @Step("Должны увидеть {0} виджета(ов)") - public void shouldBeThisNumberOfWidgets(int count) { - assertThat("Количество виджетов не соответствует ожидаемому", onMainPage().getWeatherWidgets().size(), is(count)); + @Step("Должны увидеть «{1}» элементов(ов) в списке «{0}»") + public void shouldBeThisNumberOfElements(List elements, int count) { + assertThat("Количество элементов не соответствует ожидаемому", elements.size(), is(count)); } @Step("Кликаем по элементу {0}") @@ -103,7 +95,7 @@ public void shouldHaveText(HtmlElement element, String text) { assertThat("Текст в элементе не соответствует ожидаемому", element, hasText(text)); } - @Step("Элемент «{0}» должен содержать текст «{1}»") + @Step("Ждём элемент «{0}» максимум «{1}» милисекунд") public void waitUntilElementReady(HtmlElement element, int timeOut) { int pause = 10; // milliseconds for (int milliSeconds = 0; ; milliSeconds += pause) { From fba2f18017ebe4a936b4d0b795653c352522ba9d Mon Sep 17 00:00:00 2001 From: OneginES Date: Mon, 25 Apr 2016 00:58:18 +0300 Subject: [PATCH 11/26] Add some tests. Add some steps. Add some objects in pageObject. --- .../school/webtests/WeatherWebTest.java | 133 +++++++++++++++--- .../ru/qatools/school/pages/MainPage.java | 7 + .../pages/blocks/widgetblocks/WidgetText.java | 8 ++ .../blocks/widgetblocks/WidgetTitle.java | 10 +- .../qatools/school/rules/WebDriverRule.java | 3 +- .../school/steps/websteps/DefaultSteps.java | 57 +++++--- 6 files changed, 178 insertions(+), 40 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 8f5fb6d..f726af5 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 @@ -32,8 +32,8 @@ public void initSteps() { } @Test - @Title("Должна открыться нужная страница") -// @ru.yandex.qatools.allure.annotations.TestCaseId("NUM") + @Title("Должна открыться требуемая страница") + @ru.yandex.qatools.allure.annotations.TestCaseId("6") public void shouldBeOnCorrectPage() { defaultSteps.openMainPage(); defaultSteps.shouldBeUrl("http://weather.lanwen.ru/"); @@ -42,15 +42,15 @@ public void shouldBeOnCorrectPage() { @Test @Title("Должны видеть кнопку '+' на странице, открытой без параметров") -// @ru.yandex.qatools.allure.annotations.TestCaseId("NUM") + @ru.yandex.qatools.allure.annotations.TestCaseId("5") public void shouldSeeAddWidgetButtonOnPageWithNoQuery() { defaultSteps.openMainPage(); defaultSteps.shouldSee(onMainPage().getAddWidgetButton()); } @Test - @Title("Должны видеть кнопку '+' на странице, открытой с указанием городов в параметрах") -// @ru.yandex.qatools.allure.annotations.TestCaseId("NUM") + @Title("Должны видеть кнопку '+' на странице, открытой с указанием города в в параметрах") + @ru.yandex.qatools.allure.annotations.TestCaseId("7") public void shouldSeeAddWidgetButtonOnPageWithQuery() { defaultSteps.openMainPageWithCities(CITY); defaultSteps.shouldSee(onMainPage().getAddWidgetButton()); @@ -58,6 +58,7 @@ public void shouldSeeAddWidgetButtonOnPageWithQuery() { @Test @Title("Должны видеть два виджета на главной странице после загрузки") + @ru.yandex.qatools.allure.annotations.TestCaseId("14") public void shouldSeeTwoWidgetsOnMainPage() { defaultSteps.openMainPageWithCities(CITY, CITY2); defaultSteps.shouldBeThisNumberOfElements(onMainPage().getWeatherWidgets(), 2); @@ -66,13 +67,15 @@ public void shouldSeeTwoWidgetsOnMainPage() { @Test @Title("Должны видеть виджет города из запроса") + @ru.yandex.qatools.allure.annotations.TestCaseId("8") public void shouldSeeWidgetFromQuery() { defaultSteps.openMainPageWithCities(CITY); defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), CITY); } @Test - @Title("Должны видеть виджет со всеми компонентами") + @Title("Должны видеть все компоненты виджета") + @ru.yandex.qatools.allure.annotations.TestCaseId("9") public void shouldSeeAllWidgetBlocks() { defaultSteps.openMainPageWithCities(CITY); @@ -104,9 +107,59 @@ public void shouldSeeAllWidgetBlocks() { defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetActions().getRemoveWidgetButton()); } + @Test + @Title("Должны видеть градусы Цельсия в виджете на странице, открытой с указанием города в параметрах") + @ru.yandex.qatools.allure.annotations.TestCaseId("19") + public void shouldSeeCelsiusInWidgetOnMainPage() { + defaultSteps.openMainPageWithCities(CITY); + defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperatureUnit(), "°C"); + } + + @Test + @Title("Должны видеть в виджете градусы Кельвина после одного нажатия на указатель температуры") + @ru.yandex.qatools.allure.annotations.TestCaseId("20") + public void shouldSeeKelvinInWidgetAfterOneClick() { + defaultSteps.openMainPageWithCities(CITY); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); + defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperatureUnit(), "°K"); + } + + @Test + @Title("Должны видеть в виджете градусы Фаренгейта после двух нажатий на указатель температуры") + @ru.yandex.qatools.allure.annotations.TestCaseId("21") + public void shouldSeeFahrenheitInWidgetAfterTwoClick() { + defaultSteps.openMainPageWithCities(CITY); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); + defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperatureUnit(), "°F"); + } + + @Test + @Title("Должны видеть в виджете градусы по кайфу после трёх нажатий на указатель температуры") + @ru.yandex.qatools.allure.annotations.TestCaseId("22") + public void shouldSeeKaifInWidgetAfterThreeClick() { + defaultSteps.openMainPageWithCities(CITY); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); + defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperatureUnit(), "°Kaif"); + } + + @Test + @Title("Должны видеть в виджете градусы Цельсия после четырёх нажатий на указатель температуры") + @ru.yandex.qatools.allure.annotations.TestCaseId("23") + public void shouldSeeCelsiusInWidgetAfterFourClick() { + defaultSteps.openMainPageWithCities(CITY); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); + defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperatureUnit(), "°C"); + } + @Test @Title("Должен добавиться новый виджет после щелчка на кнопке '+'") -// @ru.yandex.qatools.allure.annotations.TestCaseId("4") + @ru.yandex.qatools.allure.annotations.TestCaseId("4") public void shouldBeAddedNewWidget() { defaultSteps.openMainPageWithCities(CITY); int numberOfWidgets = onMainPage().getWeatherWidgets().size(); @@ -116,18 +169,20 @@ public void shouldBeAddedNewWidget() { @Test @Title("Должен измениться город в первом виджете после ввода полного названия города и Return") + @ru.yandex.qatools.allure.annotations.TestCaseId("10") public void shouldBeRenamedFirstWidgetAfterEnterFullName() { defaultSteps.openMainPageWithCities(CITY); defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); defaultSteps.eraseText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); defaultSteps.enterText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), CITY2); defaultSteps.confirmText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); - defaultSteps.waitUntilElementReady(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), 10000); + defaultSteps.waitUntilElementReady(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), 3); defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), CITY2); } @Test @Title("Должны видеть саджест после ввода начала названия города") + @ru.yandex.qatools.allure.annotations.TestCaseId("13") public void shouldSeeSuggestAfterEnterCityNameBegin() { String cityNameBegin = CITY2.substring(0, (CITY2.length() > 4 ? 4 : CITY2.length())); @@ -135,12 +190,13 @@ public void shouldSeeSuggestAfterEnterCityNameBegin() { defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); defaultSteps.eraseText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); defaultSteps.enterText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), cityNameBegin); - defaultSteps.waitUntilElementReady(onMainPage().getFirstWidget().getWidgetTitle().getFirstSuggest(), 10000); + defaultSteps.waitUntilElementReady(onMainPage().getFirstWidget().getWidgetTitle().getFirstSuggest(), 2); defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetTitle().getCitySuggests()); } @Test - @Title("Должен измениться город в виджете после выбора города в саджесте") + @Title("Должен измениться город в виджете после выбора города в саджесте (на выбранный)") + @ru.yandex.qatools.allure.annotations.TestCaseId("15") public void shouldSeeCityInWidgetChosenInSuggest() { String cityNameBegin = CITY2.substring(0, (CITY2.length() > 4 ? 4 : CITY2.length())); @@ -152,13 +208,43 @@ public void shouldSeeCityInWidgetChosenInSuggest() { String cityNameInSuggest = onMainPage().getFirstWidget().getWidgetTitle().getFirstSuggest().getCityName().getText(); defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getFirstSuggest()); - defaultSteps.waitUntilElementReady(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), 10000); + defaultSteps.waitUntilElementReady(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), 2); defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), cityNameInSuggest); } + @Test + @Title("Должен исчезнуть саджест после выбора города в нём") + @ru.yandex.qatools.allure.annotations.TestCaseId("24") + public void shouldSeeNoSuggestAfterChooseCityInIt() { + String cityNameBegin = CITY2.substring(0, (CITY2.length() > 4 ? 4 : CITY2.length())); + + defaultSteps.openMainPageWithCities(CITY); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.eraseText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.enterText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), cityNameBegin); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getFirstSuggest()); + defaultSteps.shouldNotSee(onMainPage().getFirstWidget().getWidgetTitle().getCitySuggestBlock()); + } + + @Test + @Title("Должен исчезнуть саджест при клике мимо него") + @ru.yandex.qatools.allure.annotations.TestCaseId("25") + public void shouldSeeNoSuggestAfterClickNotOnIt() { + String cityNameBegin = CITY2.substring(0, (CITY2.length() > 4 ? 4 : CITY2.length())); + + defaultSteps.openMainPageWithCities(CITY); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.eraseText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.enterText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), cityNameBegin); + defaultSteps.clickOn(onMainPage().getBody()); + defaultSteps.shouldNotSee(onMainPage().getFirstWidget().getWidgetTitle().getCitySuggestBlock()); + + } + @Test @Title("Должны видеть поле с названием города после после удаления текста в нём") + @ru.yandex.qatools.allure.annotations.TestCaseId("12") public void shouldSeeCityNameInTitleAfterEraseTextInIt() { defaultSteps.openMainPageWithCities(CITY); defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); @@ -168,18 +254,28 @@ public void shouldSeeCityNameInTitleAfterEraseTextInIt() { } @Test - @Title("Должны видеть 0 виджетов после удаления ") - public void shouldSeeNullWidgetsAfterDelete() { + @Title("Должен удалиться виджет после нажатия на кнопку удаления") + @ru.yandex.qatools.allure.annotations.TestCaseId("11") + public void shouldBeDeletedOneWidget() { defaultSteps.openMainPageWithCities(CITY, CITY2); - defaultSteps.shouldBeThisNumberOfElements(onMainPage().getWeatherWidgets(), 2); + int numberOfWidgets = onMainPage().getWeatherWidgets().size(); defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetActions().getRemoveWidgetButton()); - defaultSteps.shouldBeThisNumberOfElements(onMainPage().getWeatherWidgets(), 1); + defaultSteps.shouldBeThisNumberOfElements(onMainPage().getWeatherWidgets(), numberOfWidgets - 1); + } + + @Test + @Title("Должны видеть 0 виджетов и кнопку '+' после удаления последнего виджета") + @ru.yandex.qatools.allure.annotations.TestCaseId("16") + public void shouldSeeNoWidgetsAfterDeleteLastOne() { + defaultSteps.openMainPageWithCities(CITY); defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetActions().getRemoveWidgetButton()); defaultSteps.shouldBeThisNumberOfElements(onMainPage().getWeatherWidgets(), 0); + defaultSteps.shouldSee(onMainPage().getAddWidgetButton()); } @Test @Title("После изменения города в виджете должен поменяться URL") + @ru.yandex.qatools.allure.annotations.TestCaseId("17") public void shouldChangeUrlAfterWidgetRename() { defaultSteps.openMainPageWithCities(CITY); defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); @@ -190,11 +286,14 @@ public void shouldChangeUrlAfterWidgetRename() { } @Test - @Title("После удаления города в виджете должен поменяться URL") + @Title("После удаления виджета должен поменяться URL") + @ru.yandex.qatools.allure.annotations.TestCaseId("18") public void shouldChangeUrlAfterWidgetRemove() { + String city2UrlEncode = CITY2.replace(" ", "%20"); + defaultSteps.openMainPageWithCities(CITY, CITY2); defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetActions().getRemoveWidgetButton()); - defaultSteps.shouldBeUrl("http://weather.lanwen.ru/#?cities=" + CITY2.replace(" ", "%20")); + defaultSteps.shouldBeUrl("http://weather.lanwen.ru/#?cities=" + city2UrlEncode); } 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 99f2da0..9704efd 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 @@ -17,6 +17,10 @@ */ public class MainPage { + @Name("Тело страницы") + @FindBy(tagName = "body") + private HtmlElement body; + @Name("Список виджетов") @FindBy(css = ".card.card_md") private List weatherWidgets; @@ -41,4 +45,7 @@ public HtmlElement getAddWidgetButton() { return addWidgetButton; } + public HtmlElement getBody() { + return body; + } } 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 6bfe891..76aed28 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 @@ -17,6 +17,10 @@ public class WidgetText extends HtmlElement { @FindBy(css = ".weather-image") private HtmlElement weatherImage; + @Name("Температура") + @FindBy(css = ".weather-temperature.md-12") + private HtmlElement weatherTemperature; + @Name("Цифра градусов") @FindBy(css = ".weather-temperature__digit") private HtmlElement weatherTemperatureDigit; @@ -61,6 +65,10 @@ public InfoLine getHumidityLine() { return getInfoLines().get(3); } + public HtmlElement getWeatherTemperature() { + return weatherTemperature; + } + 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 cfb8944..43a5417 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 @@ -22,8 +22,12 @@ public class WidgetTitle extends HtmlElement { @FindBy(css = ".card-title__secondary > div > div") private HtmlElement currentTimeAndData; - @Name("Список предложенных городов") + @Name("Блок предложенных городов") @FindBy(css = ".city-suggest") + private HtmlElement citySuggestBlock; + + @Name("Список предложенных городов") + @FindBy(css = ".city") private List citySuggests; public Rectangle getRect() { @@ -45,4 +49,8 @@ public HtmlElement getCurrentTimeAndData() { public CitySuggest getFirstSuggest() { return getCitySuggests().get(0); } + + public HtmlElement getCitySuggestBlock() { + return citySuggestBlock; + } } 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 index a79aac4..526e682 100644 --- a/steps-module/src/main/java/ru/qatools/school/rules/WebDriverRule.java +++ b/steps-module/src/main/java/ru/qatools/school/rules/WebDriverRule.java @@ -16,7 +16,8 @@ public class WebDriverRule extends ExternalResource { protected void before() throws Throwable { this.driver = new FirefoxDriver(); - this.driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS); + this.driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS); + driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS); } protected void after() { 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 005ccd6..e5c2fe7 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 @@ -2,9 +2,10 @@ import org.apache.commons.lang3.StringUtils; import org.openqa.selenium.Keys; -import org.openqa.selenium.StaleElementReferenceException; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; import ru.qatools.school.pages.MainPage; import ru.yandex.qatools.allure.annotations.Step; import ru.yandex.qatools.htmlelements.element.HtmlElement; @@ -13,8 +14,10 @@ import static java.lang.String.format; import static org.hamcrest.core.Is.is; +import static org.hamcrest.core.IsNot.not; import static org.junit.Assert.assertThat; -import static ru.yandex.qatools.htmlelements.matchers.WebElementMatchers.*; +import static ru.yandex.qatools.htmlelements.matchers.WebElementMatchers.hasText; +import static ru.yandex.qatools.htmlelements.matchers.WebElementMatchers.isDisplayed; /** * Created by kurau. @@ -53,14 +56,17 @@ public void shouldBeUrl(String url) { @Step("Должны видеть на странице элемент «{0}»") public void shouldSee(WebElement element) { - assertThat("Должен существовать элемент", element, exists()); assertThat("Должны видеть элемент", element, isDisplayed()); } + @Step("Должны не видеть на странице элемент «{0}»") + public void shouldNotSee(WebElement element) { + assertThat("Должны не видеть элемент", element, not(isDisplayed())); + } + @Step("Должны видеть на странице элементы «{0}»") public void shouldSee(List elements) { for (WebElement element : elements) { - assertThat("Должен существовать элемент", element, exists()); assertThat("Должны видеть элемент", element, isDisplayed()); } } @@ -95,24 +101,33 @@ public void shouldHaveText(HtmlElement element, String text) { assertThat("Текст в элементе не соответствует ожидаемому", element, hasText(text)); } - @Step("Ждём элемент «{0}» максимум «{1}» милисекунд") + @Step("Ждём элемент «{0}» максимум «{1}» секунд(ы)") public void waitUntilElementReady(HtmlElement element, int timeOut) { - int pause = 10; // milliseconds - for (int milliSeconds = 0; ; milliSeconds += pause) { - try { - element.isDisplayed(); - break; - } catch (StaleElementReferenceException e) { - if (milliSeconds > timeOut) { - throw e; - } - try { - Thread.sleep(pause); - } catch (InterruptedException e2) { - e.printStackTrace(); - } - } - } +// int pause = 10; // milliseconds +// for (int milliSeconds = 0; ; milliSeconds += pause) { +// try { +// element.isDisplayed(); +// System.out.println(element.getText()); +// break; +// } catch (StaleElementReferenceException e) { +// if (milliSeconds > timeOut * 1000) { +// System.out.println("Всё пропало!"); +// throw e; +// } +// try { +// System.out.println("Ждём: " + milliSeconds); +// Thread.sleep(pause); +// } catch (InterruptedException e2) { +// e.printStackTrace(); +// } +// } +// } + + (new WebDriverWait(driver, timeOut)). + until(ExpectedConditions.and( + ExpectedConditions.not(ExpectedConditions.stalenessOf(element)), + ExpectedConditions.visibilityOf(element)) + ); } private MainPage onMainPage() { From 3eee981f075b83e55f05aaf2a813af335af4efea Mon Sep 17 00:00:00 2001 From: OneginES Date: Mon, 25 Apr 2016 15:02:17 +0300 Subject: [PATCH 12/26] Add "import ru.yandex.qatools.allure.annotations.TestCaseId" --- .../school/webtests/WeatherWebTest.java | 45 ++++++++++--------- 1 file changed, 23 insertions(+), 22 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 f726af5..a0a48cc 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 @@ -7,6 +7,7 @@ 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; /** @@ -33,7 +34,7 @@ public void initSteps() { @Test @Title("Должна открыться требуемая страница") - @ru.yandex.qatools.allure.annotations.TestCaseId("6") + @TestCaseId("6") public void shouldBeOnCorrectPage() { defaultSteps.openMainPage(); defaultSteps.shouldBeUrl("http://weather.lanwen.ru/"); @@ -42,7 +43,7 @@ public void shouldBeOnCorrectPage() { @Test @Title("Должны видеть кнопку '+' на странице, открытой без параметров") - @ru.yandex.qatools.allure.annotations.TestCaseId("5") + @TestCaseId("5") public void shouldSeeAddWidgetButtonOnPageWithNoQuery() { defaultSteps.openMainPage(); defaultSteps.shouldSee(onMainPage().getAddWidgetButton()); @@ -50,7 +51,7 @@ public void shouldSeeAddWidgetButtonOnPageWithNoQuery() { @Test @Title("Должны видеть кнопку '+' на странице, открытой с указанием города в в параметрах") - @ru.yandex.qatools.allure.annotations.TestCaseId("7") + @TestCaseId("7") public void shouldSeeAddWidgetButtonOnPageWithQuery() { defaultSteps.openMainPageWithCities(CITY); defaultSteps.shouldSee(onMainPage().getAddWidgetButton()); @@ -58,7 +59,7 @@ public void shouldSeeAddWidgetButtonOnPageWithQuery() { @Test @Title("Должны видеть два виджета на главной странице после загрузки") - @ru.yandex.qatools.allure.annotations.TestCaseId("14") + @TestCaseId("14") public void shouldSeeTwoWidgetsOnMainPage() { defaultSteps.openMainPageWithCities(CITY, CITY2); defaultSteps.shouldBeThisNumberOfElements(onMainPage().getWeatherWidgets(), 2); @@ -67,7 +68,7 @@ public void shouldSeeTwoWidgetsOnMainPage() { @Test @Title("Должны видеть виджет города из запроса") - @ru.yandex.qatools.allure.annotations.TestCaseId("8") + @TestCaseId("8") public void shouldSeeWidgetFromQuery() { defaultSteps.openMainPageWithCities(CITY); defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), CITY); @@ -75,7 +76,7 @@ public void shouldSeeWidgetFromQuery() { @Test @Title("Должны видеть все компоненты виджета") - @ru.yandex.qatools.allure.annotations.TestCaseId("9") + @TestCaseId("9") public void shouldSeeAllWidgetBlocks() { defaultSteps.openMainPageWithCities(CITY); @@ -109,7 +110,7 @@ public void shouldSeeAllWidgetBlocks() { @Test @Title("Должны видеть градусы Цельсия в виджете на странице, открытой с указанием города в параметрах") - @ru.yandex.qatools.allure.annotations.TestCaseId("19") + @TestCaseId("19") public void shouldSeeCelsiusInWidgetOnMainPage() { defaultSteps.openMainPageWithCities(CITY); defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperatureUnit(), "°C"); @@ -117,7 +118,7 @@ public void shouldSeeCelsiusInWidgetOnMainPage() { @Test @Title("Должны видеть в виджете градусы Кельвина после одного нажатия на указатель температуры") - @ru.yandex.qatools.allure.annotations.TestCaseId("20") + @TestCaseId("20") public void shouldSeeKelvinInWidgetAfterOneClick() { defaultSteps.openMainPageWithCities(CITY); defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); @@ -126,7 +127,7 @@ public void shouldSeeKelvinInWidgetAfterOneClick() { @Test @Title("Должны видеть в виджете градусы Фаренгейта после двух нажатий на указатель температуры") - @ru.yandex.qatools.allure.annotations.TestCaseId("21") + @TestCaseId("21") public void shouldSeeFahrenheitInWidgetAfterTwoClick() { defaultSteps.openMainPageWithCities(CITY); defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); @@ -136,7 +137,7 @@ public void shouldSeeFahrenheitInWidgetAfterTwoClick() { @Test @Title("Должны видеть в виджете градусы по кайфу после трёх нажатий на указатель температуры") - @ru.yandex.qatools.allure.annotations.TestCaseId("22") + @TestCaseId("22") public void shouldSeeKaifInWidgetAfterThreeClick() { defaultSteps.openMainPageWithCities(CITY); defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); @@ -147,7 +148,7 @@ public void shouldSeeKaifInWidgetAfterThreeClick() { @Test @Title("Должны видеть в виджете градусы Цельсия после четырёх нажатий на указатель температуры") - @ru.yandex.qatools.allure.annotations.TestCaseId("23") + @TestCaseId("23") public void shouldSeeCelsiusInWidgetAfterFourClick() { defaultSteps.openMainPageWithCities(CITY); defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); @@ -159,7 +160,7 @@ public void shouldSeeCelsiusInWidgetAfterFourClick() { @Test @Title("Должен добавиться новый виджет после щелчка на кнопке '+'") - @ru.yandex.qatools.allure.annotations.TestCaseId("4") + @TestCaseId("4") public void shouldBeAddedNewWidget() { defaultSteps.openMainPageWithCities(CITY); int numberOfWidgets = onMainPage().getWeatherWidgets().size(); @@ -169,7 +170,7 @@ public void shouldBeAddedNewWidget() { @Test @Title("Должен измениться город в первом виджете после ввода полного названия города и Return") - @ru.yandex.qatools.allure.annotations.TestCaseId("10") + @TestCaseId("10") public void shouldBeRenamedFirstWidgetAfterEnterFullName() { defaultSteps.openMainPageWithCities(CITY); defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); @@ -182,7 +183,7 @@ public void shouldBeRenamedFirstWidgetAfterEnterFullName() { @Test @Title("Должны видеть саджест после ввода начала названия города") - @ru.yandex.qatools.allure.annotations.TestCaseId("13") + @TestCaseId("13") public void shouldSeeSuggestAfterEnterCityNameBegin() { String cityNameBegin = CITY2.substring(0, (CITY2.length() > 4 ? 4 : CITY2.length())); @@ -196,7 +197,7 @@ public void shouldSeeSuggestAfterEnterCityNameBegin() { @Test @Title("Должен измениться город в виджете после выбора города в саджесте (на выбранный)") - @ru.yandex.qatools.allure.annotations.TestCaseId("15") + @TestCaseId("15") public void shouldSeeCityInWidgetChosenInSuggest() { String cityNameBegin = CITY2.substring(0, (CITY2.length() > 4 ? 4 : CITY2.length())); @@ -215,7 +216,7 @@ public void shouldSeeCityInWidgetChosenInSuggest() { @Test @Title("Должен исчезнуть саджест после выбора города в нём") - @ru.yandex.qatools.allure.annotations.TestCaseId("24") + @TestCaseId("24") public void shouldSeeNoSuggestAfterChooseCityInIt() { String cityNameBegin = CITY2.substring(0, (CITY2.length() > 4 ? 4 : CITY2.length())); @@ -229,7 +230,7 @@ public void shouldSeeNoSuggestAfterChooseCityInIt() { @Test @Title("Должен исчезнуть саджест при клике мимо него") - @ru.yandex.qatools.allure.annotations.TestCaseId("25") + @TestCaseId("25") public void shouldSeeNoSuggestAfterClickNotOnIt() { String cityNameBegin = CITY2.substring(0, (CITY2.length() > 4 ? 4 : CITY2.length())); @@ -244,7 +245,7 @@ public void shouldSeeNoSuggestAfterClickNotOnIt() { @Test @Title("Должны видеть поле с названием города после после удаления текста в нём") - @ru.yandex.qatools.allure.annotations.TestCaseId("12") + @TestCaseId("12") public void shouldSeeCityNameInTitleAfterEraseTextInIt() { defaultSteps.openMainPageWithCities(CITY); defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); @@ -255,7 +256,7 @@ public void shouldSeeCityNameInTitleAfterEraseTextInIt() { @Test @Title("Должен удалиться виджет после нажатия на кнопку удаления") - @ru.yandex.qatools.allure.annotations.TestCaseId("11") + @TestCaseId("11") public void shouldBeDeletedOneWidget() { defaultSteps.openMainPageWithCities(CITY, CITY2); int numberOfWidgets = onMainPage().getWeatherWidgets().size(); @@ -265,7 +266,7 @@ public void shouldBeDeletedOneWidget() { @Test @Title("Должны видеть 0 виджетов и кнопку '+' после удаления последнего виджета") - @ru.yandex.qatools.allure.annotations.TestCaseId("16") + @TestCaseId("16") public void shouldSeeNoWidgetsAfterDeleteLastOne() { defaultSteps.openMainPageWithCities(CITY); defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetActions().getRemoveWidgetButton()); @@ -275,7 +276,7 @@ public void shouldSeeNoWidgetsAfterDeleteLastOne() { @Test @Title("После изменения города в виджете должен поменяться URL") - @ru.yandex.qatools.allure.annotations.TestCaseId("17") + @TestCaseId("17") public void shouldChangeUrlAfterWidgetRename() { defaultSteps.openMainPageWithCities(CITY); defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); @@ -287,7 +288,7 @@ public void shouldChangeUrlAfterWidgetRename() { @Test @Title("После удаления виджета должен поменяться URL") - @ru.yandex.qatools.allure.annotations.TestCaseId("18") + @TestCaseId("18") public void shouldChangeUrlAfterWidgetRemove() { String city2UrlEncode = CITY2.replace(" ", "%20"); From d465cdd27fea822637c9f1ac1a6f755f3338006a Mon Sep 17 00:00:00 2001 From: OneginES Date: Mon, 25 Apr 2016 15:11:36 +0300 Subject: [PATCH 13/26] Change logic construction to CITY2_BEGIN constant. --- .../qatools/school/webtests/WeatherWebTest.java | 17 +++++------------ 1 file changed, 5 insertions(+), 12 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 a0a48cc..dd2086b 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 @@ -18,6 +18,7 @@ public class WeatherWebTest { private static final String CITY = "Saint Petersburg"; private static final String CITY2 = "Moscow"; + private static final String CITY2_BEGIN = "Mosc"; private DefaultSteps defaultSteps; @@ -185,12 +186,10 @@ public void shouldBeRenamedFirstWidgetAfterEnterFullName() { @Title("Должны видеть саджест после ввода начала названия города") @TestCaseId("13") public void shouldSeeSuggestAfterEnterCityNameBegin() { - String cityNameBegin = CITY2.substring(0, (CITY2.length() > 4 ? 4 : CITY2.length())); - defaultSteps.openMainPageWithCities(CITY); defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); defaultSteps.eraseText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); - defaultSteps.enterText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), cityNameBegin); + defaultSteps.enterText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), CITY2_BEGIN); defaultSteps.waitUntilElementReady(onMainPage().getFirstWidget().getWidgetTitle().getFirstSuggest(), 2); defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetTitle().getCitySuggests()); } @@ -199,12 +198,10 @@ public void shouldSeeSuggestAfterEnterCityNameBegin() { @Title("Должен измениться город в виджете после выбора города в саджесте (на выбранный)") @TestCaseId("15") public void shouldSeeCityInWidgetChosenInSuggest() { - String cityNameBegin = CITY2.substring(0, (CITY2.length() > 4 ? 4 : CITY2.length())); - defaultSteps.openMainPageWithCities(CITY); defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); defaultSteps.eraseText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); - defaultSteps.enterText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), cityNameBegin); + defaultSteps.enterText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), CITY2_BEGIN); String cityNameInSuggest = onMainPage().getFirstWidget().getWidgetTitle().getFirstSuggest().getCityName().getText(); @@ -218,12 +215,10 @@ public void shouldSeeCityInWidgetChosenInSuggest() { @Title("Должен исчезнуть саджест после выбора города в нём") @TestCaseId("24") public void shouldSeeNoSuggestAfterChooseCityInIt() { - String cityNameBegin = CITY2.substring(0, (CITY2.length() > 4 ? 4 : CITY2.length())); - defaultSteps.openMainPageWithCities(CITY); defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); defaultSteps.eraseText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); - defaultSteps.enterText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), cityNameBegin); + defaultSteps.enterText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), CITY2_BEGIN); defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getFirstSuggest()); defaultSteps.shouldNotSee(onMainPage().getFirstWidget().getWidgetTitle().getCitySuggestBlock()); } @@ -232,12 +227,10 @@ public void shouldSeeNoSuggestAfterChooseCityInIt() { @Title("Должен исчезнуть саджест при клике мимо него") @TestCaseId("25") public void shouldSeeNoSuggestAfterClickNotOnIt() { - String cityNameBegin = CITY2.substring(0, (CITY2.length() > 4 ? 4 : CITY2.length())); - defaultSteps.openMainPageWithCities(CITY); defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); defaultSteps.eraseText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); - defaultSteps.enterText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), cityNameBegin); + defaultSteps.enterText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), CITY2_BEGIN); defaultSteps.clickOn(onMainPage().getBody()); defaultSteps.shouldNotSee(onMainPage().getFirstWidget().getWidgetTitle().getCitySuggestBlock()); From 70b481239358a11741adb83af3c9a676df8e33e2 Mon Sep 17 00:00:00 2001 From: OneginES Date: Mon, 25 Apr 2016 17:00:51 +0300 Subject: [PATCH 14/26] Test class is divided into two classes: smoke and regression. --- .../school/webtests/RegressionSuite.java | 214 ++++++++++++++ .../qatools/school/webtests/SmokeSuite.java | 146 ++++++++++ .../school/webtests/WeatherWebTest.java | 260 ------------------ .../school/steps/websteps/DefaultSteps.java | 20 ++ 4 files changed, 380 insertions(+), 260 deletions(-) create mode 100644 commons-module/src/test/java/ru/qatools/school/webtests/RegressionSuite.java create mode 100644 commons-module/src/test/java/ru/qatools/school/webtests/SmokeSuite.java diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/RegressionSuite.java b/commons-module/src/test/java/ru/qatools/school/webtests/RegressionSuite.java new file mode 100644 index 0000000..52823b2 --- /dev/null +++ b/commons-module/src/test/java/ru/qatools/school/webtests/RegressionSuite.java @@ -0,0 +1,214 @@ +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.TestCaseId; +import ru.yandex.qatools.allure.annotations.Title; + +/** + * Created by onegines (Eugene Kirienko) + */ +public class RegressionSuite { + + private static final String CITY = "Saint Petersburg"; + private static final String CITY2 = "Moscow"; + private static final String CITY2_BEGIN = "Mosc"; + + private DefaultSteps defaultSteps; + + @Rule + public WebDriverRule webDriverRule = new WebDriverRule(); + + @Rule + public TPInformerRule tms = new TPInformerRule("onegines"); + + @Before + public void initSteps() { + defaultSteps = new DefaultSteps(webDriverRule.getDriver()); + } + + private MainPage onMainPage() { + return new MainPage(webDriverRule.getDriver()); + } + + @Test + @Title("Должны видеть два виджета на главной странице после загрузки") + @TestCaseId("14") + public void shouldSeeTwoWidgetsOnMainPage() { + defaultSteps.openMainPageWithCities(CITY, CITY2); + defaultSteps.shouldBeThisNumberOfElements(onMainPage().getWeatherWidgets(), 2); + defaultSteps.shouldSee(onMainPage().getWeatherWidgets()); + } + + @Test + @Title("Должны видеть в виджете градусы Кельвина после одного нажатия на указатель температуры") + @TestCaseId("20") + public void shouldSeeKelvinInWidgetAfterOneClick() { + defaultSteps.openMainPageWithCities(CITY); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); + defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperatureUnit(), "°K"); + } + + @Test + @Title("Должны видеть в виджете градусы Фаренгейта после двух нажатий на указатель температуры") + @TestCaseId("21") + public void shouldSeeFahrenheitInWidgetAfterTwoClick() { + defaultSteps.openMainPageWithCities(CITY); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); + defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperatureUnit(), "°F"); + } + + @Test + @Title("Должны видеть в виджете градусы по кайфу после трёх нажатий на указатель температуры") + @TestCaseId("22") + public void shouldSeeKaifInWidgetAfterThreeClick() { + defaultSteps.openMainPageWithCities(CITY); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); + defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperatureUnit(), "°Kaif"); + } + + @Test + @Title("Должны видеть в виджете градусы Цельсия после четырёх нажатий на указатель температуры") + @TestCaseId("23") + public void shouldSeeCelsiusInWidgetAfterFourClick() { + defaultSteps.openMainPageWithCities(CITY); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); + defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperatureUnit(), "°C"); + } + + @Test + @Title("Должны видеть 0 виджетов и кнопку '+' после удаления последнего виджета") + @TestCaseId("16") + public void shouldSeeNoWidgetsAfterDeleteLastOne() { + defaultSteps.openMainPageWithCities(CITY); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetActions().getRemoveWidgetButton()); + defaultSteps.shouldBeThisNumberOfElements(onMainPage().getWeatherWidgets(), 0); + defaultSteps.shouldSee(onMainPage().getAddWidgetButton()); + } + + @Test + @Title("После изменения города в виджете должен поменяться URL") + @TestCaseId("17") + public void shouldChangeUrlAfterWidgetRename() { + defaultSteps.openMainPageWithCities(CITY); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.eraseText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.enterText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), CITY2); + defaultSteps.confirmText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.shouldBeUrl("http://weather.lanwen.ru/#?cities=" + CITY2); + } + + @Test + @Title("После удаления виджета должен поменяться URL") + @TestCaseId("18") + public void shouldChangeUrlAfterWidgetRemove() { + String city2UrlEncode = CITY2.replace(" ", "%20"); + + defaultSteps.openMainPageWithCities(CITY, CITY2); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetActions().getRemoveWidgetButton()); + defaultSteps.shouldBeUrl("http://weather.lanwen.ru/#?cities=" + city2UrlEncode); + } + + @Test + @Title("Должны видеть саджест после ввода начала названия города") + @TestCaseId("13") + public void shouldSeeSuggestAfterEnterCityNameBegin() { + defaultSteps.openMainPageWithCities(CITY); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.eraseText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.enterText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), CITY2_BEGIN); + defaultSteps.waitUntilElementReady(onMainPage().getFirstWidget().getWidgetTitle().getFirstSuggest(), 2); + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetTitle().getCitySuggests()); + } + + @Test + @Title("Должен измениться город в виджете после выбора города в саджесте (на выбранный)") + @TestCaseId("15") + public void shouldSeeCityInWidgetChosenInSuggest() { + defaultSteps.openMainPageWithCities(CITY); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.eraseText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.enterText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), CITY2_BEGIN); + + String cityNameInSuggest = onMainPage().getFirstWidget().getWidgetTitle().getFirstSuggest().getCityName().getText(); + + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getFirstSuggest()); + defaultSteps.waitUntilElementReady(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), 2); + defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), cityNameInSuggest); + + } + + @Test + @Title("Должен исчезнуть саджест после выбора города в нём") + @TestCaseId("24") + public void shouldSeeNoSuggestAfterChooseCityInIt() { + defaultSteps.openMainPageWithCities(CITY); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.eraseText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.enterText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), CITY2_BEGIN); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getFirstSuggest()); + defaultSteps.shouldNotSee(onMainPage().getFirstWidget().getWidgetTitle().getCitySuggestBlock()); + } + + @Test + @Title("Должен исчезнуть саджест при клике мимо него") + @TestCaseId("25") + public void shouldSeeNoSuggestAfterClickNotOnIt() { + defaultSteps.openMainPageWithCities(CITY); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.eraseText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.enterText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), CITY2_BEGIN); + defaultSteps.clickOn(onMainPage().getBody()); + defaultSteps.shouldNotSee(onMainPage().getFirstWidget().getWidgetTitle().getCitySuggestBlock()); + + } + + @Test + @Title("Должен остаться прежний город в виджете при клике мимо саджеста") + @TestCaseId("26") + public void shouldSeeSameWidgetCityAfterClickNotOnSuggest() { + defaultSteps.openMainPageWithCities(CITY); + + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.eraseText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.enterText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), CITY2_BEGIN); + defaultSteps.clickOn(onMainPage().getBody()); + defaultSteps.waitUntilElementReady(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), 2); + defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), CITY); + } + + @Test + @Title("В саджесте не должны присутствовать undefined элементы") + @TestCaseId("27") + public void shouldSeeNoUndefinedInSuggest() { + defaultSteps.openMainPageWithCities(CITY); + + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.eraseText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.enterText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), CITY2_BEGIN); + + defaultSteps.shouldNotHaveText(onMainPage().getFirstWidget().getWidgetTitle().getCitySuggests(), "undefined"); + } + + @Test + @Title("Должны видеть поле с названием города после после удаления текста в нём") + @TestCaseId("12") + public void shouldSeeCityNameInTitleAfterEraseTextInIt() { + defaultSteps.openMainPageWithCities(CITY); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.eraseText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.confirmText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + } +} diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/SmokeSuite.java b/commons-module/src/test/java/ru/qatools/school/webtests/SmokeSuite.java new file mode 100644 index 0000000..a5793c0 --- /dev/null +++ b/commons-module/src/test/java/ru/qatools/school/webtests/SmokeSuite.java @@ -0,0 +1,146 @@ +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.TestCaseId; +import ru.yandex.qatools.allure.annotations.Title; + +/** + * Created by onegines (Eugene Kirienko) + */ +public class SmokeSuite { + + private static final String CITY = "Saint Petersburg"; + private static final String CITY2 = "Moscow"; + private static final String CITY2_BEGIN = "Mosc"; + + private DefaultSteps defaultSteps; + + @Rule + public WebDriverRule webDriverRule = new WebDriverRule(); + + @Rule + public TPInformerRule tms = new TPInformerRule("onegines"); + + @Before + public void initSteps() { + defaultSteps = new DefaultSteps(webDriverRule.getDriver()); + } + + private MainPage onMainPage() { + return new MainPage(webDriverRule.getDriver()); + } + + @Test + @Title("Должна открыться требуемая страница") + @TestCaseId("6") + public void shouldBeOnCorrectPage() { + defaultSteps.openMainPage(); + defaultSteps.shouldBeUrl("http://weather.lanwen.ru/"); + defaultSteps.shouldBeTitle("Weather"); + } + + @Test + @Title("Должны видеть кнопку '+' на странице, открытой без параметров") + @TestCaseId("5") + public void shouldSeeAddWidgetButtonOnPageWithNoQuery() { + defaultSteps.openMainPage(); + defaultSteps.shouldSee(onMainPage().getAddWidgetButton()); + } + + @Test + @Title("Должны видеть кнопку '+' на странице, открытой с указанием города в в параметрах") + @TestCaseId("7") + public void shouldSeeAddWidgetButtonOnPageWithQuery() { + defaultSteps.openMainPageWithCities(CITY); + defaultSteps.shouldSee(onMainPage().getAddWidgetButton()); + } + + @Test + @Title("Должны видеть виджет города из запроса") + @TestCaseId("8") + public void shouldSeeWidgetFromQuery() { + defaultSteps.openMainPageWithCities(CITY); + defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), CITY); + } + + @Test + @Title("Должны видеть все компоненты виджета") + @TestCaseId("9") + public void shouldSeeAllWidgetBlocks() { + defaultSteps.openMainPageWithCities(CITY); + + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetTitle().getCurrentTimeAndData()); + + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getWeatherImage()); + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperatureDigit()); + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperatureUnit()); + + defaultSteps.shouldBeThisNumberOfElements(onMainPage().getFirstWidget().getWidgetText().getInfoLines(), 4); + + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getSunriseLine().getTitle()); + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getSunriseLine().getImage()); + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getSunriseLine().getValue()); + + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getSunsetLine().getTitle()); + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getSunsetLine().getImage()); + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getSunsetLine().getValue()); + + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getWindLine().getTitle()); + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getWindLine().getImage()); + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getWindLine().getValue()); + + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getHumidityLine().getTitle()); + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getHumidityLine().getImage()); + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getHumidityLine().getValue()); + + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetActions().getRemoveWidgetButton()); + } + + @Test + @Title("Должны видеть градусы Цельсия в виджете на странице, открытой с указанием города в параметрах") + @TestCaseId("19") + public void shouldSeeCelsiusInWidgetOnMainPage() { + defaultSteps.openMainPageWithCities(CITY); + defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperatureUnit(), "°C"); + } + + @Test + @Title("Должен добавиться новый виджет после щелчка на кнопке '+'") + @TestCaseId("4") + public void shouldBeAddedNewWidget() { + defaultSteps.openMainPageWithCities(CITY); + int numberOfWidgets = onMainPage().getWeatherWidgets().size(); + defaultSteps.clickOn(onMainPage().getAddWidgetButton()); + defaultSteps.shouldBeThisNumberOfElements(onMainPage().getWeatherWidgets(), numberOfWidgets + 1); + } + + @Test + @Title("Должен измениться город в первом виджете после ввода полного названия города и Return") + @TestCaseId("10") + public void shouldBeRenamedFirstWidgetAfterEnterFullName() { + defaultSteps.openMainPageWithCities(CITY); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.eraseText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.enterText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), CITY2); + defaultSteps.confirmText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.waitUntilElementReady(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), 3); + defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), CITY2); + } + + @Test + @Title("Должен удалиться виджет после нажатия на кнопку удаления") + @TestCaseId("11") + public void shouldBeDeletedOneWidget() { + defaultSteps.openMainPageWithCities(CITY, CITY2); + int numberOfWidgets = onMainPage().getWeatherWidgets().size(); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetActions().getRemoveWidgetButton()); + defaultSteps.shouldBeThisNumberOfElements(onMainPage().getWeatherWidgets(), numberOfWidgets - 1); + } +} 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 dd2086b..6d61419 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 @@ -2,13 +2,10 @@ 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; /** * Created by kurau. @@ -33,263 +30,6 @@ public void initSteps() { defaultSteps = new DefaultSteps(webDriverRule.getDriver()); } - @Test - @Title("Должна открыться требуемая страница") - @TestCaseId("6") - public void shouldBeOnCorrectPage() { - defaultSteps.openMainPage(); - defaultSteps.shouldBeUrl("http://weather.lanwen.ru/"); - defaultSteps.shouldBeTitle("Weather"); - } - - @Test - @Title("Должны видеть кнопку '+' на странице, открытой без параметров") - @TestCaseId("5") - public void shouldSeeAddWidgetButtonOnPageWithNoQuery() { - defaultSteps.openMainPage(); - defaultSteps.shouldSee(onMainPage().getAddWidgetButton()); - } - - @Test - @Title("Должны видеть кнопку '+' на странице, открытой с указанием города в в параметрах") - @TestCaseId("7") - public void shouldSeeAddWidgetButtonOnPageWithQuery() { - defaultSteps.openMainPageWithCities(CITY); - defaultSteps.shouldSee(onMainPage().getAddWidgetButton()); - } - - @Test - @Title("Должны видеть два виджета на главной странице после загрузки") - @TestCaseId("14") - public void shouldSeeTwoWidgetsOnMainPage() { - defaultSteps.openMainPageWithCities(CITY, CITY2); - defaultSteps.shouldBeThisNumberOfElements(onMainPage().getWeatherWidgets(), 2); - defaultSteps.shouldSee(onMainPage().getWeatherWidgets()); - } - - @Test - @Title("Должны видеть виджет города из запроса") - @TestCaseId("8") - public void shouldSeeWidgetFromQuery() { - defaultSteps.openMainPageWithCities(CITY); - defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), CITY); - } - - @Test - @Title("Должны видеть все компоненты виджета") - @TestCaseId("9") - public void shouldSeeAllWidgetBlocks() { - defaultSteps.openMainPageWithCities(CITY); - - defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); - defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetTitle().getCurrentTimeAndData()); - - defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getWeatherImage()); - defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperatureDigit()); - defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperatureUnit()); - - defaultSteps.shouldBeThisNumberOfElements(onMainPage().getFirstWidget().getWidgetText().getInfoLines(), 4); - - defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getSunriseLine().getTitle()); - defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getSunriseLine().getImage()); - defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getSunriseLine().getValue()); - - defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getSunsetLine().getTitle()); - defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getSunsetLine().getImage()); - defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getSunsetLine().getValue()); - - defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getWindLine().getTitle()); - defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getWindLine().getImage()); - defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getWindLine().getValue()); - - defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getHumidityLine().getTitle()); - defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getHumidityLine().getImage()); - defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getHumidityLine().getValue()); - - defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetActions().getRemoveWidgetButton()); - } - - @Test - @Title("Должны видеть градусы Цельсия в виджете на странице, открытой с указанием города в параметрах") - @TestCaseId("19") - public void shouldSeeCelsiusInWidgetOnMainPage() { - defaultSteps.openMainPageWithCities(CITY); - defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperatureUnit(), "°C"); - } - - @Test - @Title("Должны видеть в виджете градусы Кельвина после одного нажатия на указатель температуры") - @TestCaseId("20") - public void shouldSeeKelvinInWidgetAfterOneClick() { - defaultSteps.openMainPageWithCities(CITY); - defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); - defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperatureUnit(), "°K"); - } - - @Test - @Title("Должны видеть в виджете градусы Фаренгейта после двух нажатий на указатель температуры") - @TestCaseId("21") - public void shouldSeeFahrenheitInWidgetAfterTwoClick() { - defaultSteps.openMainPageWithCities(CITY); - defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); - defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); - defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperatureUnit(), "°F"); - } - - @Test - @Title("Должны видеть в виджете градусы по кайфу после трёх нажатий на указатель температуры") - @TestCaseId("22") - public void shouldSeeKaifInWidgetAfterThreeClick() { - defaultSteps.openMainPageWithCities(CITY); - defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); - defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); - defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); - defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperatureUnit(), "°Kaif"); - } - - @Test - @Title("Должны видеть в виджете градусы Цельсия после четырёх нажатий на указатель температуры") - @TestCaseId("23") - public void shouldSeeCelsiusInWidgetAfterFourClick() { - defaultSteps.openMainPageWithCities(CITY); - defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); - defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); - defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); - defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); - defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperatureUnit(), "°C"); - } - - @Test - @Title("Должен добавиться новый виджет после щелчка на кнопке '+'") - @TestCaseId("4") - public void shouldBeAddedNewWidget() { - defaultSteps.openMainPageWithCities(CITY); - int numberOfWidgets = onMainPage().getWeatherWidgets().size(); - defaultSteps.clickOn(onMainPage().getAddWidgetButton()); - defaultSteps.shouldBeThisNumberOfElements(onMainPage().getWeatherWidgets(), numberOfWidgets + 1); - } - - @Test - @Title("Должен измениться город в первом виджете после ввода полного названия города и Return") - @TestCaseId("10") - public void shouldBeRenamedFirstWidgetAfterEnterFullName() { - defaultSteps.openMainPageWithCities(CITY); - defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); - defaultSteps.eraseText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); - defaultSteps.enterText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), CITY2); - defaultSteps.confirmText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); - defaultSteps.waitUntilElementReady(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), 3); - defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), CITY2); - } - - @Test - @Title("Должны видеть саджест после ввода начала названия города") - @TestCaseId("13") - public void shouldSeeSuggestAfterEnterCityNameBegin() { - defaultSteps.openMainPageWithCities(CITY); - defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); - defaultSteps.eraseText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); - defaultSteps.enterText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), CITY2_BEGIN); - defaultSteps.waitUntilElementReady(onMainPage().getFirstWidget().getWidgetTitle().getFirstSuggest(), 2); - defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetTitle().getCitySuggests()); - } - - @Test - @Title("Должен измениться город в виджете после выбора города в саджесте (на выбранный)") - @TestCaseId("15") - public void shouldSeeCityInWidgetChosenInSuggest() { - defaultSteps.openMainPageWithCities(CITY); - defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); - defaultSteps.eraseText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); - defaultSteps.enterText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), CITY2_BEGIN); - - String cityNameInSuggest = onMainPage().getFirstWidget().getWidgetTitle().getFirstSuggest().getCityName().getText(); - - defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getFirstSuggest()); - defaultSteps.waitUntilElementReady(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), 2); - defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), cityNameInSuggest); - - } - - @Test - @Title("Должен исчезнуть саджест после выбора города в нём") - @TestCaseId("24") - public void shouldSeeNoSuggestAfterChooseCityInIt() { - defaultSteps.openMainPageWithCities(CITY); - defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); - defaultSteps.eraseText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); - defaultSteps.enterText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), CITY2_BEGIN); - defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getFirstSuggest()); - defaultSteps.shouldNotSee(onMainPage().getFirstWidget().getWidgetTitle().getCitySuggestBlock()); - } - - @Test - @Title("Должен исчезнуть саджест при клике мимо него") - @TestCaseId("25") - public void shouldSeeNoSuggestAfterClickNotOnIt() { - defaultSteps.openMainPageWithCities(CITY); - defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); - defaultSteps.eraseText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); - defaultSteps.enterText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), CITY2_BEGIN); - defaultSteps.clickOn(onMainPage().getBody()); - defaultSteps.shouldNotSee(onMainPage().getFirstWidget().getWidgetTitle().getCitySuggestBlock()); - - } - - @Test - @Title("Должны видеть поле с названием города после после удаления текста в нём") - @TestCaseId("12") - public void shouldSeeCityNameInTitleAfterEraseTextInIt() { - defaultSteps.openMainPageWithCities(CITY); - defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); - defaultSteps.eraseText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); - defaultSteps.confirmText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); - defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); - } - - @Test - @Title("Должен удалиться виджет после нажатия на кнопку удаления") - @TestCaseId("11") - public void shouldBeDeletedOneWidget() { - defaultSteps.openMainPageWithCities(CITY, CITY2); - int numberOfWidgets = onMainPage().getWeatherWidgets().size(); - defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetActions().getRemoveWidgetButton()); - defaultSteps.shouldBeThisNumberOfElements(onMainPage().getWeatherWidgets(), numberOfWidgets - 1); - } - - @Test - @Title("Должны видеть 0 виджетов и кнопку '+' после удаления последнего виджета") - @TestCaseId("16") - public void shouldSeeNoWidgetsAfterDeleteLastOne() { - defaultSteps.openMainPageWithCities(CITY); - defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetActions().getRemoveWidgetButton()); - defaultSteps.shouldBeThisNumberOfElements(onMainPage().getWeatherWidgets(), 0); - defaultSteps.shouldSee(onMainPage().getAddWidgetButton()); - } - - @Test - @Title("После изменения города в виджете должен поменяться URL") - @TestCaseId("17") - public void shouldChangeUrlAfterWidgetRename() { - defaultSteps.openMainPageWithCities(CITY); - defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); - defaultSteps.eraseText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); - defaultSteps.enterText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), CITY2); - defaultSteps.confirmText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); - defaultSteps.shouldBeUrl("http://weather.lanwen.ru/#?cities=" + CITY2); - } - - @Test - @Title("После удаления виджета должен поменяться URL") - @TestCaseId("18") - public void shouldChangeUrlAfterWidgetRemove() { - String city2UrlEncode = CITY2.replace(" ", "%20"); - - defaultSteps.openMainPageWithCities(CITY, CITY2); - defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetActions().getRemoveWidgetButton()); - defaultSteps.shouldBeUrl("http://weather.lanwen.ru/#?cities=" + city2UrlEncode); - } - private MainPage onMainPage() { return new MainPage(webDriverRule.getDriver()); } 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 e5c2fe7..114ab91 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 @@ -71,6 +71,13 @@ public void shouldSee(List elements) { } } + @Step("Должны не видеть на странице элементы «{0}»") + public void shouldNotSee(List elements) { + for (WebElement element : elements) { + assertThat("Должны не видеть элемент", element, isDisplayed()); + } + } + @Step("Должны увидеть «{1}» элементов(ов) в списке «{0}»") public void shouldBeThisNumberOfElements(List elements, int count) { assertThat("Количество элементов не соответствует ожидаемому", elements.size(), is(count)); @@ -101,6 +108,19 @@ public void shouldHaveText(HtmlElement element, String text) { assertThat("Текст в элементе не соответствует ожидаемому", element, hasText(text)); } + @Step("Элемент «{0}» не должен содержать текст «{1}»") + public void shouldNotHaveText(HtmlElement element, String text) { + assertThat("Текст в элементе должен быть другим", element, not(hasText(text))); + } + + @Step("Элементы в «{0}» не должны содержать текст «{1}»") + public void shouldNotHaveText(List elements, String text) { + for (WebElement element : elements) { + assertThat("Текст в элементе должен быть другим", element, not(hasText(text))); + } + + } + @Step("Ждём элемент «{0}» максимум «{1}» секунд(ы)") public void waitUntilElementReady(HtmlElement element, int timeOut) { // int pause = 10; // milliseconds From 4ca431a07aebc36b307771ad2762aeb7bd2554b2 Mon Sep 17 00:00:00 2001 From: OneginES Date: Mon, 25 Apr 2016 20:35:50 +0300 Subject: [PATCH 15/26] Correction of mistakes --- .../test/java/ru/qatools/school/webtests/SmokeSuite.java | 4 ++-- .../school/pages/blocks/widgetblocks/WidgetTitle.java | 6 +++--- .../java/ru/qatools/school/steps/websteps/DefaultSteps.java | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/SmokeSuite.java b/commons-module/src/test/java/ru/qatools/school/webtests/SmokeSuite.java index a5793c0..00780e3 100644 --- a/commons-module/src/test/java/ru/qatools/school/webtests/SmokeSuite.java +++ b/commons-module/src/test/java/ru/qatools/school/webtests/SmokeSuite.java @@ -54,7 +54,7 @@ public void shouldSeeAddWidgetButtonOnPageWithNoQuery() { } @Test - @Title("Должны видеть кнопку '+' на странице, открытой с указанием города в в параметрах") + @Title("Должны видеть кнопку '+' на странице, открытой с указанием города в параметрах") @TestCaseId("7") public void shouldSeeAddWidgetButtonOnPageWithQuery() { defaultSteps.openMainPageWithCities(CITY); @@ -76,7 +76,7 @@ public void shouldSeeAllWidgetBlocks() { defaultSteps.openMainPageWithCities(CITY); defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); - defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetTitle().getCurrentTimeAndData()); + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetTitle().getCurrentTimeAndDate()); defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getWeatherImage()); defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperatureDigit()); 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 43a5417..ee08b65 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 @@ -20,7 +20,7 @@ public class WidgetTitle extends HtmlElement { @Name("Текущее время и дата") @FindBy(css = ".card-title__secondary > div > div") - private HtmlElement currentTimeAndData; + private HtmlElement currentTimeAndDate; @Name("Блок предложенных городов") @FindBy(css = ".city-suggest") @@ -42,8 +42,8 @@ public List getCitySuggests() { return citySuggests; } - public HtmlElement getCurrentTimeAndData() { - return currentTimeAndData; + public HtmlElement getCurrentTimeAndDate() { + return currentTimeAndDate; } public CitySuggest getFirstSuggest() { 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 114ab91..16f84eb 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 @@ -143,8 +143,8 @@ public void waitUntilElementReady(HtmlElement element, int timeOut) { // } // } - (new WebDriverWait(driver, timeOut)). - until(ExpectedConditions.and( + (new WebDriverWait(driver, timeOut)) + .until(ExpectedConditions.and( ExpectedConditions.not(ExpectedConditions.stalenessOf(element)), ExpectedConditions.visibilityOf(element)) ); From 5690d0abc9bd757c38741506ae258a7fee2b1b48 Mon Sep 17 00:00:00 2001 From: OneginES Date: Mon, 25 Apr 2016 22:06:39 +0300 Subject: [PATCH 16/26] Add clickOn() for several times. --- .../qatools/school/webtests/RegressionSuite.java | 14 ++++---------- .../school/steps/websteps/DefaultSteps.java | 7 +++++++ 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/RegressionSuite.java b/commons-module/src/test/java/ru/qatools/school/webtests/RegressionSuite.java index 52823b2..4940c9f 100644 --- a/commons-module/src/test/java/ru/qatools/school/webtests/RegressionSuite.java +++ b/commons-module/src/test/java/ru/qatools/school/webtests/RegressionSuite.java @@ -50,7 +50,7 @@ public void shouldSeeTwoWidgetsOnMainPage() { @TestCaseId("20") public void shouldSeeKelvinInWidgetAfterOneClick() { defaultSteps.openMainPageWithCities(CITY); - defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature(), 1); defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperatureUnit(), "°K"); } @@ -59,8 +59,7 @@ public void shouldSeeKelvinInWidgetAfterOneClick() { @TestCaseId("21") public void shouldSeeFahrenheitInWidgetAfterTwoClick() { defaultSteps.openMainPageWithCities(CITY); - defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); - defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature(), 2); defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperatureUnit(), "°F"); } @@ -69,9 +68,7 @@ public void shouldSeeFahrenheitInWidgetAfterTwoClick() { @TestCaseId("22") public void shouldSeeKaifInWidgetAfterThreeClick() { defaultSteps.openMainPageWithCities(CITY); - defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); - defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); - defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature(), 3); defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperatureUnit(), "°Kaif"); } @@ -80,10 +77,7 @@ public void shouldSeeKaifInWidgetAfterThreeClick() { @TestCaseId("23") public void shouldSeeCelsiusInWidgetAfterFourClick() { defaultSteps.openMainPageWithCities(CITY); - defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); - defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); - defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); - defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature()); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperature(), 4); defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperatureUnit(), "°C"); } 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 16f84eb..d93f33f 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 @@ -88,6 +88,13 @@ public void clickOn(HtmlElement element) { element.click(); } + @Step("Кликаем по элементу {0} {1} раз") + public void clickOn(HtmlElement element, int n) { + for (int i = 0; i < n; i++) { + element.click(); + } + } + @Step("Удаляем текст в элементе «{0}»") public void eraseText(WebElement element) { element.clear(); From d00ccdcd23e5a6cb20d68bced5c4f1bd457ff9fb Mon Sep 17 00:00:00 2001 From: OneginES Date: Tue, 26 Apr 2016 03:20:37 +0300 Subject: [PATCH 17/26] everyItem is added --- .../school/webtests/RegressionSuite.java | 16 ++++-- .../qatools/school/webtests/SmokeSuite.java | 51 ++++++++++-------- .../school/steps/websteps/DefaultSteps.java | 53 +++++-------------- 3 files changed, 53 insertions(+), 67 deletions(-) diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/RegressionSuite.java b/commons-module/src/test/java/ru/qatools/school/webtests/RegressionSuite.java index 4940c9f..1de778b 100644 --- a/commons-module/src/test/java/ru/qatools/school/webtests/RegressionSuite.java +++ b/commons-module/src/test/java/ru/qatools/school/webtests/RegressionSuite.java @@ -10,6 +10,11 @@ import ru.yandex.qatools.allure.annotations.TestCaseId; import ru.yandex.qatools.allure.annotations.Title; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; + +import static java.lang.String.format; + /** * Created by onegines (Eugene Kirienko) */ @@ -94,24 +99,27 @@ public void shouldSeeNoWidgetsAfterDeleteLastOne() { @Test @Title("После изменения города в виджете должен поменяться URL") @TestCaseId("17") - public void shouldChangeUrlAfterWidgetRename() { + public void shouldChangeUrlAfterWidgetRename() throws UnsupportedEncodingException { + String city2UrlEncode = URLEncoder.encode(CITY2, "UTF-8"); + defaultSteps.openMainPageWithCities(CITY); defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); defaultSteps.eraseText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); defaultSteps.enterText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), CITY2); defaultSteps.confirmText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); - defaultSteps.shouldBeUrl("http://weather.lanwen.ru/#?cities=" + CITY2); + defaultSteps.shouldBeUrl(DefaultSteps.MAIN_PAGE + format(DefaultSteps.QUERY, city2UrlEncode)); } @Test @Title("После удаления виджета должен поменяться URL") @TestCaseId("18") - public void shouldChangeUrlAfterWidgetRemove() { - String city2UrlEncode = CITY2.replace(" ", "%20"); + public void shouldChangeUrlAfterWidgetRemove() throws UnsupportedEncodingException { + String city2UrlEncode = URLEncoder.encode(CITY2, "UTF-8"); defaultSteps.openMainPageWithCities(CITY, CITY2); defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetActions().getRemoveWidgetButton()); defaultSteps.shouldBeUrl("http://weather.lanwen.ru/#?cities=" + city2UrlEncode); + defaultSteps.shouldBeUrl(DefaultSteps.MAIN_PAGE + format(DefaultSteps.QUERY, city2UrlEncode)); } @Test diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/SmokeSuite.java b/commons-module/src/test/java/ru/qatools/school/webtests/SmokeSuite.java index 00780e3..a78b7d3 100644 --- a/commons-module/src/test/java/ru/qatools/school/webtests/SmokeSuite.java +++ b/commons-module/src/test/java/ru/qatools/school/webtests/SmokeSuite.java @@ -9,6 +9,11 @@ import ru.qatools.school.tp.TPInformerRule; 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; + +import static java.util.Arrays.asList; /** * Created by onegines (Eugene Kirienko) @@ -17,7 +22,7 @@ public class SmokeSuite { private static final String CITY = "Saint Petersburg"; private static final String CITY2 = "Moscow"; - private static final String CITY2_BEGIN = "Mosc"; + private static final String TITLE = "Weather"; private DefaultSteps defaultSteps; @@ -41,8 +46,8 @@ private MainPage onMainPage() { @TestCaseId("6") public void shouldBeOnCorrectPage() { defaultSteps.openMainPage(); - defaultSteps.shouldBeUrl("http://weather.lanwen.ru/"); - defaultSteps.shouldBeTitle("Weather"); + defaultSteps.shouldBeUrl(DefaultSteps.MAIN_PAGE); + defaultSteps.shouldBeTitle(TITLE); } @Test @@ -75,32 +80,34 @@ public void shouldSeeWidgetFromQuery() { public void shouldSeeAllWidgetBlocks() { defaultSteps.openMainPageWithCities(CITY); - defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); - defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetTitle().getCurrentTimeAndDate()); + List allWidgetBlocks = asList( + onMainPage().getFirstWidget().getWidgetTitle().getCityName(), + onMainPage().getFirstWidget().getWidgetTitle().getCurrentTimeAndDate(), - defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getWeatherImage()); - defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperatureDigit()); - defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperatureUnit()); + onMainPage().getFirstWidget().getWidgetText().getWeatherImage(), + onMainPage().getFirstWidget().getWidgetText().getWeatherTemperatureDigit(), + onMainPage().getFirstWidget().getWidgetText().getWeatherTemperatureUnit(), - defaultSteps.shouldBeThisNumberOfElements(onMainPage().getFirstWidget().getWidgetText().getInfoLines(), 4); + onMainPage().getFirstWidget().getWidgetText().getSunriseLine().getTitle(), + onMainPage().getFirstWidget().getWidgetText().getSunriseLine().getImage(), + onMainPage().getFirstWidget().getWidgetText().getSunriseLine().getValue(), - defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getSunriseLine().getTitle()); - defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getSunriseLine().getImage()); - defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getSunriseLine().getValue()); + onMainPage().getFirstWidget().getWidgetText().getSunsetLine().getTitle(), + onMainPage().getFirstWidget().getWidgetText().getSunsetLine().getImage(), + onMainPage().getFirstWidget().getWidgetText().getSunsetLine().getValue(), - defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getSunsetLine().getTitle()); - defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getSunsetLine().getImage()); - defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getSunsetLine().getValue()); + onMainPage().getFirstWidget().getWidgetText().getWindLine().getTitle(), + onMainPage().getFirstWidget().getWidgetText().getWindLine().getImage(), + onMainPage().getFirstWidget().getWidgetText().getWindLine().getValue(), - defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getWindLine().getTitle()); - defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getWindLine().getImage()); - defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getWindLine().getValue()); + onMainPage().getFirstWidget().getWidgetText().getHumidityLine().getTitle(), + onMainPage().getFirstWidget().getWidgetText().getHumidityLine().getImage(), + onMainPage().getFirstWidget().getWidgetText().getHumidityLine().getValue(), - defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getHumidityLine().getTitle()); - defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getHumidityLine().getImage()); - defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getHumidityLine().getValue()); + onMainPage().getFirstWidget().getWidgetActions().getRemoveWidgetButton() + ); - defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetActions().getRemoveWidgetButton()); + defaultSteps.shouldSee(allWidgetBlocks); } @Test 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 d93f33f..adafd57 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 @@ -10,14 +10,16 @@ import ru.yandex.qatools.allure.annotations.Step; import ru.yandex.qatools.htmlelements.element.HtmlElement; +import java.util.ArrayList; import java.util.List; import static java.lang.String.format; +import static org.hamcrest.Matchers.allOf; +import static org.hamcrest.core.Every.everyItem; import static org.hamcrest.core.Is.is; import static org.hamcrest.core.IsNot.not; 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 ru.yandex.qatools.htmlelements.matchers.WebElementMatchers.*; /** * Created by kurau. @@ -25,8 +27,8 @@ */ public class DefaultSteps { - private static final String MAIN_PAGE = "http://weather.lanwen.ru/"; - private static final String QUERY = "#?cities=%s"; + public static final String MAIN_PAGE = "http://weather.lanwen.ru/"; + public static final String QUERY = "#?cities=%s"; private WebDriver driver; @@ -56,26 +58,17 @@ public void shouldBeUrl(String url) { @Step("Должны видеть на странице элемент «{0}»") public void shouldSee(WebElement element) { - assertThat("Должны видеть элемент", element, isDisplayed()); - } - - @Step("Должны не видеть на странице элемент «{0}»") - public void shouldNotSee(WebElement element) { - assertThat("Должны не видеть элемент", element, not(isDisplayed())); + assertThat("Должны видеть элемент", element, allOf(exists(), isDisplayed())); } @Step("Должны видеть на странице элементы «{0}»") public void shouldSee(List elements) { - for (WebElement element : elements) { - assertThat("Должны видеть элемент", element, isDisplayed()); - } + assertThat("Должны видеть элемент", elements, everyItem(allOf(exists(), isDisplayed()))); } - @Step("Должны не видеть на странице элементы «{0}»") - public void shouldNotSee(List elements) { - for (WebElement element : elements) { - assertThat("Должны не видеть элемент", element, isDisplayed()); - } + @Step("Должны не видеть на странице элемент «{0}»") + public void shouldNotSee(WebElement element) { + assertThat("Должны не видеть элемент", element, not(isDisplayed())); } @Step("Должны увидеть «{1}» элементов(ов) в списке «{0}»") @@ -122,34 +115,12 @@ public void shouldNotHaveText(HtmlElement element, String text) { @Step("Элементы в «{0}» не должны содержать текст «{1}»") public void shouldNotHaveText(List elements, String text) { - for (WebElement element : elements) { - assertThat("Текст в элементе должен быть другим", element, not(hasText(text))); - } + assertThat("Текст в элементе должен быть другим", new ArrayList<>(elements), everyItem(not(hasText(text)))); } @Step("Ждём элемент «{0}» максимум «{1}» секунд(ы)") public void waitUntilElementReady(HtmlElement element, int timeOut) { -// int pause = 10; // milliseconds -// for (int milliSeconds = 0; ; milliSeconds += pause) { -// try { -// element.isDisplayed(); -// System.out.println(element.getText()); -// break; -// } catch (StaleElementReferenceException e) { -// if (milliSeconds > timeOut * 1000) { -// System.out.println("Всё пропало!"); -// throw e; -// } -// try { -// System.out.println("Ждём: " + milliSeconds); -// Thread.sleep(pause); -// } catch (InterruptedException e2) { -// e.printStackTrace(); -// } -// } -// } - (new WebDriverWait(driver, timeOut)) .until(ExpectedConditions.and( ExpectedConditions.not(ExpectedConditions.stalenessOf(element)), From ae321811d11546efc2005325af97c8c34ff86f65 Mon Sep 17 00:00:00 2001 From: OneginES Date: Thu, 28 Apr 2016 01:31:02 +0300 Subject: [PATCH 18/26] New module. Add dependencies. Add tests from presentation. --- api-tests-module/pom.xml | 35 +++++++++++++++++ api-tests-module/src/test/java/MyService.java | 12 ++++++ .../src/test/java/RestassuredTests.java | 25 ++++++++++++ .../src/test/java/RetrofitTests.java | 39 +++++++++++++++++++ .../src/test/java/Temperature.java | 17 ++++++++ .../src/test/java/WeatherResp.java | 18 +++++++++ commons-module/pom.xml | 1 - .../school/webtests/RegressionSuite.java | 29 ++++++++++++++ pom.xml | 18 ++++----- steps-module/pom.xml | 1 - .../school/steps/websteps/DefaultSteps.java | 2 +- 11 files changed, 184 insertions(+), 13 deletions(-) create mode 100644 api-tests-module/pom.xml create mode 100644 api-tests-module/src/test/java/MyService.java create mode 100644 api-tests-module/src/test/java/RestassuredTests.java create mode 100644 api-tests-module/src/test/java/RetrofitTests.java create mode 100644 api-tests-module/src/test/java/Temperature.java create mode 100644 api-tests-module/src/test/java/WeatherResp.java diff --git a/api-tests-module/pom.xml b/api-tests-module/pom.xml new file mode 100644 index 0000000..72d211c --- /dev/null +++ b/api-tests-module/pom.xml @@ -0,0 +1,35 @@ + + + 4.0.0 + + + school-2016 + ru.qatools.school + 1.0-SNAPSHOT + + + api-tests-module + + API Module + + + + com.squareup.retrofit2 + retrofit + 2.0.2 + + + com.squareup.retrofit2 + converter-gson + 2.0.2 + + + com.jayway.restassured + rest-assured + 2.9.0 + test + + + diff --git a/api-tests-module/src/test/java/MyService.java b/api-tests-module/src/test/java/MyService.java new file mode 100644 index 0000000..2847d85 --- /dev/null +++ b/api-tests-module/src/test/java/MyService.java @@ -0,0 +1,12 @@ +import retrofit2.Call; +import retrofit2.http.GET; +import retrofit2.http.Query; + +/** + * Created by onegines (Eugene Kirienko) + */ +public interface MyService { + + @GET("/api/weather") + Call weather(@Query("city") String city); +} diff --git a/api-tests-module/src/test/java/RestassuredTests.java b/api-tests-module/src/test/java/RestassuredTests.java new file mode 100644 index 0000000..1908f91 --- /dev/null +++ b/api-tests-module/src/test/java/RestassuredTests.java @@ -0,0 +1,25 @@ +import org.apache.http.HttpStatus; +import org.junit.Test; + +import static com.jayway.restassured.RestAssured.given; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.core.IsEqual.equalTo; + +/** + * Created by onegines (Eugene Kirienko) + */ +public class RestassuredTests { + + @Test + public void simpleTest() throws Exception { + given().baseUri("http://weather.lanwen.ru") + .basePath("api").param("city", "Moscow") + .get("weather") + .then().assertThat().statusCode(HttpStatus.SC_OK) + .and().body("city", equalTo("Moscow")) + .and().body("temperatures", hasSize(4)) + .and().body("temperatures[0].value", + equalTo(12.24f)); + } + +} diff --git a/api-tests-module/src/test/java/RetrofitTests.java b/api-tests-module/src/test/java/RetrofitTests.java new file mode 100644 index 0000000..6863c5f --- /dev/null +++ b/api-tests-module/src/test/java/RetrofitTests.java @@ -0,0 +1,39 @@ +import org.apache.http.HttpStatus; +import org.junit.Test; +import retrofit2.Response; +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; +import retrofit2.Call; + +import java.io.IOException; + +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.core.Is.is; +import static org.hamcrest.core.IsEqual.equalTo; +import static org.junit.Assert.assertThat; + +/** + * Created by onegines (Eugene Kirienko) + */ +public class RetrofitTests { + + @Test + public void simpleTest() throws IOException { + + Retrofit retrofit = new Retrofit.Builder() + .baseUrl("http://weather.lanwen.ru") + .addConverterFactory(GsonConverterFactory.create()) + .build(); + + MyService service = retrofit.create(MyService.class); + + Call req = service.weather("Moscow"); + Response resp = req.execute(); + + assertThat(resp.code(), is(HttpStatus.SC_OK)); + assertThat(resp.body().getCity(), equalTo("Moscow")); + assertThat(resp.body().getTemperatures(), hasSize(4)); + assertThat(resp.body().getTemperatures().get(0).getValue(), equalTo(9.0)); + } + +} diff --git a/api-tests-module/src/test/java/Temperature.java b/api-tests-module/src/test/java/Temperature.java new file mode 100644 index 0000000..ccdc5f7 --- /dev/null +++ b/api-tests-module/src/test/java/Temperature.java @@ -0,0 +1,17 @@ +/** + * Created by onegines (Eugene Kirienko) + */ +public class Temperature { + + public float value; + + public String unit; + + public float getValue() { + return value; + } + + public String getUnit() { + return unit; + } +} diff --git a/api-tests-module/src/test/java/WeatherResp.java b/api-tests-module/src/test/java/WeatherResp.java new file mode 100644 index 0000000..67601b6 --- /dev/null +++ b/api-tests-module/src/test/java/WeatherResp.java @@ -0,0 +1,18 @@ +import java.util.List; + +/** + * Created by onegines (Eugene Kirienko) + */ +public class WeatherResp { + public String city; + + public String getCity() { + return city; + } + + public List temperatures; + + public List getTemperatures() { + return temperatures; + } +} diff --git a/commons-module/pom.xml b/commons-module/pom.xml index b1372c7..8a2cabe 100644 --- a/commons-module/pom.xml +++ b/commons-module/pom.xml @@ -48,5 +48,4 @@ - diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/RegressionSuite.java b/commons-module/src/test/java/ru/qatools/school/webtests/RegressionSuite.java index 1de778b..3f68a14 100644 --- a/commons-module/src/test/java/ru/qatools/school/webtests/RegressionSuite.java +++ b/commons-module/src/test/java/ru/qatools/school/webtests/RegressionSuite.java @@ -1,5 +1,6 @@ package ru.qatools.school.webtests; +import org.apache.http.HttpStatus; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -10,10 +11,15 @@ import ru.yandex.qatools.allure.annotations.TestCaseId; import ru.yandex.qatools.allure.annotations.Title; +import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import static java.lang.String.format; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.core.Is.is; +import static org.hamcrest.core.IsEqual.equalTo; +import static org.junit.Assert.assertThat; /** * Created by onegines (Eugene Kirienko) @@ -213,4 +219,27 @@ public void shouldSeeCityNameInTitleAfterEraseTextInIt() { defaultSteps.confirmText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); } + + /** + * Created by onegines (Eugene Kirienko) + */ + public static class RetrofitTests { + + @Test + public void simpleTest() throws IOException { + Retrofit retrofit = new Retrofit.Builder() + .baseUrl("http://weather.lanwen.ru") + .addConverterFactory(GsonConverterFactory.create()) + .build(); + MyService service = retrofit.create(MyService.class); + Call req = service.weather("Moscow"); + Response resp = req.execute(); + assertThat(resp.code(), is(HttpStatus.SC_OK)); + assertThat(resp.body().getCity(), equalTo("Moscow")); + assertThat(resp.body().getTemperatures(), hasSize(4)); + assertThat(resp.body().getTemperatures().get(0).getValue(), + equalTo(9.0)); + } + + } } diff --git a/pom.xml b/pom.xml index 767f14f..79cbc95 100644 --- a/pom.xml +++ b/pom.xml @@ -15,6 +15,7 @@ steps-module commons-module + api-tests-module @@ -26,14 +27,6 @@ 1.8.5 - - - junit - junit - 4.12 - - - @@ -76,6 +69,13 @@ + + + junit + junit + 4.12 + + @@ -116,6 +116,4 @@ - - diff --git a/steps-module/pom.xml b/steps-module/pom.xml index 7e8b809..925fe41 100644 --- a/steps-module/pom.xml +++ b/steps-module/pom.xml @@ -50,5 +50,4 @@ rest-assured - 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 adafd57..3e123f9 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 @@ -15,6 +15,7 @@ import static java.lang.String.format; import static org.hamcrest.Matchers.allOf; +import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.core.Every.everyItem; import static org.hamcrest.core.Is.is; import static org.hamcrest.core.IsNot.not; @@ -116,7 +117,6 @@ public void shouldNotHaveText(HtmlElement element, String text) { @Step("Элементы в «{0}» не должны содержать текст «{1}»") public void shouldNotHaveText(List elements, String text) { assertThat("Текст в элементе должен быть другим", new ArrayList<>(elements), everyItem(not(hasText(text)))); - } @Step("Ждём элемент «{0}» максимум «{1}» секунд(ы)") From 14c98f3878bf92448f253d7dc664737ad5aee564 Mon Sep 17 00:00:00 2001 From: OneginES Date: Sat, 30 Apr 2016 19:02:43 +0300 Subject: [PATCH 19/26] Refactor project structure. Add two autotests for API. --- api-tests-module/pom.xml | 16 +--- api-tests-module/src/test/java/MyService.java | 12 --- .../src/test/java/RestassuredTests.java | 25 ------ .../src/test/java/RetrofitTests.java | 39 --------- .../school/apitests/RestassuredTests.java | 53 ++++++++++++ .../school/apitests/RetrofitTests.java | 80 +++++++++++++++++++ .../school/webtests/RegressionSuite.java | 29 ------- pom.xml | 17 ++++ .../ru/qatools/school/apiData/CitiesResp.java | 18 +++++ .../qatools/school/apiData/SuggestResp.java | 27 +++++++ .../qatools/school/apiData}/Temperature.java | 6 +- .../ru/qatools/school/apiData/WeatherApi.java | 31 +++++++ .../qatools/school/apiData}/WeatherResp.java | 9 ++- 13 files changed, 238 insertions(+), 124 deletions(-) delete mode 100644 api-tests-module/src/test/java/MyService.java delete mode 100644 api-tests-module/src/test/java/RestassuredTests.java delete mode 100644 api-tests-module/src/test/java/RetrofitTests.java create mode 100644 api-tests-module/src/test/java/ru/qatools/school/apitests/RestassuredTests.java create mode 100644 api-tests-module/src/test/java/ru/qatools/school/apitests/RetrofitTests.java create mode 100644 steps-module/src/main/java/ru/qatools/school/apiData/CitiesResp.java create mode 100644 steps-module/src/main/java/ru/qatools/school/apiData/SuggestResp.java rename {api-tests-module/src/test/java => steps-module/src/main/java/ru/qatools/school/apiData}/Temperature.java (78%) create mode 100644 steps-module/src/main/java/ru/qatools/school/apiData/WeatherApi.java rename {api-tests-module/src/test/java => steps-module/src/main/java/ru/qatools/school/apiData}/WeatherResp.java (78%) diff --git a/api-tests-module/pom.xml b/api-tests-module/pom.xml index 72d211c..f6f446e 100644 --- a/api-tests-module/pom.xml +++ b/api-tests-module/pom.xml @@ -16,19 +16,9 @@ - com.squareup.retrofit2 - retrofit - 2.0.2 - - - com.squareup.retrofit2 - converter-gson - 2.0.2 - - - com.jayway.restassured - rest-assured - 2.9.0 + ru.qatools.school + steps-module + 1.0-SNAPSHOT test diff --git a/api-tests-module/src/test/java/MyService.java b/api-tests-module/src/test/java/MyService.java deleted file mode 100644 index 2847d85..0000000 --- a/api-tests-module/src/test/java/MyService.java +++ /dev/null @@ -1,12 +0,0 @@ -import retrofit2.Call; -import retrofit2.http.GET; -import retrofit2.http.Query; - -/** - * Created by onegines (Eugene Kirienko) - */ -public interface MyService { - - @GET("/api/weather") - Call weather(@Query("city") String city); -} diff --git a/api-tests-module/src/test/java/RestassuredTests.java b/api-tests-module/src/test/java/RestassuredTests.java deleted file mode 100644 index 1908f91..0000000 --- a/api-tests-module/src/test/java/RestassuredTests.java +++ /dev/null @@ -1,25 +0,0 @@ -import org.apache.http.HttpStatus; -import org.junit.Test; - -import static com.jayway.restassured.RestAssured.given; -import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.core.IsEqual.equalTo; - -/** - * Created by onegines (Eugene Kirienko) - */ -public class RestassuredTests { - - @Test - public void simpleTest() throws Exception { - given().baseUri("http://weather.lanwen.ru") - .basePath("api").param("city", "Moscow") - .get("weather") - .then().assertThat().statusCode(HttpStatus.SC_OK) - .and().body("city", equalTo("Moscow")) - .and().body("temperatures", hasSize(4)) - .and().body("temperatures[0].value", - equalTo(12.24f)); - } - -} diff --git a/api-tests-module/src/test/java/RetrofitTests.java b/api-tests-module/src/test/java/RetrofitTests.java deleted file mode 100644 index 6863c5f..0000000 --- a/api-tests-module/src/test/java/RetrofitTests.java +++ /dev/null @@ -1,39 +0,0 @@ -import org.apache.http.HttpStatus; -import org.junit.Test; -import retrofit2.Response; -import retrofit2.Retrofit; -import retrofit2.converter.gson.GsonConverterFactory; -import retrofit2.Call; - -import java.io.IOException; - -import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.core.Is.is; -import static org.hamcrest.core.IsEqual.equalTo; -import static org.junit.Assert.assertThat; - -/** - * Created by onegines (Eugene Kirienko) - */ -public class RetrofitTests { - - @Test - public void simpleTest() throws IOException { - - Retrofit retrofit = new Retrofit.Builder() - .baseUrl("http://weather.lanwen.ru") - .addConverterFactory(GsonConverterFactory.create()) - .build(); - - MyService service = retrofit.create(MyService.class); - - Call req = service.weather("Moscow"); - Response resp = req.execute(); - - assertThat(resp.code(), is(HttpStatus.SC_OK)); - assertThat(resp.body().getCity(), equalTo("Moscow")); - assertThat(resp.body().getTemperatures(), hasSize(4)); - assertThat(resp.body().getTemperatures().get(0).getValue(), equalTo(9.0)); - } - -} diff --git a/api-tests-module/src/test/java/ru/qatools/school/apitests/RestassuredTests.java b/api-tests-module/src/test/java/ru/qatools/school/apitests/RestassuredTests.java new file mode 100644 index 0000000..93df275 --- /dev/null +++ b/api-tests-module/src/test/java/ru/qatools/school/apitests/RestassuredTests.java @@ -0,0 +1,53 @@ +package ru.qatools.school.apitests; + +import org.apache.http.HttpStatus; +import org.junit.Test; +import ru.yandex.qatools.allure.annotations.Title; + +import static com.jayway.restassured.RestAssured.given; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.everyItem; + +/** + * @author onegines (Eugene Kirienko) + */ +public class RestAssuredTests { + + private static final String MAIN_PAGE = "http://weather.lanwen.ru/"; + private static final String BASE_PATH = "api"; + + @Test + @Title("SUGGEST: Должны получить код 400 после отправки запроса без параметров") + //@TestCaseId("53") + public void shouldGetErrorCode400AfterSendNoQueryToSuggest() throws Exception { + given().baseUri(MAIN_PAGE) + .basePath(BASE_PATH) + .get("suggest") + .then().assertThat() + .statusCode(HttpStatus.SC_BAD_REQUEST); + } + + @Test + @Title("SUGGEST: Должны получить список городов, содержащих в названии строку из запроса") + //@TestCaseId("42") + public void ShouldGetSuggestsContainsPartOfName() throws Exception { + given().baseUri(MAIN_PAGE) + .basePath(BASE_PATH).param("query", "Saint") + .get("suggest") + .then().assertThat() + .statusCode(HttpStatus.SC_OK) + .and().body("name", everyItem(containsString("Saint"))); + } + + @Test + @Title("WEATHER: Должны получить код 400 после отправки запроса без параметров") + //@TestCaseId("65") + public void shouldGetErrorCode400AfterSendNoQueryToWeather() throws Exception { + given().baseUri(MAIN_PAGE) + .basePath(BASE_PATH) + .get("weather") + .then().assertThat() + .statusCode(HttpStatus.SC_BAD_REQUEST); + } + +} diff --git a/api-tests-module/src/test/java/ru/qatools/school/apitests/RetrofitTests.java b/api-tests-module/src/test/java/ru/qatools/school/apitests/RetrofitTests.java new file mode 100644 index 0000000..ffc6e7a --- /dev/null +++ b/api-tests-module/src/test/java/ru/qatools/school/apitests/RetrofitTests.java @@ -0,0 +1,80 @@ +package ru.qatools.school.apitests; + +import org.apache.http.HttpStatus; +import org.junit.Before; +import org.junit.Test; +import retrofit2.Call; +import retrofit2.Response; +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; +import ru.qatools.school.apiData.SuggestResp; +import ru.qatools.school.apiData.WeatherApi; +import ru.qatools.school.apiData.WeatherResp; +import ru.yandex.qatools.allure.annotations.Title; + +import java.io.IOException; +import java.util.List; + +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.assertThat; + +/** + * @author onegines (Eugene Kirienko) + */ +public class RetrofitTests { + + private static final String MAIN_PAGE = "http://weather.lanwen.ru/"; + private static final String CITY = "Saint Petersburg"; + private static final String QUERY = "Saint"; + + private WeatherApi weatherApi; + + private Retrofit retrofit = new Retrofit.Builder() + .baseUrl(MAIN_PAGE) + .addConverterFactory(GsonConverterFactory.create()) + .build(); + + @Before + public void init() { + weatherApi = retrofit.create(WeatherApi.class); + } + + @Test + @Title("Должны получить код 400 после отправки запроса без параметров") + //@TestCaseId("53") + public void shouldGetErrorCode400AfterSendNoQueryToSuggest() throws IOException { + + Call> req = weatherApi.suggest(); + Response> resp = req.execute(); + + assertThat("Неправильный код ответа", resp.code(), is(HttpStatus.SC_BAD_REQUEST)); + + } + + @Test + @Title("Должны получить список городов, содержащих в названии строку из запроса") + //@TestCaseId("42") + public void ShouldGetSuggestsContainsPartOfName() throws IOException { + + Call> req = weatherApi.suggest(QUERY); + Response> resp = req.execute(); + + assertThat("Request status different from expected", resp.code(), is(HttpStatus.SC_OK)); + assertThat("Все города должны содержать строку из запроса", resp.body(), everyItem(hasProperty("name", containsString(QUERY)))); + + } + + @Test + @Title("WEATHER: Должны получить код 400 после отправки запроса без параметров") + //@TestCaseId("65") + public void shouldGetErrorCode400AfterSendNoQueryToWeather() throws IOException { + + Call req = weatherApi.weather(); + Response resp = req.execute(); + + assertThat("Неправильный код ответа", resp.code(), is(HttpStatus.SC_BAD_REQUEST)); + + } + + +} diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/RegressionSuite.java b/commons-module/src/test/java/ru/qatools/school/webtests/RegressionSuite.java index 3f68a14..1de778b 100644 --- a/commons-module/src/test/java/ru/qatools/school/webtests/RegressionSuite.java +++ b/commons-module/src/test/java/ru/qatools/school/webtests/RegressionSuite.java @@ -1,6 +1,5 @@ package ru.qatools.school.webtests; -import org.apache.http.HttpStatus; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -11,15 +10,10 @@ import ru.yandex.qatools.allure.annotations.TestCaseId; import ru.yandex.qatools.allure.annotations.Title; -import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import static java.lang.String.format; -import static org.hamcrest.Matchers.hasSize; -import static org.hamcrest.core.Is.is; -import static org.hamcrest.core.IsEqual.equalTo; -import static org.junit.Assert.assertThat; /** * Created by onegines (Eugene Kirienko) @@ -219,27 +213,4 @@ public void shouldSeeCityNameInTitleAfterEraseTextInIt() { defaultSteps.confirmText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); } - - /** - * Created by onegines (Eugene Kirienko) - */ - public static class RetrofitTests { - - @Test - public void simpleTest() throws IOException { - Retrofit retrofit = new Retrofit.Builder() - .baseUrl("http://weather.lanwen.ru") - .addConverterFactory(GsonConverterFactory.create()) - .build(); - MyService service = retrofit.create(MyService.class); - Call req = service.weather("Moscow"); - Response resp = req.execute(); - assertThat(resp.code(), is(HttpStatus.SC_OK)); - assertThat(resp.body().getCity(), equalTo("Moscow")); - assertThat(resp.body().getTemperatures(), hasSize(4)); - assertThat(resp.body().getTemperatures().get(0).getValue(), - equalTo(9.0)); - } - - } } diff --git a/pom.xml b/pom.xml index 79cbc95..b9bfd43 100644 --- a/pom.xml +++ b/pom.xml @@ -69,12 +69,29 @@ + junit junit 4.12 + + com.squareup.retrofit2 + retrofit + 2.0.2 + + + com.squareup.retrofit2 + converter-gson + 2.0.2 + + + com.jayway.restassured + rest-assured + 2.9.0 + test + diff --git a/steps-module/src/main/java/ru/qatools/school/apiData/CitiesResp.java b/steps-module/src/main/java/ru/qatools/school/apiData/CitiesResp.java new file mode 100644 index 0000000..fc73443 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/apiData/CitiesResp.java @@ -0,0 +1,18 @@ +package ru.qatools.school.apiData; + +/** + * @author onegines (Eugene Kirienko) + */ +public class CitiesResp { + private int uid; + + private String name; + + public int getUid() { + return uid; + } + + public String getName() { + return name; + } +} diff --git a/steps-module/src/main/java/ru/qatools/school/apiData/SuggestResp.java b/steps-module/src/main/java/ru/qatools/school/apiData/SuggestResp.java new file mode 100644 index 0000000..6ff82f5 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/apiData/SuggestResp.java @@ -0,0 +1,27 @@ +package ru.qatools.school.apiData; + +/** + * @author onegines (Eugene Kirienko) + */ +public class SuggestResp { + public int id; + public int uid; + public String name; + public String country; + + public int getId() { + return id; + } + + public int getUid() { + return uid; + } + + public String getName() { + return name; + } + + public String getCountry() { + return country; + } +} diff --git a/api-tests-module/src/test/java/Temperature.java b/steps-module/src/main/java/ru/qatools/school/apiData/Temperature.java similarity index 78% rename from api-tests-module/src/test/java/Temperature.java rename to steps-module/src/main/java/ru/qatools/school/apiData/Temperature.java index ccdc5f7..6a1edc8 100644 --- a/api-tests-module/src/test/java/Temperature.java +++ b/steps-module/src/main/java/ru/qatools/school/apiData/Temperature.java @@ -1,16 +1,16 @@ +package ru.qatools.school.apiData; + /** - * Created by onegines (Eugene Kirienko) + * @author onegines */ public class Temperature { public float value; - public String unit; public float getValue() { return value; } - public String getUnit() { return unit; } diff --git a/steps-module/src/main/java/ru/qatools/school/apiData/WeatherApi.java b/steps-module/src/main/java/ru/qatools/school/apiData/WeatherApi.java new file mode 100644 index 0000000..a1acdf8 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/apiData/WeatherApi.java @@ -0,0 +1,31 @@ +package ru.qatools.school.apiData; + +import retrofit2.Call; +import retrofit2.http.GET; +import retrofit2.http.Query; + +import java.util.List; + +/** + * @author onegines (Eugene Kirienko) + */ +public interface WeatherApi { + + @GET("/api/suggest") + Call> suggest(); + + @GET("/api/suggest") + Call> suggest(@Query("query") String query); + + @GET("/api/cities") + Call> cities(); + + @GET("/api/cities") + Call> cities(@Query("limit") int limit); + + @GET("/api/weather") + Call weather(); + + @GET("/api/weather") + Call weather(@Query("city") String city); +} diff --git a/api-tests-module/src/test/java/WeatherResp.java b/steps-module/src/main/java/ru/qatools/school/apiData/WeatherResp.java similarity index 78% rename from api-tests-module/src/test/java/WeatherResp.java rename to steps-module/src/main/java/ru/qatools/school/apiData/WeatherResp.java index 67601b6..cdaf458 100644 --- a/api-tests-module/src/test/java/WeatherResp.java +++ b/steps-module/src/main/java/ru/qatools/school/apiData/WeatherResp.java @@ -1,17 +1,20 @@ +package ru.qatools.school.apiData; + import java.util.List; /** - * Created by onegines (Eugene Kirienko) + * @author onegines (Eugene Kirienko) */ public class WeatherResp { + public String city; + public List temperatures; + public String getCity() { return city; } - public List temperatures; - public List getTemperatures() { return temperatures; } From 7f9112f385a5a592a56b1d045ca5d08b0df78f56 Mon Sep 17 00:00:00 2001 From: OneginES Date: Tue, 3 May 2016 00:24:05 +0300 Subject: [PATCH 20/26] API + DB Tests --- api-tests-module/pom.xml | 5 ++ .../school/apitests/RestassuredTests.java | 28 ++++++---- .../school/apitests/RetrofitTests.java | 32 ++++++++--- dbclient-module/pom.xml | 5 ++ .../main/java/ru/qatools/school/DbClient.java | 33 ++++++++++-- .../ru/qatools/school/apiData/CitiesResp.java | 2 +- .../qatools/school/apiData/SuggestResp.java | 53 ++++++++++++++++--- .../qatools/school/apiData/Temperature.java | 6 +-- .../ru/qatools/school/apiData/WeatherApi.java | 2 +- .../qatools/school/apiData/WeatherResp.java | 6 +-- 10 files changed, 137 insertions(+), 35 deletions(-) diff --git a/api-tests-module/pom.xml b/api-tests-module/pom.xml index f6f446e..82b570a 100644 --- a/api-tests-module/pom.xml +++ b/api-tests-module/pom.xml @@ -21,5 +21,10 @@ 1.0-SNAPSHOT test + + ru.qatools.school + dbclient-module + ${project.version} + diff --git a/api-tests-module/src/test/java/ru/qatools/school/apitests/RestassuredTests.java b/api-tests-module/src/test/java/ru/qatools/school/apitests/RestassuredTests.java index 93df275..ddae1bc 100644 --- a/api-tests-module/src/test/java/ru/qatools/school/apitests/RestassuredTests.java +++ b/api-tests-module/src/test/java/ru/qatools/school/apitests/RestassuredTests.java @@ -1,10 +1,12 @@ package ru.qatools.school.apitests; +import com.jayway.restassured.RestAssured; +import com.jayway.restassured.specification.RequestSpecification; import org.apache.http.HttpStatus; +import org.junit.Before; import org.junit.Test; import ru.yandex.qatools.allure.annotations.Title; -import static com.jayway.restassured.RestAssured.given; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.everyItem; @@ -16,13 +18,22 @@ public class RestAssuredTests { private static final String MAIN_PAGE = "http://weather.lanwen.ru/"; private static final String BASE_PATH = "api"; + private static final String CITYNAMEBEGIN = "Saint"; + + private RequestSpecification weatherApi; + + @Before + public void init() { + weatherApi = RestAssured.given() + .baseUri(MAIN_PAGE) + .basePath(BASE_PATH); + } + @Test @Title("SUGGEST: Должны получить код 400 после отправки запроса без параметров") //@TestCaseId("53") public void shouldGetErrorCode400AfterSendNoQueryToSuggest() throws Exception { - given().baseUri(MAIN_PAGE) - .basePath(BASE_PATH) - .get("suggest") + weatherApi.get("suggest") .then().assertThat() .statusCode(HttpStatus.SC_BAD_REQUEST); } @@ -31,21 +42,18 @@ public void shouldGetErrorCode400AfterSendNoQueryToSuggest() throws Exception { @Title("SUGGEST: Должны получить список городов, содержащих в названии строку из запроса") //@TestCaseId("42") public void ShouldGetSuggestsContainsPartOfName() throws Exception { - given().baseUri(MAIN_PAGE) - .basePath(BASE_PATH).param("query", "Saint") + weatherApi.param("query", CITYNAMEBEGIN) .get("suggest") .then().assertThat() .statusCode(HttpStatus.SC_OK) - .and().body("name", everyItem(containsString("Saint"))); + .and().body("name", everyItem(containsString(CITYNAMEBEGIN))); } @Test @Title("WEATHER: Должны получить код 400 после отправки запроса без параметров") //@TestCaseId("65") public void shouldGetErrorCode400AfterSendNoQueryToWeather() throws Exception { - given().baseUri(MAIN_PAGE) - .basePath(BASE_PATH) - .get("weather") + weatherApi.get("weather") .then().assertThat() .statusCode(HttpStatus.SC_BAD_REQUEST); } diff --git a/api-tests-module/src/test/java/ru/qatools/school/apitests/RetrofitTests.java b/api-tests-module/src/test/java/ru/qatools/school/apitests/RetrofitTests.java index ffc6e7a..743dbff 100644 --- a/api-tests-module/src/test/java/ru/qatools/school/apitests/RetrofitTests.java +++ b/api-tests-module/src/test/java/ru/qatools/school/apitests/RetrofitTests.java @@ -7,9 +7,10 @@ import retrofit2.Response; import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; -import ru.qatools.school.apiData.SuggestResp; -import ru.qatools.school.apiData.WeatherApi; -import ru.qatools.school.apiData.WeatherResp; +import ru.qatools.school.DbClient; +import ru.qatools.school.apidata.SuggestResp; +import ru.qatools.school.apidata.WeatherApi; +import ru.qatools.school.apidata.WeatherResp; import ru.yandex.qatools.allure.annotations.Title; import java.io.IOException; @@ -24,10 +25,11 @@ public class RetrofitTests { private static final String MAIN_PAGE = "http://weather.lanwen.ru/"; - private static final String CITY = "Saint Petersburg"; - private static final String QUERY = "Saint"; + private static final String CITYNAMEBEGIN = "Saint"; + private static final String CITYNAMEPART = "aint"; private WeatherApi weatherApi; + DbClient dbClient; private Retrofit retrofit = new Retrofit.Builder() .baseUrl(MAIN_PAGE) @@ -37,6 +39,7 @@ public class RetrofitTests { @Before public void init() { weatherApi = retrofit.create(WeatherApi.class); + dbClient = new DbClient(); } @Test @@ -56,11 +59,26 @@ public void shouldGetErrorCode400AfterSendNoQueryToSuggest() throws IOException //@TestCaseId("42") public void ShouldGetSuggestsContainsPartOfName() throws IOException { - Call> req = weatherApi.suggest(QUERY); + Call> req = weatherApi.suggest(CITYNAMEBEGIN); Response> resp = req.execute(); assertThat("Request status different from expected", resp.code(), is(HttpStatus.SC_OK)); - assertThat("Все города должны содержать строку из запроса", resp.body(), everyItem(hasProperty("name", containsString(QUERY)))); + assertThat("Все города должны содержать строку из запроса", resp.body(), everyItem(hasProperty("name", containsString(CITYNAMEBEGIN)))); + + } + + @Test + @Title("Должны совпадать списки (от API и ВD) JSON городов, содержащих в названии строку из запроса") + //@TestCaseId("") + public void ShouldMatchSuggestsFromApiAndDb() throws IOException { + + Call> reqApi = weatherApi.suggest(CITYNAMEPART); + Response> respApi = reqApi.execute(); + + List respDb = dbClient.getSuggestCitiesByNamePart(CITYNAMEPART); + + assertThat("Неправильный код ответа", respApi.code(), is(HttpStatus.SC_OK)); + assertThat("Списки из API и DB должны совпадать", respApi.body(), is(equalTo(respDb))); } diff --git a/dbclient-module/pom.xml b/dbclient-module/pom.xml index 2994039..3e85df7 100644 --- a/dbclient-module/pom.xml +++ b/dbclient-module/pom.xml @@ -22,6 +22,11 @@ mysql-connector-java 5.1.6 + + ru.qatools.school + steps-module + 1.0-SNAPSHOT + diff --git a/dbclient-module/src/main/java/ru/qatools/school/DbClient.java b/dbclient-module/src/main/java/ru/qatools/school/DbClient.java index 12e1204..e63b722 100644 --- a/dbclient-module/src/main/java/ru/qatools/school/DbClient.java +++ b/dbclient-module/src/main/java/ru/qatools/school/DbClient.java @@ -2,10 +2,13 @@ import org.jooq.*; import org.jooq.impl.DSL; +import ru.qatools.school.apidata.SuggestResp; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; import static org.jooq.impl.DSL.field; import static org.jooq.impl.DSL.table; @@ -17,7 +20,7 @@ public class DbClient { private static final String CONNECTION_STRING = System.getProperty("db.url", "jdbc:mysql://db.host.ru:3310/db_name"); private static final String USER = System.getProperty("db.user", "user"); - private static final String PASSWORD = System.getProperty("db.password", "password");; + private static final String PASSWORD = System.getProperty("db.password", "password"); private Connection connection; private DSLContext create; @@ -33,10 +36,34 @@ public DbClient() { public String getCityById(Integer id) { Record1 result = create.select(field("name")) - .from(table("table_name")) + .from(table("City")) .where(field("id").equal(id)) .fetchOne(); - return result.getValue(0, String.class); + return result.getValue(0, String.class); + } + + public List getSuggestCitiesByNamePart(String namePart) { + List bdSuggests = new ArrayList<>(); + + Result result = create.select() + .from(table("City")) + .where(field("name").like("%" + namePart + "%")) + .fetch(); + + for (Record row : result) { + SuggestResp bdSuggest = new SuggestResp(); + + String name = (String) row.getValue("name"); + + bdSuggest.setId((long) row.getValue("id")); + bdSuggest.setUid((long) row.getValue("uid")); + bdSuggest.setName((String) row.getValue("name")); + bdSuggest.setCountry((String) row.getValue("country")); + + bdSuggests.add(bdSuggest); + } + + return bdSuggests; } public void close() { diff --git a/steps-module/src/main/java/ru/qatools/school/apiData/CitiesResp.java b/steps-module/src/main/java/ru/qatools/school/apiData/CitiesResp.java index fc73443..4e6296d 100644 --- a/steps-module/src/main/java/ru/qatools/school/apiData/CitiesResp.java +++ b/steps-module/src/main/java/ru/qatools/school/apiData/CitiesResp.java @@ -1,4 +1,4 @@ -package ru.qatools.school.apiData; +package ru.qatools.school.apidata; /** * @author onegines (Eugene Kirienko) diff --git a/steps-module/src/main/java/ru/qatools/school/apiData/SuggestResp.java b/steps-module/src/main/java/ru/qatools/school/apiData/SuggestResp.java index 6ff82f5..ae0c8cd 100644 --- a/steps-module/src/main/java/ru/qatools/school/apiData/SuggestResp.java +++ b/steps-module/src/main/java/ru/qatools/school/apiData/SuggestResp.java @@ -1,19 +1,19 @@ -package ru.qatools.school.apiData; +package ru.qatools.school.apidata; /** * @author onegines (Eugene Kirienko) */ public class SuggestResp { - public int id; - public int uid; - public String name; - public String country; + private long id; + private long uid; + private String name; + private String country; - public int getId() { + public long getId() { return id; } - public int getUid() { + public long getUid() { return uid; } @@ -24,4 +24,43 @@ public String getName() { public String getCountry() { return country; } + + public void setId(long id) { + this.id = id; + } + + public void setUid(long uid) { + this.uid = uid; + } + + public void setName(String name) { + this.name = name; + } + + public void setCountry(String country) { + this.country = country; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + SuggestResp that = (SuggestResp) o; + + if (id != that.id) return false; + if (uid != that.uid) return false; + if (name != null ? !name.equals(that.name) : that.name != null) return false; + return country != null ? country.equals(that.country) : that.country == null; + + } + + @Override + public int hashCode() { + int result = (int) (id ^ (id >>> 32)); + result = 31 * result + (int) (uid ^ (uid >>> 32)); + result = 31 * result + (name != null ? name.hashCode() : 0); + result = 31 * result + (country != null ? country.hashCode() : 0); + return result; + } } diff --git a/steps-module/src/main/java/ru/qatools/school/apiData/Temperature.java b/steps-module/src/main/java/ru/qatools/school/apiData/Temperature.java index 6a1edc8..5f1a98c 100644 --- a/steps-module/src/main/java/ru/qatools/school/apiData/Temperature.java +++ b/steps-module/src/main/java/ru/qatools/school/apiData/Temperature.java @@ -1,12 +1,12 @@ -package ru.qatools.school.apiData; +package ru.qatools.school.apidata; /** * @author onegines */ public class Temperature { - public float value; - public String unit; + private float value; + private String unit; public float getValue() { return value; diff --git a/steps-module/src/main/java/ru/qatools/school/apiData/WeatherApi.java b/steps-module/src/main/java/ru/qatools/school/apiData/WeatherApi.java index a1acdf8..7d974a0 100644 --- a/steps-module/src/main/java/ru/qatools/school/apiData/WeatherApi.java +++ b/steps-module/src/main/java/ru/qatools/school/apiData/WeatherApi.java @@ -1,4 +1,4 @@ -package ru.qatools.school.apiData; +package ru.qatools.school.apidata; import retrofit2.Call; import retrofit2.http.GET; diff --git a/steps-module/src/main/java/ru/qatools/school/apiData/WeatherResp.java b/steps-module/src/main/java/ru/qatools/school/apiData/WeatherResp.java index cdaf458..56cd773 100644 --- a/steps-module/src/main/java/ru/qatools/school/apiData/WeatherResp.java +++ b/steps-module/src/main/java/ru/qatools/school/apiData/WeatherResp.java @@ -1,4 +1,4 @@ -package ru.qatools.school.apiData; +package ru.qatools.school.apidata; import java.util.List; @@ -7,9 +7,9 @@ */ public class WeatherResp { - public String city; + private String city; - public List temperatures; + private List temperatures; public String getCity() { return city; From dbcab3fed49b8f50295177433631fc55bde916fd Mon Sep 17 00:00:00 2001 From: OneginES Date: Wed, 4 May 2016 21:32:23 +0300 Subject: [PATCH 21/26] Refactoring according to @lanwen and @bluedogseyes reviews. --- api-tests-module/pom.xml | 11 ++ .../school/apitests/RestAssuredTest.java | 141 ++++++++++++++++++ .../school/apitests/RestassuredTests.java | 61 -------- .../{RetrofitTests.java => RetrofitTest.java} | 39 ++--- dbclient-module/pom.xml | 5 +- .../main/java/ru/qatools/school/DbClient.java | 2 - pom.xml | 1 - .../qatools/school/apiData/SuggestResp.java | 10 ++ 8 files changed, 186 insertions(+), 84 deletions(-) create mode 100644 api-tests-module/src/test/java/ru/qatools/school/apitests/RestAssuredTest.java delete mode 100644 api-tests-module/src/test/java/ru/qatools/school/apitests/RestassuredTests.java rename api-tests-module/src/test/java/ru/qatools/school/apitests/{RetrofitTests.java => RetrofitTest.java} (71%) diff --git a/api-tests-module/pom.xml b/api-tests-module/pom.xml index 82b570a..073cdae 100644 --- a/api-tests-module/pom.xml +++ b/api-tests-module/pom.xml @@ -27,4 +27,15 @@ ${project.version} + + + true + + + ru.yandex.qatools.allure + allure-maven-plugin + 2.0 + + + diff --git a/api-tests-module/src/test/java/ru/qatools/school/apitests/RestAssuredTest.java b/api-tests-module/src/test/java/ru/qatools/school/apitests/RestAssuredTest.java new file mode 100644 index 0000000..b9d3e93 --- /dev/null +++ b/api-tests-module/src/test/java/ru/qatools/school/apitests/RestAssuredTest.java @@ -0,0 +1,141 @@ +package ru.qatools.school.apitests; + +import com.jayway.restassured.builder.RequestSpecBuilder; +import com.jayway.restassured.specification.RequestSpecification; +import org.apache.http.HttpStatus; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import ru.qatools.school.DbClient; +import ru.qatools.school.apidata.SuggestResp; +import ru.qatools.school.apidata.WeatherResp; +import ru.yandex.qatools.allure.annotations.Features; +import ru.yandex.qatools.allure.annotations.Title; + +import java.util.List; + +import static com.jayway.restassured.RestAssured.given; +import static java.util.Arrays.asList; +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.assertThat; + +/** + * @author onegines (Eugene Kirienko) + */ +public class RestAssuredTest { + + private static final String MAIN_PAGE = "http://weather.lanwen.ru/"; + private static final String BASE_PATH = "api"; + + private static final String CITYNAME = "Chita"; + private static final String CITYNAMEBEGIN = "Saint"; + private static final String CITYNAMEPART = "ain"; + + private RequestSpecification reqSpec; + + private DbClient dbClient; + + @Before + public void init() { + dbClient = new DbClient(); + + reqSpec = new RequestSpecBuilder().build() + .baseUri(MAIN_PAGE) + .basePath(BASE_PATH); + } + + @After + public void close() { + dbClient.close(); + } + + @Test + @Features("Suggest") + @Title("Должны получить код 400 после отправки запроса без параметров") + //@TestCaseId("53") + public void shouldGetErrorCode400AfterSendNoQueryToSuggest() throws Exception { + given().spec(reqSpec) + .get("suggest") + .then().assertThat() + .statusCode(HttpStatus.SC_BAD_REQUEST); + } + + @Test + @Features("Suggest") + @Title("Должны получить список городов, содержащих в названии строку из запроса") + //@TestCaseId("42") + public void shouldGetSuggestsContainsPartOfName() throws Exception { + given().spec(reqSpec) + .param("query", CITYNAMEBEGIN) + .get("suggest") + .then().assertThat() + .statusCode(HttpStatus.SC_OK) + .and().body("name", everyItem(containsString(CITYNAMEBEGIN))); + } + + @Test + @Features("Suggest") + @Title("Должны совпадать списки (от API и DB) городов, содержащих в названии строку из запроса") + //@TestCaseId("") + public void shouldMatchSuggestsFromApiAndDb() throws Exception { + + List respApi = asList( + given().spec(reqSpec) + .param("query", CITYNAMEPART) + .expect().statusCode(HttpStatus.SC_OK) + .get("suggest") + .as(SuggestResp[].class) + ); + + List respDb = dbClient.getSuggestCitiesByNamePart(CITYNAMEPART); + + assertThat("Списки из API и DB должны совпадать", respApi, is(equalTo(respDb))); + + } + + @Test + @Features("Weather") + @Title("Должны получить погоду в городе с названием, указанным в запросе") + //@TestCaseId("55") + public void shouldGetWeatherWithCityName() throws Exception { + + WeatherResp resp = + given().spec(reqSpec) + .param("city", CITYNAME) + .expect().statusCode(HttpStatus.SC_OK) + .get("weather") + .as(WeatherResp.class); + + assertThat("Неправильный город", resp.getCity(), is(CITYNAME)); + + } + + @Test + @Features("Weather") + @Title("Должны получить погоду в городе с названием '0'") + //@TestCaseId("60") + public void shouldGetWeatherWithCityName0() throws Exception { + + WeatherResp resp = + given().spec(reqSpec) + .param("city", "0") + .expect().statusCode(HttpStatus.SC_OK) + .get("weather") + .as(WeatherResp.class); + + assertThat("Неправильный город", resp.getCity(), is("0")); + + } + + @Test + @Features("Weather") + @Title("Должны получить код 400 после отправки запроса без параметров") + //@TestCaseId("65") + public void shouldGetErrorCode400AfterSendNoQueryToWeather() throws Exception { + given().spec(reqSpec) + .get("weather") + .then().assertThat() + .statusCode(HttpStatus.SC_BAD_REQUEST); + } + +} diff --git a/api-tests-module/src/test/java/ru/qatools/school/apitests/RestassuredTests.java b/api-tests-module/src/test/java/ru/qatools/school/apitests/RestassuredTests.java deleted file mode 100644 index ddae1bc..0000000 --- a/api-tests-module/src/test/java/ru/qatools/school/apitests/RestassuredTests.java +++ /dev/null @@ -1,61 +0,0 @@ -package ru.qatools.school.apitests; - -import com.jayway.restassured.RestAssured; -import com.jayway.restassured.specification.RequestSpecification; -import org.apache.http.HttpStatus; -import org.junit.Before; -import org.junit.Test; -import ru.yandex.qatools.allure.annotations.Title; - -import static org.hamcrest.Matchers.containsString; -import static org.hamcrest.Matchers.everyItem; - -/** - * @author onegines (Eugene Kirienko) - */ -public class RestAssuredTests { - - private static final String MAIN_PAGE = "http://weather.lanwen.ru/"; - private static final String BASE_PATH = "api"; - - private static final String CITYNAMEBEGIN = "Saint"; - - private RequestSpecification weatherApi; - - @Before - public void init() { - weatherApi = RestAssured.given() - .baseUri(MAIN_PAGE) - .basePath(BASE_PATH); - } - - @Test - @Title("SUGGEST: Должны получить код 400 после отправки запроса без параметров") - //@TestCaseId("53") - public void shouldGetErrorCode400AfterSendNoQueryToSuggest() throws Exception { - weatherApi.get("suggest") - .then().assertThat() - .statusCode(HttpStatus.SC_BAD_REQUEST); - } - - @Test - @Title("SUGGEST: Должны получить список городов, содержащих в названии строку из запроса") - //@TestCaseId("42") - public void ShouldGetSuggestsContainsPartOfName() throws Exception { - weatherApi.param("query", CITYNAMEBEGIN) - .get("suggest") - .then().assertThat() - .statusCode(HttpStatus.SC_OK) - .and().body("name", everyItem(containsString(CITYNAMEBEGIN))); - } - - @Test - @Title("WEATHER: Должны получить код 400 после отправки запроса без параметров") - //@TestCaseId("65") - public void shouldGetErrorCode400AfterSendNoQueryToWeather() throws Exception { - weatherApi.get("weather") - .then().assertThat() - .statusCode(HttpStatus.SC_BAD_REQUEST); - } - -} diff --git a/api-tests-module/src/test/java/ru/qatools/school/apitests/RetrofitTests.java b/api-tests-module/src/test/java/ru/qatools/school/apitests/RetrofitTest.java similarity index 71% rename from api-tests-module/src/test/java/ru/qatools/school/apitests/RetrofitTests.java rename to api-tests-module/src/test/java/ru/qatools/school/apitests/RetrofitTest.java index 743dbff..1e6c62a 100644 --- a/api-tests-module/src/test/java/ru/qatools/school/apitests/RetrofitTests.java +++ b/api-tests-module/src/test/java/ru/qatools/school/apitests/RetrofitTest.java @@ -1,9 +1,9 @@ package ru.qatools.school.apitests; import org.apache.http.HttpStatus; +import org.junit.After; import org.junit.Before; import org.junit.Test; -import retrofit2.Call; import retrofit2.Response; import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; @@ -11,6 +11,7 @@ import ru.qatools.school.apidata.SuggestResp; import ru.qatools.school.apidata.WeatherApi; import ru.qatools.school.apidata.WeatherResp; +import ru.yandex.qatools.allure.annotations.Features; import ru.yandex.qatools.allure.annotations.Title; import java.io.IOException; @@ -22,14 +23,14 @@ /** * @author onegines (Eugene Kirienko) */ -public class RetrofitTests { +public class RetrofitTest { private static final String MAIN_PAGE = "http://weather.lanwen.ru/"; private static final String CITYNAMEBEGIN = "Saint"; - private static final String CITYNAMEPART = "aint"; + private static final String CITYNAMEPART = "ain"; private WeatherApi weatherApi; - DbClient dbClient; + private DbClient dbClient; private Retrofit retrofit = new Retrofit.Builder() .baseUrl(MAIN_PAGE) @@ -42,25 +43,30 @@ public void init() { dbClient = new DbClient(); } + @After + public void close() { + dbClient.close(); + } + @Test + @Features("Suggest") @Title("Должны получить код 400 после отправки запроса без параметров") //@TestCaseId("53") public void shouldGetErrorCode400AfterSendNoQueryToSuggest() throws IOException { - Call> req = weatherApi.suggest(); - Response> resp = req.execute(); + Response> resp = weatherApi.suggest().execute(); assertThat("Неправильный код ответа", resp.code(), is(HttpStatus.SC_BAD_REQUEST)); } @Test + @Features("Suggest") @Title("Должны получить список городов, содержащих в названии строку из запроса") //@TestCaseId("42") - public void ShouldGetSuggestsContainsPartOfName() throws IOException { + public void shouldGetSuggestsContainsPartOfName() throws IOException { - Call> req = weatherApi.suggest(CITYNAMEBEGIN); - Response> resp = req.execute(); + Response> resp = weatherApi.suggest(CITYNAMEBEGIN).execute(); assertThat("Request status different from expected", resp.code(), is(HttpStatus.SC_OK)); assertThat("Все города должны содержать строку из запроса", resp.body(), everyItem(hasProperty("name", containsString(CITYNAMEBEGIN)))); @@ -68,13 +74,12 @@ public void ShouldGetSuggestsContainsPartOfName() throws IOException { } @Test - @Title("Должны совпадать списки (от API и ВD) JSON городов, содержащих в названии строку из запроса") + @Features("Suggest") + @Title("Должны совпадать списки (от API и DB) городов, содержащих в названии строку из запроса") //@TestCaseId("") - public void ShouldMatchSuggestsFromApiAndDb() throws IOException { - - Call> reqApi = weatherApi.suggest(CITYNAMEPART); - Response> respApi = reqApi.execute(); + public void shouldMatchSuggestsFromApiAndDb() throws IOException { + Response> respApi = weatherApi.suggest(CITYNAMEPART).execute(); List respDb = dbClient.getSuggestCitiesByNamePart(CITYNAMEPART); assertThat("Неправильный код ответа", respApi.code(), is(HttpStatus.SC_OK)); @@ -83,12 +88,12 @@ public void ShouldMatchSuggestsFromApiAndDb() throws IOException { } @Test - @Title("WEATHER: Должны получить код 400 после отправки запроса без параметров") + @Features("Weather") + @Title("Должны получить код 400 после отправки запроса без параметров") //@TestCaseId("65") public void shouldGetErrorCode400AfterSendNoQueryToWeather() throws IOException { - Call req = weatherApi.weather(); - Response resp = req.execute(); + Response resp = weatherApi.weather().execute(); assertThat("Неправильный код ответа", resp.code(), is(HttpStatus.SC_BAD_REQUEST)); diff --git a/dbclient-module/pom.xml b/dbclient-module/pom.xml index 3e85df7..08e2292 100644 --- a/dbclient-module/pom.xml +++ b/dbclient-module/pom.xml @@ -2,12 +2,13 @@ + 4.0.0 + school-2016 ru.qatools.school 1.0-SNAPSHOT - 4.0.0 dbclient-module @@ -28,6 +29,4 @@ 1.0-SNAPSHOT - - \ No newline at end of file diff --git a/dbclient-module/src/main/java/ru/qatools/school/DbClient.java b/dbclient-module/src/main/java/ru/qatools/school/DbClient.java index e63b722..95e4f22 100644 --- a/dbclient-module/src/main/java/ru/qatools/school/DbClient.java +++ b/dbclient-module/src/main/java/ru/qatools/school/DbClient.java @@ -53,8 +53,6 @@ public List getSuggestCitiesByNamePart(String namePart) { for (Record row : result) { SuggestResp bdSuggest = new SuggestResp(); - String name = (String) row.getValue("name"); - bdSuggest.setId((long) row.getValue("id")); bdSuggest.setUid((long) row.getValue("uid")); bdSuggest.setName((String) row.getValue("name")); diff --git a/pom.xml b/pom.xml index d2c6e32..9a09fc6 100644 --- a/pom.xml +++ b/pom.xml @@ -70,7 +70,6 @@ - junit diff --git a/steps-module/src/main/java/ru/qatools/school/apiData/SuggestResp.java b/steps-module/src/main/java/ru/qatools/school/apiData/SuggestResp.java index ae0c8cd..51085f6 100644 --- a/steps-module/src/main/java/ru/qatools/school/apiData/SuggestResp.java +++ b/steps-module/src/main/java/ru/qatools/school/apiData/SuggestResp.java @@ -41,6 +41,16 @@ public void setCountry(String country) { this.country = country; } + @Override + public String toString() { + return "SuggestResp{" + + "id=" + id + + ", uid=" + uid + + ", name='" + name + '\'' + + ", country='" + country + '\'' + + '}'; + } + @Override public boolean equals(Object o) { if (this == o) return true; From d3f36319288672017e102c8408d67e8a8d820f8d Mon Sep 17 00:00:00 2001 From: OneginES Date: Thu, 5 May 2016 12:34:19 +0300 Subject: [PATCH 22/26] rm apiData to apidata --- .../java/ru/qatools/school/{apiData => apidata}/CitiesResp.java | 0 .../java/ru/qatools/school/{apiData => apidata}/SuggestResp.java | 0 .../java/ru/qatools/school/{apiData => apidata}/Temperature.java | 1 + .../java/ru/qatools/school/{apiData => apidata}/WeatherApi.java | 0 .../java/ru/qatools/school/{apiData => apidata}/WeatherResp.java | 0 5 files changed, 1 insertion(+) rename steps-module/src/main/java/ru/qatools/school/{apiData => apidata}/CitiesResp.java (100%) rename steps-module/src/main/java/ru/qatools/school/{apiData => apidata}/SuggestResp.java (100%) rename steps-module/src/main/java/ru/qatools/school/{apiData => apidata}/Temperature.java (99%) rename steps-module/src/main/java/ru/qatools/school/{apiData => apidata}/WeatherApi.java (100%) rename steps-module/src/main/java/ru/qatools/school/{apiData => apidata}/WeatherResp.java (100%) diff --git a/steps-module/src/main/java/ru/qatools/school/apiData/CitiesResp.java b/steps-module/src/main/java/ru/qatools/school/apidata/CitiesResp.java similarity index 100% rename from steps-module/src/main/java/ru/qatools/school/apiData/CitiesResp.java rename to steps-module/src/main/java/ru/qatools/school/apidata/CitiesResp.java diff --git a/steps-module/src/main/java/ru/qatools/school/apiData/SuggestResp.java b/steps-module/src/main/java/ru/qatools/school/apidata/SuggestResp.java similarity index 100% rename from steps-module/src/main/java/ru/qatools/school/apiData/SuggestResp.java rename to steps-module/src/main/java/ru/qatools/school/apidata/SuggestResp.java diff --git a/steps-module/src/main/java/ru/qatools/school/apiData/Temperature.java b/steps-module/src/main/java/ru/qatools/school/apidata/Temperature.java similarity index 99% rename from steps-module/src/main/java/ru/qatools/school/apiData/Temperature.java rename to steps-module/src/main/java/ru/qatools/school/apidata/Temperature.java index 5f1a98c..bfaee6a 100644 --- a/steps-module/src/main/java/ru/qatools/school/apiData/Temperature.java +++ b/steps-module/src/main/java/ru/qatools/school/apidata/Temperature.java @@ -11,6 +11,7 @@ public class Temperature { public float getValue() { return value; } + public String getUnit() { return unit; } diff --git a/steps-module/src/main/java/ru/qatools/school/apiData/WeatherApi.java b/steps-module/src/main/java/ru/qatools/school/apidata/WeatherApi.java similarity index 100% rename from steps-module/src/main/java/ru/qatools/school/apiData/WeatherApi.java rename to steps-module/src/main/java/ru/qatools/school/apidata/WeatherApi.java diff --git a/steps-module/src/main/java/ru/qatools/school/apiData/WeatherResp.java b/steps-module/src/main/java/ru/qatools/school/apidata/WeatherResp.java similarity index 100% rename from steps-module/src/main/java/ru/qatools/school/apiData/WeatherResp.java rename to steps-module/src/main/java/ru/qatools/school/apidata/WeatherResp.java From 3260326339697787ac66d5bb7c42ebc4325d0d33 Mon Sep 17 00:00:00 2001 From: OneginES Date: Mon, 9 May 2016 00:48:45 +0300 Subject: [PATCH 23/26] Link to Dockerfile --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 69e007d..f645e9d 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ # Practice of automation school 2016 See all info in repo [autoschool/autoschool.github.io](https://github.com/autoschool/autoschool.github.io) + +See Dockerfile in repo [OneginES/Docker](https://github.com/OneginES/Docker) From 6f8d2a08f2da1bdd2128b575364808fa7145d4fa Mon Sep 17 00:00:00 2001 From: OneginES Date: Tue, 10 May 2016 17:08:27 +0300 Subject: [PATCH 24/26] Merge two classes in one WebTest class. Add TP support. Modify db mapping. --- api-tests-module/pom.xml | 5 + .../school/apitests/RestAssuredTest.java | 27 ++-- .../qatools/school/apitests/RetrofitTest.java | 16 +- .../qatools/school/webtests/SmokeSuite.java | 153 ------------------ .../school/webtests/WeatherWebTest.java | 37 ----- .../{RegressionSuite.java => WebTests.java} | 119 +++++++++++++- .../main/java/ru/qatools/school/DbClient.java | 27 +--- 7 files changed, 156 insertions(+), 228 deletions(-) delete mode 100644 commons-module/src/test/java/ru/qatools/school/webtests/SmokeSuite.java delete mode 100644 commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java rename commons-module/src/test/java/ru/qatools/school/webtests/{RegressionSuite.java => WebTests.java} (65%) diff --git a/api-tests-module/pom.xml b/api-tests-module/pom.xml index 073cdae..013fa65 100644 --- a/api-tests-module/pom.xml +++ b/api-tests-module/pom.xml @@ -26,6 +26,11 @@ dbclient-module ${project.version} + + ru.yandex.qatools.matchers + collection-matchers + 1.3 + diff --git a/api-tests-module/src/test/java/ru/qatools/school/apitests/RestAssuredTest.java b/api-tests-module/src/test/java/ru/qatools/school/apitests/RestAssuredTest.java index b9d3e93..fc7ec6d 100644 --- a/api-tests-module/src/test/java/ru/qatools/school/apitests/RestAssuredTest.java +++ b/api-tests-module/src/test/java/ru/qatools/school/apitests/RestAssuredTest.java @@ -5,11 +5,14 @@ import org.apache.http.HttpStatus; import org.junit.After; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import ru.qatools.school.DbClient; import ru.qatools.school.apidata.SuggestResp; import ru.qatools.school.apidata.WeatherResp; +import ru.qatools.school.tp.TPInformerRule; import ru.yandex.qatools.allure.annotations.Features; +import ru.yandex.qatools.allure.annotations.TestCaseId; import ru.yandex.qatools.allure.annotations.Title; import java.util.List; @@ -18,6 +21,7 @@ import static java.util.Arrays.asList; import static org.hamcrest.Matchers.*; import static org.junit.Assert.assertThat; +import static ru.yandex.qatools.matchers.collection.HasSameItemsAsListMatcher.hasSameItemsAsList; /** * @author onegines (Eugene Kirienko) @@ -35,6 +39,9 @@ public class RestAssuredTest { private DbClient dbClient; + @Rule + public TPInformerRule tms = new TPInformerRule("onegines"); + @Before public void init() { dbClient = new DbClient(); @@ -51,8 +58,8 @@ public void close() { @Test @Features("Suggest") - @Title("Должны получить код 400 после отправки запроса без параметров") - //@TestCaseId("53") + @Title("Должны получить код 400 после отправки запроса саджеста без параметров") + @TestCaseId("53") public void shouldGetErrorCode400AfterSendNoQueryToSuggest() throws Exception { given().spec(reqSpec) .get("suggest") @@ -63,7 +70,7 @@ public void shouldGetErrorCode400AfterSendNoQueryToSuggest() throws Exception { @Test @Features("Suggest") @Title("Должны получить список городов, содержащих в названии строку из запроса") - //@TestCaseId("42") + @TestCaseId("42") public void shouldGetSuggestsContainsPartOfName() throws Exception { given().spec(reqSpec) .param("query", CITYNAMEBEGIN) @@ -75,8 +82,8 @@ public void shouldGetSuggestsContainsPartOfName() throws Exception { @Test @Features("Suggest") - @Title("Должны совпадать списки (от API и DB) городов, содержащих в названии строку из запроса") - //@TestCaseId("") + @Title("Должны совпадать списки (от API и DB) саджестов, содержащих в названии города строку из запроса") + @TestCaseId("75") public void shouldMatchSuggestsFromApiAndDb() throws Exception { List respApi = asList( @@ -89,14 +96,14 @@ public void shouldMatchSuggestsFromApiAndDb() throws Exception { List respDb = dbClient.getSuggestCitiesByNamePart(CITYNAMEPART); - assertThat("Списки из API и DB должны совпадать", respApi, is(equalTo(respDb))); + assertThat("Списки из API и DB должны совпадать", respApi, hasSameItemsAsList(respDb)); } @Test @Features("Weather") @Title("Должны получить погоду в городе с названием, указанным в запросе") - //@TestCaseId("55") + @TestCaseId("55") public void shouldGetWeatherWithCityName() throws Exception { WeatherResp resp = @@ -113,7 +120,7 @@ public void shouldGetWeatherWithCityName() throws Exception { @Test @Features("Weather") @Title("Должны получить погоду в городе с названием '0'") - //@TestCaseId("60") + @TestCaseId("60") public void shouldGetWeatherWithCityName0() throws Exception { WeatherResp resp = @@ -129,8 +136,8 @@ public void shouldGetWeatherWithCityName0() throws Exception { @Test @Features("Weather") - @Title("Должны получить код 400 после отправки запроса без параметров") - //@TestCaseId("65") + @Title("Должны получить код 400 после отправки запроса погоды без параметров") + @TestCaseId("65") public void shouldGetErrorCode400AfterSendNoQueryToWeather() throws Exception { given().spec(reqSpec) .get("weather") diff --git a/api-tests-module/src/test/java/ru/qatools/school/apitests/RetrofitTest.java b/api-tests-module/src/test/java/ru/qatools/school/apitests/RetrofitTest.java index 1e6c62a..64c5443 100644 --- a/api-tests-module/src/test/java/ru/qatools/school/apitests/RetrofitTest.java +++ b/api-tests-module/src/test/java/ru/qatools/school/apitests/RetrofitTest.java @@ -3,6 +3,7 @@ import org.apache.http.HttpStatus; import org.junit.After; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import retrofit2.Response; import retrofit2.Retrofit; @@ -11,6 +12,7 @@ import ru.qatools.school.apidata.SuggestResp; import ru.qatools.school.apidata.WeatherApi; import ru.qatools.school.apidata.WeatherResp; +import ru.qatools.school.tp.TPInformerRule; import ru.yandex.qatools.allure.annotations.Features; import ru.yandex.qatools.allure.annotations.Title; @@ -19,6 +21,7 @@ import static org.hamcrest.Matchers.*; import static org.junit.Assert.assertThat; +import static ru.yandex.qatools.matchers.collection.HasSameItemsAsListMatcher.hasSameItemsAsList; /** * @author onegines (Eugene Kirienko) @@ -37,6 +40,9 @@ public class RetrofitTest { .addConverterFactory(GsonConverterFactory.create()) .build(); + @Rule + public TPInformerRule tms = new TPInformerRule("onegines"); + @Before public void init() { weatherApi = retrofit.create(WeatherApi.class); @@ -50,7 +56,7 @@ public void close() { @Test @Features("Suggest") - @Title("Должны получить код 400 после отправки запроса без параметров") + @Title("Должны получить код 400 после отправки запроса саджеста без параметров") //@TestCaseId("53") public void shouldGetErrorCode400AfterSendNoQueryToSuggest() throws IOException { @@ -75,21 +81,21 @@ public void shouldGetSuggestsContainsPartOfName() throws IOException { @Test @Features("Suggest") - @Title("Должны совпадать списки (от API и DB) городов, содержащих в названии строку из запроса") - //@TestCaseId("") + @Title("Должны совпадать списки (от API и DB) саджестов, содержащих в названии города строку из запроса") + //@TestCaseId("75") public void shouldMatchSuggestsFromApiAndDb() throws IOException { Response> respApi = weatherApi.suggest(CITYNAMEPART).execute(); List respDb = dbClient.getSuggestCitiesByNamePart(CITYNAMEPART); assertThat("Неправильный код ответа", respApi.code(), is(HttpStatus.SC_OK)); - assertThat("Списки из API и DB должны совпадать", respApi.body(), is(equalTo(respDb))); + assertThat("Списки из API и DB должны совпадать", respApi.body(), hasSameItemsAsList(respDb)); } @Test @Features("Weather") - @Title("Должны получить код 400 после отправки запроса без параметров") + @Title("Должны получить код 400 после отправки запроса погоды без параметров") //@TestCaseId("65") public void shouldGetErrorCode400AfterSendNoQueryToWeather() throws IOException { diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/SmokeSuite.java b/commons-module/src/test/java/ru/qatools/school/webtests/SmokeSuite.java deleted file mode 100644 index a78b7d3..0000000 --- a/commons-module/src/test/java/ru/qatools/school/webtests/SmokeSuite.java +++ /dev/null @@ -1,153 +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.TestCaseId; -import ru.yandex.qatools.allure.annotations.Title; -import ru.yandex.qatools.htmlelements.element.HtmlElement; - -import java.util.List; - -import static java.util.Arrays.asList; - -/** - * Created by onegines (Eugene Kirienko) - */ -public class SmokeSuite { - - private static final String CITY = "Saint Petersburg"; - private static final String CITY2 = "Moscow"; - private static final String TITLE = "Weather"; - - private DefaultSteps defaultSteps; - - @Rule - public WebDriverRule webDriverRule = new WebDriverRule(); - - @Rule - public TPInformerRule tms = new TPInformerRule("onegines"); - - @Before - public void initSteps() { - defaultSteps = new DefaultSteps(webDriverRule.getDriver()); - } - - private MainPage onMainPage() { - return new MainPage(webDriverRule.getDriver()); - } - - @Test - @Title("Должна открыться требуемая страница") - @TestCaseId("6") - public void shouldBeOnCorrectPage() { - defaultSteps.openMainPage(); - defaultSteps.shouldBeUrl(DefaultSteps.MAIN_PAGE); - defaultSteps.shouldBeTitle(TITLE); - } - - @Test - @Title("Должны видеть кнопку '+' на странице, открытой без параметров") - @TestCaseId("5") - public void shouldSeeAddWidgetButtonOnPageWithNoQuery() { - defaultSteps.openMainPage(); - defaultSteps.shouldSee(onMainPage().getAddWidgetButton()); - } - - @Test - @Title("Должны видеть кнопку '+' на странице, открытой с указанием города в параметрах") - @TestCaseId("7") - public void shouldSeeAddWidgetButtonOnPageWithQuery() { - defaultSteps.openMainPageWithCities(CITY); - defaultSteps.shouldSee(onMainPage().getAddWidgetButton()); - } - - @Test - @Title("Должны видеть виджет города из запроса") - @TestCaseId("8") - public void shouldSeeWidgetFromQuery() { - defaultSteps.openMainPageWithCities(CITY); - defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), CITY); - } - - @Test - @Title("Должны видеть все компоненты виджета") - @TestCaseId("9") - public void shouldSeeAllWidgetBlocks() { - defaultSteps.openMainPageWithCities(CITY); - - List allWidgetBlocks = asList( - onMainPage().getFirstWidget().getWidgetTitle().getCityName(), - onMainPage().getFirstWidget().getWidgetTitle().getCurrentTimeAndDate(), - - onMainPage().getFirstWidget().getWidgetText().getWeatherImage(), - onMainPage().getFirstWidget().getWidgetText().getWeatherTemperatureDigit(), - onMainPage().getFirstWidget().getWidgetText().getWeatherTemperatureUnit(), - - onMainPage().getFirstWidget().getWidgetText().getSunriseLine().getTitle(), - onMainPage().getFirstWidget().getWidgetText().getSunriseLine().getImage(), - onMainPage().getFirstWidget().getWidgetText().getSunriseLine().getValue(), - - onMainPage().getFirstWidget().getWidgetText().getSunsetLine().getTitle(), - onMainPage().getFirstWidget().getWidgetText().getSunsetLine().getImage(), - onMainPage().getFirstWidget().getWidgetText().getSunsetLine().getValue(), - - onMainPage().getFirstWidget().getWidgetText().getWindLine().getTitle(), - onMainPage().getFirstWidget().getWidgetText().getWindLine().getImage(), - onMainPage().getFirstWidget().getWidgetText().getWindLine().getValue(), - - onMainPage().getFirstWidget().getWidgetText().getHumidityLine().getTitle(), - onMainPage().getFirstWidget().getWidgetText().getHumidityLine().getImage(), - onMainPage().getFirstWidget().getWidgetText().getHumidityLine().getValue(), - - onMainPage().getFirstWidget().getWidgetActions().getRemoveWidgetButton() - ); - - defaultSteps.shouldSee(allWidgetBlocks); - } - - @Test - @Title("Должны видеть градусы Цельсия в виджете на странице, открытой с указанием города в параметрах") - @TestCaseId("19") - public void shouldSeeCelsiusInWidgetOnMainPage() { - defaultSteps.openMainPageWithCities(CITY); - defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperatureUnit(), "°C"); - } - - @Test - @Title("Должен добавиться новый виджет после щелчка на кнопке '+'") - @TestCaseId("4") - public void shouldBeAddedNewWidget() { - defaultSteps.openMainPageWithCities(CITY); - int numberOfWidgets = onMainPage().getWeatherWidgets().size(); - defaultSteps.clickOn(onMainPage().getAddWidgetButton()); - defaultSteps.shouldBeThisNumberOfElements(onMainPage().getWeatherWidgets(), numberOfWidgets + 1); - } - - @Test - @Title("Должен измениться город в первом виджете после ввода полного названия города и Return") - @TestCaseId("10") - public void shouldBeRenamedFirstWidgetAfterEnterFullName() { - defaultSteps.openMainPageWithCities(CITY); - defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); - defaultSteps.eraseText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); - defaultSteps.enterText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), CITY2); - defaultSteps.confirmText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); - defaultSteps.waitUntilElementReady(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), 3); - defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), CITY2); - } - - @Test - @Title("Должен удалиться виджет после нажатия на кнопку удаления") - @TestCaseId("11") - public void shouldBeDeletedOneWidget() { - defaultSteps.openMainPageWithCities(CITY, CITY2); - int numberOfWidgets = onMainPage().getWeatherWidgets().size(); - defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetActions().getRemoveWidgetButton()); - defaultSteps.shouldBeThisNumberOfElements(onMainPage().getWeatherWidgets(), numberOfWidgets - 1); - } -} 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 deleted file mode 100644 index 6d61419..0000000 --- a/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package ru.qatools.school.webtests; - -import org.junit.Before; -import org.junit.Rule; -import ru.qatools.school.pages.MainPage; -import ru.qatools.school.rules.WebDriverRule; -import ru.qatools.school.steps.websteps.DefaultSteps; -import ru.qatools.school.tp.TPInformerRule; - -/** - * Created by kurau. - * Changed by onegines (Eugene Kirienko). - */ -public class WeatherWebTest { - - private static final String CITY = "Saint Petersburg"; - private static final String CITY2 = "Moscow"; - private static final String CITY2_BEGIN = "Mosc"; - - private DefaultSteps defaultSteps; - - @Rule - public WebDriverRule webDriverRule = new WebDriverRule(); - - @Rule - public TPInformerRule tms = new TPInformerRule("onegines"); - - @Before - public void initSteps() { - defaultSteps = new DefaultSteps(webDriverRule.getDriver()); - } - - private MainPage onMainPage() { - return new MainPage(webDriverRule.getDriver()); - } - -} diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/RegressionSuite.java b/commons-module/src/test/java/ru/qatools/school/webtests/WebTests.java similarity index 65% rename from commons-module/src/test/java/ru/qatools/school/webtests/RegressionSuite.java rename to commons-module/src/test/java/ru/qatools/school/webtests/WebTests.java index 1de778b..70e157e 100644 --- a/commons-module/src/test/java/ru/qatools/school/webtests/RegressionSuite.java +++ b/commons-module/src/test/java/ru/qatools/school/webtests/WebTests.java @@ -9,20 +9,24 @@ import ru.qatools.school.tp.TPInformerRule; import ru.yandex.qatools.allure.annotations.TestCaseId; import ru.yandex.qatools.allure.annotations.Title; +import ru.yandex.qatools.htmlelements.element.HtmlElement; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; +import java.util.List; import static java.lang.String.format; +import static java.util.Arrays.asList; /** - * Created by onegines (Eugene Kirienko) + * @author by onegines (Eugene Kirienko) */ -public class RegressionSuite { +public class WebTests { private static final String CITY = "Saint Petersburg"; private static final String CITY2 = "Moscow"; private static final String CITY2_BEGIN = "Mosc"; + private static final String TITLE = "Weather"; private DefaultSteps defaultSteps; @@ -41,6 +45,116 @@ private MainPage onMainPage() { return new MainPage(webDriverRule.getDriver()); } + @Test + @Title("Должна открыться требуемая страница") + @TestCaseId("6") + public void shouldBeOnCorrectPage() { + defaultSteps.openMainPage(); + defaultSteps.shouldBeUrl(DefaultSteps.MAIN_PAGE); + defaultSteps.shouldBeTitle(TITLE); + } + + @Test + @Title("Должны видеть кнопку '+' на странице, открытой без параметров") + @TestCaseId("5") + public void shouldSeeAddWidgetButtonOnPageWithNoQuery() { + defaultSteps.openMainPage(); + defaultSteps.shouldSee(onMainPage().getAddWidgetButton()); + } + + @Test + @Title("Должны видеть кнопку '+' на странице, открытой с указанием города в параметрах") + @TestCaseId("7") + public void shouldSeeAddWidgetButtonOnPageWithQuery() { + defaultSteps.openMainPageWithCities(CITY); + defaultSteps.shouldSee(onMainPage().getAddWidgetButton()); + } + + @Test + @Title("Должны видеть виджет города из запроса") + @TestCaseId("8") + public void shouldSeeWidgetFromQuery() { + defaultSteps.openMainPageWithCities(CITY); + defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), CITY); + } + + @Test + @Title("Должны видеть все компоненты виджета") + @TestCaseId("9") + public void shouldSeeAllWidgetBlocks() { + defaultSteps.openMainPageWithCities(CITY); + + List allWidgetBlocks = asList( + onMainPage().getFirstWidget().getWidgetTitle().getCityName(), + onMainPage().getFirstWidget().getWidgetTitle().getCurrentTimeAndDate(), + + onMainPage().getFirstWidget().getWidgetText().getWeatherImage(), + onMainPage().getFirstWidget().getWidgetText().getWeatherTemperatureDigit(), + onMainPage().getFirstWidget().getWidgetText().getWeatherTemperatureUnit(), + + onMainPage().getFirstWidget().getWidgetText().getSunriseLine().getTitle(), + onMainPage().getFirstWidget().getWidgetText().getSunriseLine().getImage(), + onMainPage().getFirstWidget().getWidgetText().getSunriseLine().getValue(), + + onMainPage().getFirstWidget().getWidgetText().getSunsetLine().getTitle(), + onMainPage().getFirstWidget().getWidgetText().getSunsetLine().getImage(), + onMainPage().getFirstWidget().getWidgetText().getSunsetLine().getValue(), + + onMainPage().getFirstWidget().getWidgetText().getWindLine().getTitle(), + onMainPage().getFirstWidget().getWidgetText().getWindLine().getImage(), + onMainPage().getFirstWidget().getWidgetText().getWindLine().getValue(), + + onMainPage().getFirstWidget().getWidgetText().getHumidityLine().getTitle(), + onMainPage().getFirstWidget().getWidgetText().getHumidityLine().getImage(), + onMainPage().getFirstWidget().getWidgetText().getHumidityLine().getValue(), + + onMainPage().getFirstWidget().getWidgetActions().getRemoveWidgetButton() + ); + + defaultSteps.shouldSee(allWidgetBlocks); + } + + @Test + @Title("Должны видеть градусы Цельсия в виджете на странице, открытой с указанием города в параметрах") + @TestCaseId("19") + public void shouldSeeCelsiusInWidgetOnMainPage() { + defaultSteps.openMainPageWithCities(CITY); + defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetText().getWeatherTemperatureUnit(), "°C"); + } + + @Test + @Title("Должен добавиться новый виджет после щелчка на кнопке '+'") + @TestCaseId("4") + public void shouldBeAddedNewWidget() { + defaultSteps.openMainPageWithCities(CITY); + int numberOfWidgets = onMainPage().getWeatherWidgets().size(); + defaultSteps.clickOn(onMainPage().getAddWidgetButton()); + defaultSteps.shouldBeThisNumberOfElements(onMainPage().getWeatherWidgets(), numberOfWidgets + 1); + } + + @Test + @Title("Должен измениться город в первом виджете после ввода полного названия города и Return") + @TestCaseId("10") + public void shouldBeRenamedFirstWidgetAfterEnterFullName() { + defaultSteps.openMainPageWithCities(CITY); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.eraseText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.enterText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), CITY2); + defaultSteps.confirmText(onMainPage().getFirstWidget().getWidgetTitle().getCityName()); + defaultSteps.waitUntilElementReady(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), 3); + defaultSteps.shouldHaveText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), CITY2); + } + + @Test + @Title("Должен удалиться виджет после нажатия на кнопку удаления") + @TestCaseId("11") + public void shouldBeDeletedOneWidget() { + defaultSteps.openMainPageWithCities(CITY, CITY2); + int numberOfWidgets = onMainPage().getWeatherWidgets().size(); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetActions().getRemoveWidgetButton()); + defaultSteps.shouldBeThisNumberOfElements(onMainPage().getWeatherWidgets(), numberOfWidgets - 1); + } + @Test @Title("Должны видеть два виджета на главной странице после загрузки") @TestCaseId("14") @@ -173,7 +287,6 @@ public void shouldSeeNoSuggestAfterClickNotOnIt() { defaultSteps.enterText(onMainPage().getFirstWidget().getWidgetTitle().getCityName(), CITY2_BEGIN); defaultSteps.clickOn(onMainPage().getBody()); defaultSteps.shouldNotSee(onMainPage().getFirstWidget().getWidgetTitle().getCitySuggestBlock()); - } @Test diff --git a/dbclient-module/src/main/java/ru/qatools/school/DbClient.java b/dbclient-module/src/main/java/ru/qatools/school/DbClient.java index 95e4f22..7518941 100644 --- a/dbclient-module/src/main/java/ru/qatools/school/DbClient.java +++ b/dbclient-module/src/main/java/ru/qatools/school/DbClient.java @@ -1,13 +1,14 @@ package ru.qatools.school; -import org.jooq.*; +import org.jooq.DSLContext; +import org.jooq.Record1; +import org.jooq.SQLDialect; import org.jooq.impl.DSL; import ru.qatools.school.apidata.SuggestResp; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; -import java.util.ArrayList; import java.util.List; import static org.jooq.impl.DSL.field; @@ -43,25 +44,11 @@ public String getCityById(Integer id) { } public List getSuggestCitiesByNamePart(String namePart) { - List bdSuggests = new ArrayList<>(); - - Result result = create.select() + List result = create.select() .from(table("City")) - .where(field("name").like("%" + namePart + "%")) - .fetch(); - - for (Record row : result) { - SuggestResp bdSuggest = new SuggestResp(); - - bdSuggest.setId((long) row.getValue("id")); - bdSuggest.setUid((long) row.getValue("uid")); - bdSuggest.setName((String) row.getValue("name")); - bdSuggest.setCountry((String) row.getValue("country")); - - bdSuggests.add(bdSuggest); - } - - return bdSuggests; + .where(field("name").contains(namePart)) + .fetchInto(SuggestResp.class); + return result; } public void close() { From 4dab412ee005d657208f391cab625b7b742bb5bb Mon Sep 17 00:00:00 2001 From: OneginES Date: Wed, 18 May 2016 19:39:59 +0300 Subject: [PATCH 25/26] MobileTest --- .../school/mobiletests/MobileTests.java | 57 +++++++++++++++++++ .../school/rules/MobileDriverRule.java | 34 +++++++++++ .../ru/qatools/school/screens/MainScreen.java | 43 ++++++++++++++ .../school/screens/SelectStationScreen.java | 37 ++++++++++++ .../steps/mobilesteps/DefaultSteps.java | 49 ++++++++++++++++ 5 files changed, 220 insertions(+) create mode 100644 commons-module/src/test/java/ru/qatools/school/mobiletests/MobileTests.java create mode 100644 steps-module/src/main/java/ru/qatools/school/rules/MobileDriverRule.java create mode 100644 steps-module/src/main/java/ru/qatools/school/screens/MainScreen.java create mode 100644 steps-module/src/main/java/ru/qatools/school/screens/SelectStationScreen.java create mode 100644 steps-module/src/main/java/ru/qatools/school/steps/mobilesteps/DefaultSteps.java diff --git a/commons-module/src/test/java/ru/qatools/school/mobiletests/MobileTests.java b/commons-module/src/test/java/ru/qatools/school/mobiletests/MobileTests.java new file mode 100644 index 0000000..bf952f1 --- /dev/null +++ b/commons-module/src/test/java/ru/qatools/school/mobiletests/MobileTests.java @@ -0,0 +1,57 @@ +package ru.qatools.school.mobiletests; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import ru.qatools.school.rules.MobileDriverRule; +import ru.qatools.school.screens.MainScreen; +import ru.qatools.school.screens.SelectStationScreen; +import ru.qatools.school.steps.mobilesteps.DefaultSteps; +import ru.yandex.qatools.allure.annotations.Title; + +/** + * @author by onegines (Eugene Kirienko) + */ +public class MobileTests { + + private static final String STATION_1 = "Arbatskaya"; + private static final String STATION_2 = "Borisovo"; + private static final int MIN_TIME = 10; + + private DefaultSteps defaultSteps; + + @Rule + public MobileDriverRule mobileDriverRule = new MobileDriverRule(); + +// @Rule +// public TPInformerRule tms = new TPInformerRule("onegines"); + + @Before + public void initSteps() { + defaultSteps = new DefaultSteps(mobileDriverRule.getDriver()); + } + + private MainScreen onMainScreen() { + return new MainScreen(mobileDriverRule.getDriver()); + } + + private SelectStationScreen onSelectStationScreen() { + return new SelectStationScreen(mobileDriverRule.getDriver()); + } + + @Test + @Title("Время в пути от Арбатской до Борисово должно быть больше 10 минут") +// @TestCaseId("##") + public void shouldSeeAddWidgetButtonOnPageWithNoQuery() { + defaultSteps.clickOn(onMainScreen().fromField()); + defaultSteps.enterText(onSelectStationScreen().stationNameField(), STATION_1); + defaultSteps.clickOn(onSelectStationScreen().firstResult()); + + defaultSteps.clickOn(onMainScreen().toField()); + defaultSteps.enterText(onSelectStationScreen().stationNameField(), STATION_2); + defaultSteps.clickOn(onSelectStationScreen().firstResult()); + + defaultSteps.shouldSeeTimeMoreThan(onMainScreen().timeField(), MIN_TIME); + } + +} diff --git a/steps-module/src/main/java/ru/qatools/school/rules/MobileDriverRule.java b/steps-module/src/main/java/ru/qatools/school/rules/MobileDriverRule.java new file mode 100644 index 0000000..6ba9a6c --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/rules/MobileDriverRule.java @@ -0,0 +1,34 @@ +package ru.qatools.school.rules; + +import org.junit.rules.ExternalResource; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.remote.DesiredCapabilities; +import org.openqa.selenium.remote.RemoteWebDriver; + +import java.net.URL; + +/** + * @author onegines (Eugene Kirienko) + */ +public class MobileDriverRule extends ExternalResource { + + private WebDriver driver; + + protected void before() throws Throwable { + DesiredCapabilities desiredCapabilities = new DesiredCapabilities(); + desiredCapabilities.setCapability("platformName", "Android"); + desiredCapabilities.setCapability("deviceName", "Android"); + desiredCapabilities.setCapability("app", "http://autoschool.github.io/files/ya-metro.apk"); + desiredCapabilities.setCapability("appWaitActivity", "ru.yandex.metro.MainActivity"); + driver = new RemoteWebDriver(new URL("http://127.0.0.1:4723/wd/hub"), desiredCapabilities); + } + + protected void after() { + driver.quit(); + } + + public WebDriver getDriver() { + return driver; + } + +} diff --git a/steps-module/src/main/java/ru/qatools/school/screens/MainScreen.java b/steps-module/src/main/java/ru/qatools/school/screens/MainScreen.java new file mode 100644 index 0000000..6bb06e4 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/screens/MainScreen.java @@ -0,0 +1,43 @@ +package ru.qatools.school.screens; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; +import org.openqa.selenium.support.PageFactory; +import ru.yandex.qatools.htmlelements.annotations.Name; +import ru.yandex.qatools.htmlelements.loader.decorator.HtmlElementDecorator; +import ru.yandex.qatools.htmlelements.loader.decorator.HtmlElementLocatorFactory; + +/** + * @author onegines (Eugene Kirienko) + */ +public class MainScreen { + + @Name("Поле ввода начальной станции") + @FindBy(id = "layout_from") + private WebElement fromField; + + @Name("Поле ввода конечной станции") + @FindBy(id = "layout_to") + private WebElement toField; + + @Name("Время в пути") + @FindBy(id = "tv_time") + private WebElement timeField; + + public MainScreen(WebDriver driver) { + PageFactory.initElements(new HtmlElementDecorator(new HtmlElementLocatorFactory(driver)), this); + } + + public WebElement fromField() { + return fromField; + } + + public WebElement toField() { + return toField; + } + + public WebElement timeField() { + return timeField; + } +} diff --git a/steps-module/src/main/java/ru/qatools/school/screens/SelectStationScreen.java b/steps-module/src/main/java/ru/qatools/school/screens/SelectStationScreen.java new file mode 100644 index 0000000..8b17e69 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/screens/SelectStationScreen.java @@ -0,0 +1,37 @@ +package ru.qatools.school.screens; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; +import org.openqa.selenium.support.PageFactory; +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; + +/** + * @author onegines (Eugene Kirienko) + */ +public class SelectStationScreen { + + @Name("Поле ввода названия станции") + @FindBy(id = "filterTextId") + private WebElement stationNameField; + + @Name("Поля результата поиска названия станции") + @FindBy(id = "txtStationName") + private List stationNameResults; + + public SelectStationScreen(WebDriver driver) { + PageFactory.initElements(new HtmlElementDecorator(new HtmlElementLocatorFactory(driver)), this); + } + + public WebElement stationNameField() { + return stationNameField; + } + + public WebElement firstResult() { + return stationNameResults.get(0); + } +} diff --git a/steps-module/src/main/java/ru/qatools/school/steps/mobilesteps/DefaultSteps.java b/steps-module/src/main/java/ru/qatools/school/steps/mobilesteps/DefaultSteps.java new file mode 100644 index 0000000..0a78ca8 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/steps/mobilesteps/DefaultSteps.java @@ -0,0 +1,49 @@ +package ru.qatools.school.steps.mobilesteps; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import ru.yandex.qatools.allure.annotations.Step; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import static org.hamcrest.Matchers.greaterThan; +import static org.junit.Assert.assertThat; + +/** + * @author onegines (Eugene Kirienko) + */ +public class DefaultSteps { + + private WebDriver driver; + + public DefaultSteps(WebDriver driver) { + this.driver = driver; + } + + + @Step("Кликаем по элементу {0}") + public void clickOn(WebElement element) { + element.click(); + } + + @Step("Вводим текст «{1}» в элемент «{0}»") + public void enterText(WebElement element, String text) { + element.sendKeys(text); + } + + @Step("Время в элементе «{0}» должно быть больше «{1}»") + public void shouldSeeTimeMoreThan(WebElement element, int minTime) { + + String timeInText = element.getText(); + Pattern pattern = Pattern.compile("\\d+"); + Matcher matcher = pattern.matcher(timeInText); + + if (matcher.find()) { + int timeInMinutes = Integer.parseInt(matcher.group()); + assertThat("Неправильное время", timeInMinutes, greaterThan(minTime)); + } else { + throw new NumberFormatException("Can't parse in number: " + timeInText); + } + } +} From 86154dab34e2fb8074a0a0dd272cf1c386f2c317 Mon Sep 17 00:00:00 2001 From: OneginES Date: Thu, 19 May 2016 13:40:08 +0300 Subject: [PATCH 26/26] Fix test for time greater than 1h. Rename DefaultSteps to MobileSteps Rename clickOn to tapOn --- .../school/mobiletests/MobileTests.java | 20 +++++++++---------- .../{DefaultSteps.java => MobileSteps.java} | 15 +++++++------- 2 files changed, 17 insertions(+), 18 deletions(-) rename steps-module/src/main/java/ru/qatools/school/steps/mobilesteps/{DefaultSteps.java => MobileSteps.java} (71%) diff --git a/commons-module/src/test/java/ru/qatools/school/mobiletests/MobileTests.java b/commons-module/src/test/java/ru/qatools/school/mobiletests/MobileTests.java index bf952f1..2540530 100644 --- a/commons-module/src/test/java/ru/qatools/school/mobiletests/MobileTests.java +++ b/commons-module/src/test/java/ru/qatools/school/mobiletests/MobileTests.java @@ -6,7 +6,7 @@ import ru.qatools.school.rules.MobileDriverRule; import ru.qatools.school.screens.MainScreen; import ru.qatools.school.screens.SelectStationScreen; -import ru.qatools.school.steps.mobilesteps.DefaultSteps; +import ru.qatools.school.steps.mobilesteps.MobileSteps; import ru.yandex.qatools.allure.annotations.Title; /** @@ -18,7 +18,7 @@ public class MobileTests { private static final String STATION_2 = "Borisovo"; private static final int MIN_TIME = 10; - private DefaultSteps defaultSteps; + private MobileSteps mobSteps; @Rule public MobileDriverRule mobileDriverRule = new MobileDriverRule(); @@ -28,7 +28,7 @@ public class MobileTests { @Before public void initSteps() { - defaultSteps = new DefaultSteps(mobileDriverRule.getDriver()); + mobSteps = new MobileSteps(mobileDriverRule.getDriver()); } private MainScreen onMainScreen() { @@ -43,15 +43,15 @@ private SelectStationScreen onSelectStationScreen() { @Title("Время в пути от Арбатской до Борисово должно быть больше 10 минут") // @TestCaseId("##") public void shouldSeeAddWidgetButtonOnPageWithNoQuery() { - defaultSteps.clickOn(onMainScreen().fromField()); - defaultSteps.enterText(onSelectStationScreen().stationNameField(), STATION_1); - defaultSteps.clickOn(onSelectStationScreen().firstResult()); + mobSteps.tapOn(onMainScreen().fromField()); + mobSteps.enterText(onSelectStationScreen().stationNameField(), STATION_1); + mobSteps.tapOn(onSelectStationScreen().firstResult()); - defaultSteps.clickOn(onMainScreen().toField()); - defaultSteps.enterText(onSelectStationScreen().stationNameField(), STATION_2); - defaultSteps.clickOn(onSelectStationScreen().firstResult()); + mobSteps.tapOn(onMainScreen().toField()); + mobSteps.enterText(onSelectStationScreen().stationNameField(), STATION_2); + mobSteps.tapOn(onSelectStationScreen().firstResult()); - defaultSteps.shouldSeeTimeMoreThan(onMainScreen().timeField(), MIN_TIME); + mobSteps.shouldSeeTimeMoreThan(onMainScreen().timeField(), MIN_TIME); } } diff --git a/steps-module/src/main/java/ru/qatools/school/steps/mobilesteps/DefaultSteps.java b/steps-module/src/main/java/ru/qatools/school/steps/mobilesteps/MobileSteps.java similarity index 71% rename from steps-module/src/main/java/ru/qatools/school/steps/mobilesteps/DefaultSteps.java rename to steps-module/src/main/java/ru/qatools/school/steps/mobilesteps/MobileSteps.java index 0a78ca8..d5c8ef5 100644 --- a/steps-module/src/main/java/ru/qatools/school/steps/mobilesteps/DefaultSteps.java +++ b/steps-module/src/main/java/ru/qatools/school/steps/mobilesteps/MobileSteps.java @@ -13,17 +13,17 @@ /** * @author onegines (Eugene Kirienko) */ -public class DefaultSteps { +public class MobileSteps { private WebDriver driver; - public DefaultSteps(WebDriver driver) { + public MobileSteps(WebDriver driver) { this.driver = driver; } @Step("Кликаем по элементу {0}") - public void clickOn(WebElement element) { + public void tapOn(WebElement element) { element.click(); } @@ -39,11 +39,10 @@ public void shouldSeeTimeMoreThan(WebElement element, int minTime) { Pattern pattern = Pattern.compile("\\d+"); Matcher matcher = pattern.matcher(timeInText); - if (matcher.find()) { - int timeInMinutes = Integer.parseInt(matcher.group()); - assertThat("Неправильное время", timeInMinutes, greaterThan(minTime)); - } else { - throw new NumberFormatException("Can't parse in number: " + timeInText); + int timeInMinutes = 0; + while (matcher.find()) { + timeInMinutes = timeInMinutes * 60 + Integer.parseInt(matcher.group()); } + assertThat("Неправильное время", timeInMinutes, greaterThan(minTime)); } }