From 6aef37c446d71ed43654f75fcfb0e2ce5d478e48 Mon Sep 17 00:00:00 2001 From: arrumm Date: Tue, 26 Apr 2016 00:15:43 +0300 Subject: [PATCH 1/7] added methods for Smoke testing, refactoring --- .../qatools/school/tp/ConnectedToTPTest.java | 6 +- .../school/webtests/WeatherWebTest.java | 95 ++++++++++++++++++- pom.xml | 3 + .../ru/qatools/school/pages/MainPage.java | 15 ++- .../school/pages/blocks/WeatherWidget.java | 6 +- .../pages/blocks/widgetblocks/WidgetText.java | 8 ++ .../blocks/widgetblocks/WidgetTitle.java | 13 +++ .../qatools/school/rules/WebDriverRule.java | 8 ++ .../school/steps/websteps/DefaultSteps.java | 58 ++++++++++- 9 files changed, 196 insertions(+), 16 deletions(-) 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 index cc66bbe..62ddb1c 100644 --- a/commons-module/src/test/java/ru/qatools/school/tp/ConnectedToTPTest.java +++ b/commons-module/src/test/java/ru/qatools/school/tp/ConnectedToTPTest.java @@ -1,5 +1,6 @@ package ru.qatools.school.tp; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import ru.yandex.qatools.allure.annotations.TestCaseId; @@ -18,13 +19,14 @@ public class ConnectedToTPTest { public TPInformerRule tms = new TPInformerRule("ruletest"); + @Ignore @Test @TestCaseId("1") public void shouldMarkCaseStatusAsPassed() throws IOException, InterruptedException { SECONDS.sleep(15); } - + @Ignore @Test @TestCaseId("2") public void shouldFail() throws IOException, InterruptedException { @@ -32,6 +34,7 @@ public void shouldFail() throws IOException, InterruptedException { fail(); } + @Ignore @Test @TestCaseId("3") public void shouldBroke() throws IOException, InterruptedException { @@ -39,6 +42,7 @@ public void shouldBroke() throws IOException, InterruptedException { throw new RuntimeException(); } + @Ignore @Test @TestCaseId("4") public void shouldBeSkipped() throws IOException, InterruptedException { 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..30537da 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,36 +1,121 @@ package ru.qatools.school.webtests; +/* @author arrumm (Arkhipov Roman) */ + import org.junit.Before; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; +import org.openqa.selenium.Keys; +import org.openqa.selenium.WebElement; import ru.qatools.school.pages.MainPage; import ru.qatools.school.rules.WebDriverRule; import ru.qatools.school.steps.websteps.DefaultSteps; +import ru.qatools.school.tp.TPInformerRule; import ru.yandex.qatools.allure.annotations.Title; +import ru.yandex.qatools.allure.annotations.TestCaseId; + +import java.util.List; public class WeatherWebTest { - public static final String MOSCOW = "Moscow"; + private static final String CITY = "Tomsk"; private DefaultSteps defaultSteps; @Rule public WebDriverRule webDriverRule = new WebDriverRule(); + @Rule + public TPInformerRule tms = new TPInformerRule("arrumm"); + @Before public void initSteps() { defaultSteps = new DefaultSteps(webDriverRule.getDriver()); } @Test - @Title("Должны видеть виджет на главной странице") + @Title("Should see add widget button on the main page (URL without params)") + @TestCaseId("6") + public void shouldSeeAddWidgetButtonOnMainPageWithoutParams() { + defaultSteps.openMainPageWithoutParams(); + defaultSteps.shouldSeeElement(defaultSteps.getNewCardButton()); + } + + @Test + @Title("Should see widget on the main page") + @TestCaseId("7") public void shouldSeeWidgetOnMainPage() { - defaultSteps.openMainPageWithCity(MOSCOW); - defaultSteps.shouldSee(onMainPage().getWeatherWidget().get(0)); + defaultSteps.openMainPageWithCity(null); + defaultSteps.shouldSeeElement(defaultSteps.getFirstWidget()); + } + + @Test + @Title("Should see picture on widget shows weather") + @TestCaseId("11") + public void shouldSeeWeatherPictOnMainPage() { + defaultSteps.openMainPageWithCity(CITY); + defaultSteps.shouldSeeElement(defaultSteps.getFirstWidget().getWidgetText().getWeatherImage()); + } + + + + @Test + @Title("Should see city name at widget title like in URL on the main page") + @TestCaseId("1") + public void shouldSeeWidgetWithCityInURLOnMainPage() { + defaultSteps.openMainPageWithCity(CITY); + defaultSteps.shouldSeeElementTextIsSameToText( + defaultSteps.getFirstWidget().getWidgetTitle().getCityNameElement(), + CITY); + } + + @Test + @Title("Should see +1 widget on da main page after adding") + @TestCaseId("8") + public void shouldDetectOnceMoreWidgetOnThePage() { + defaultSteps.openMainPageWithCity(CITY); + int widgetsQ = onMainPage().getWeatherWidgetList().size(); + defaultSteps.onClickElement(onMainPage().getNewCardButton()); + defaultSteps.shouldBeWidgetsQuantityOnPage(onMainPage().getWeatherWidgetList(), widgetsQ + 1); + defaultSteps.shouldSeeAllElementFromList(onMainPage().getWeatherWidgetList()); + } + + @Ignore + @Test + @Title("Should see widget title") + @TestCaseId("12") + public void shouldSeeWidgetTitle() { + defaultSteps.openMainPageWithCity(CITY); + defaultSteps.shouldSeeElement(defaultSteps.getFirstWidget()); } + @Test + @Title("Should see field on the widget shows temperature") + @TestCaseId("10") + public void shouldSeeTemperatureOnMainPage() { + defaultSteps.openMainPageWithCity(CITY); + defaultSteps.shouldSeeElement(defaultSteps.getFirstWidget().getWidgetText().getTemperature()); + } + + @Test + @Title("Should see same city in the title as entered by kboard") + @TestCaseId("9") + public void shouldSeeWidgetWithCityWhichEnter() { + defaultSteps.openMainPageWithCity(null); + defaultSteps.onClickElement(onMainPage().getNewCardButton()); + defaultSteps.onClickElement(defaultSteps.getFirstWidget().getWidgetTitle().getCityNameElement()); + defaultSteps.getFirstWidget().getWidgetTitle().getCityNameElement().clear(); + defaultSteps.getFirstWidget().getWidgetTitle().getCityNameElement().sendKeys(CITY); + defaultSteps.getFirstWidget().getWidgetTitle().getCityNameElement().sendKeys(Keys.ENTER); + defaultSteps.shouldSeeElementTextIsSameToText( + defaultSteps.getFirstWidget().getWidgetTitle().getCityNameElement(), + CITY); + } + + private MainPage onMainPage() { return new MainPage(webDriverRule.getDriver()); } -} +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index a32202a..95a9647 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,9 @@ 2.53.0 1.15 1.8.5 + + UTF-8 + 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..a53935f 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,10 +1,12 @@ 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; import ru.yandex.qatools.htmlelements.annotations.Name; +import ru.yandex.qatools.htmlelements.element.Button; import ru.yandex.qatools.htmlelements.loader.decorator.HtmlElementDecorator; import ru.yandex.qatools.htmlelements.loader.decorator.HtmlElementLocatorFactory; @@ -21,10 +23,17 @@ public MainPage(WebDriver driver) { @Name("Список виджетов") @FindBy(css = ".card.card_md") - private List weatherWidget; + private List weatherWidgetList; - public List getWeatherWidget() { - return weatherWidget; + @Name("Кнопка добавления виджета на страницу") + @FindBy(css = ".new-card") + private WebElement newCardButton; + + public List getWeatherWidgetList() { + return weatherWidgetList; } + public WebElement getNewCardButton() { + return newCardButton; + } } 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..0fd5f8a 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 @@ -6,6 +6,7 @@ import ru.qatools.school.pages.blocks.widgetblocks.WidgetText; import ru.qatools.school.pages.blocks.widgetblocks.WidgetTitle; import ru.yandex.qatools.htmlelements.annotations.Name; +import ru.yandex.qatools.htmlelements.element.Button; import ru.yandex.qatools.htmlelements.element.HtmlElement; /** @@ -33,11 +34,8 @@ public WidgetTitle getWidgetTitle() { return widgetTitle; } - public WebElement getActions() { - return actions; - } - public Rectangle getRect() { return null; } + } diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetText.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetText.java index 510d070..a00b4d9 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 @@ -15,6 +15,14 @@ public class WidgetText extends HtmlElement { @FindBy(css = ".weather-image") private WebElement weatherImage; + @Name("Значение температуры") + @FindBy(css = ".weather-temperature__digit") + private WebElement temperature; + + public WebElement getTemperature() { + return temperature; + } + public WebElement getWeatherImage() { return weatherImage; } 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..88253f4 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 @@ -2,12 +2,25 @@ import org.openqa.selenium.Rectangle; import ru.yandex.qatools.htmlelements.element.HtmlElement; +import org.openqa.selenium.support.FindBy; +import ru.yandex.qatools.htmlelements.annotations.Name; +import ru.yandex.qatools.htmlelements.element.HtmlElement; /** * Created by kurau. + * added by arrumm (Arkhipov Roman) */ public class WidgetTitle extends HtmlElement { + @Name("Название города в заголовке") + @FindBy(css = ".inplace") + private WidgetTitle cityNameElement; + + + public HtmlElement getCityNameElement() { + return cityNameElement; + } + public Rectangle getRect() { return null; } diff --git a/steps-module/src/main/java/ru/qatools/school/rules/WebDriverRule.java b/steps-module/src/main/java/ru/qatools/school/rules/WebDriverRule.java index 418c363..1573eef 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 @@ -2,16 +2,24 @@ import org.junit.rules.ExternalResource; import org.openqa.selenium.WebDriver; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.firefox.FirefoxBinary; import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.firefox.FirefoxProfile; + +import java.io.File; /** * Created by kurau. + * added by arrumm (Arkhipov Roman) */ public class WebDriverRule extends ExternalResource { private WebDriver driver; protected void before() throws Throwable { + + System.setProperty("webdriver.firefox.bin", "D:\\my Programs\\firefox\\firefox.exe"); this.driver = new FirefoxDriver(); } 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..ca902eb 100644 --- a/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java +++ b/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java @@ -3,18 +3,32 @@ 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.Button; + +import java.util.List; import static java.lang.String.format; +import static java.lang.Comparable.*; +import static org.hamcrest.Matchers.*; +import static org.hamcrest.core.Is.is; +import static org.hamcrest.core.Every.everyItem; 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; /** * Created by kurau. + * + * @author arrumm (Arkhipov Roman) */ 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 static final String MAIN_PAGE_WOUTPARS = "http://weather.lanwen.ru/"; private WebDriver driver; @@ -27,9 +41,47 @@ public void openMainPageWithCity(String city) { driver.get(format(MAIN_PAGE, city)); } + @Step("Открываем главную страницу как обычный пользователь") + public void openMainPageWithoutParams() { + driver.get(MAIN_PAGE_WOUTPARS); + } + @Step("Должны видеть на странице «{0}»") - public void shouldSee(WebElement element) { - assertThat("Должны видеть элемент", element, isDisplayed()); + public void shouldSeeElement(WebElement element) { + assertThat("Должны видеть элемент", element, both(exists()).and(isDisplayed())); + } + + @Step("Должны видеть на странице все элементы списка «{0}»") + public void shouldSeeAllElementFromList(List wwList) { + assertThat("Видим не все элементы", (List)wwList, everyItem(both(exists()).and(isDisplayed()))); + } + + @Step("Текст «{0}» элемента должен быть «{1}»") + public void shouldSeeElementTextIsSameToText(WebElement webElement, String text) { + assertThat("Текст элемента и ожидаемый не совпадают", webElement, hasText(text)); + } + + @Step("Должен кликнуться элемент «{0}»") + public void onClickElement(WebElement element) { + element.click(); + } + + @Step("Должна кликнуться кнопка «{0}»") + public void onClickButton(Button element) { + element.click(); + } + + @Step("Количество виджетов на странице должно быть «{0}»") + public void shouldBeWidgetsQuantityOnPage(List wwList, int widgetsQuantity) { + assertThat("Количество виджетов на странице не равно ожидаемому", wwList, hasSize(widgetsQuantity)); + } + + public WeatherWidget getFirstWidget() { + return onMainPage().getWeatherWidgetList().get(0); + } + + public WebElement getNewCardButton() { + return onMainPage().getNewCardButton(); } private MainPage onMainPage() { From 0ab6bf7627593cd019b572dfc03e044d0a247d7b Mon Sep 17 00:00:00 2001 From: arrumm Date: Tue, 26 Apr 2016 08:43:10 +0300 Subject: [PATCH 2/7] added methods for Smoke testing, refactoring --- .../java/ru/qatools/school/webtests/WeatherWebTest.java | 6 +++--- pom.xml | 3 +++ 2 files changed, 6 insertions(+), 3 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 30537da..5c6c892 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 @@ -46,7 +46,7 @@ public void shouldSeeAddWidgetButtonOnMainPageWithoutParams() { @Title("Should see widget on the main page") @TestCaseId("7") public void shouldSeeWidgetOnMainPage() { - defaultSteps.openMainPageWithCity(null); + defaultSteps.openMainPageWithCity(CITY); defaultSteps.shouldSeeElement(defaultSteps.getFirstWidget()); } @@ -81,13 +81,13 @@ public void shouldDetectOnceMoreWidgetOnThePage() { defaultSteps.shouldSeeAllElementFromList(onMainPage().getWeatherWidgetList()); } - @Ignore + //@Ignore @Test @Title("Should see widget title") @TestCaseId("12") public void shouldSeeWidgetTitle() { defaultSteps.openMainPageWithCity(CITY); - defaultSteps.shouldSeeElement(defaultSteps.getFirstWidget()); + defaultSteps.shouldSeeElement(defaultSteps.getFirstWidget().getWidgetTitle()); } @Test diff --git a/pom.xml b/pom.xml index 95a9647..0931d31 100644 --- a/pom.xml +++ b/pom.xml @@ -4,6 +4,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 + ru.qatools.school school-2016 1.0-SNAPSHOT @@ -100,6 +101,8 @@ -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar" + -Xmx2048m + -Xss4m listener From 7b12d2aff292810890343dc60581723ec5040eb9 Mon Sep 17 00:00:00 2001 From: arrumm Date: Tue, 26 Apr 2016 08:56:20 +0300 Subject: [PATCH 3/7] translate titles --- .../school/steps/websteps/DefaultSteps.java | 27 ++++++++----------- 1 file changed, 11 insertions(+), 16 deletions(-) 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 ca902eb..83cfaee 100644 --- a/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java +++ b/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java @@ -36,44 +36,39 @@ public DefaultSteps(WebDriver driver) { this.driver = driver; } - @Step("Открываем главную страницу для города «{0}»") + @Step("Open main page with city «{0}»") public void openMainPageWithCity(String city) { driver.get(format(MAIN_PAGE, city)); } - @Step("Открываем главную страницу как обычный пользователь") + @Step("Open main page as a user") public void openMainPageWithoutParams() { driver.get(MAIN_PAGE_WOUTPARS); } - @Step("Должны видеть на странице «{0}»") + @Step("Shoul see on the page «{0}»") public void shouldSeeElement(WebElement element) { - assertThat("Должны видеть элемент", element, both(exists()).and(isDisplayed())); + assertThat("Don't see element", element, both(exists()).and(isDisplayed())); } - @Step("Должны видеть на странице все элементы списка «{0}»") + @Step("Should see all list elements on the page «{0}»") public void shouldSeeAllElementFromList(List wwList) { - assertThat("Видим не все элементы", (List)wwList, everyItem(both(exists()).and(isDisplayed()))); + assertThat("Don't see all elements", (List)wwList, everyItem(both(exists()).and(isDisplayed()))); } - @Step("Текст «{0}» элемента должен быть «{1}»") + @Step("Text «{0}» should be «{1}»") public void shouldSeeElementTextIsSameToText(WebElement webElement, String text) { - assertThat("Текст элемента и ожидаемый не совпадают", webElement, hasText(text)); + assertThat("Expected and actual texts don't match", webElement, hasText(text)); } - @Step("Должен кликнуться элемент «{0}»") + @Step("Clicking element «{0}»") public void onClickElement(WebElement element) { element.click(); } - @Step("Должна кликнуться кнопка «{0}»") - public void onClickButton(Button element) { - element.click(); - } - - @Step("Количество виджетов на странице должно быть «{0}»") + @Step("Number of widgets on the page should be «{0}»") public void shouldBeWidgetsQuantityOnPage(List wwList, int widgetsQuantity) { - assertThat("Количество виджетов на странице не равно ожидаемому", wwList, hasSize(widgetsQuantity)); + assertThat("Number of widgets on the page and expected don't match", wwList, hasSize(widgetsQuantity)); } public WeatherWidget getFirstWidget() { From 4efb6f99eb47baab8d0e966161e2fc073b076e09 Mon Sep 17 00:00:00 2001 From: arrumm Date: Wed, 27 Apr 2016 20:56:51 +0300 Subject: [PATCH 4/7] refactoring due to useful comments --- .../school/webtests/WeatherWebTest.java | 55 ++++++++----------- .../ru/qatools/school/pages/MainPage.java | 6 +- .../school/steps/websteps/DefaultSteps.java | 39 ++++++------- 3 files changed, 46 insertions(+), 54 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 5c6c892..745c3c2 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 @@ -3,19 +3,15 @@ /* @author arrumm (Arkhipov Roman) */ import org.junit.Before; -import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.openqa.selenium.Keys; -import org.openqa.selenium.WebElement; import ru.qatools.school.pages.MainPage; import ru.qatools.school.rules.WebDriverRule; import ru.qatools.school.steps.websteps.DefaultSteps; import ru.qatools.school.tp.TPInformerRule; -import ru.yandex.qatools.allure.annotations.Title; import ru.yandex.qatools.allure.annotations.TestCaseId; - -import java.util.List; +import ru.yandex.qatools.allure.annotations.Title; public class WeatherWebTest { @@ -39,7 +35,7 @@ public void initSteps() { @TestCaseId("6") public void shouldSeeAddWidgetButtonOnMainPageWithoutParams() { defaultSteps.openMainPageWithoutParams(); - defaultSteps.shouldSeeElement(defaultSteps.getNewCardButton()); + defaultSteps.shouldSeeElement(onMainPage().getNewCardButton()); } @Test @@ -47,69 +43,66 @@ public void shouldSeeAddWidgetButtonOnMainPageWithoutParams() { @TestCaseId("7") public void shouldSeeWidgetOnMainPage() { defaultSteps.openMainPageWithCity(CITY); - defaultSteps.shouldSeeElement(defaultSteps.getFirstWidget()); + defaultSteps.shouldSeeElement(onMainPage().getFirstWidget()); } @Test @Title("Should see picture on widget shows weather") @TestCaseId("11") - public void shouldSeeWeatherPictOnMainPage() { + public void shouldSeeWeatherPict() { defaultSteps.openMainPageWithCity(CITY); - defaultSteps.shouldSeeElement(defaultSteps.getFirstWidget().getWidgetText().getWeatherImage()); + defaultSteps.shouldSeeElement(onMainPage().getFirstWidget().getWidgetText().getWeatherImage()); } - - @Test - @Title("Should see city name at widget title like in URL on the main page") + @Title("City name at widget title match city in URL") @TestCaseId("1") public void shouldSeeWidgetWithCityInURLOnMainPage() { defaultSteps.openMainPageWithCity(CITY); - defaultSteps.shouldSeeElementTextIsSameToText( - defaultSteps.getFirstWidget().getWidgetTitle().getCityNameElement(), + defaultSteps.shouldSeeTextInElement( + onMainPage().getFirstWidget().getWidgetTitle().getCityNameElement(), CITY); } @Test - @Title("Should see +1 widget on da main page after adding") + @Title("Should see once more widget on the main page after adding") @TestCaseId("8") public void shouldDetectOnceMoreWidgetOnThePage() { defaultSteps.openMainPageWithCity(CITY); int widgetsQ = onMainPage().getWeatherWidgetList().size(); - defaultSteps.onClickElement(onMainPage().getNewCardButton()); - defaultSteps.shouldBeWidgetsQuantityOnPage(onMainPage().getWeatherWidgetList(), widgetsQ + 1); + defaultSteps.clickOn(onMainPage().getNewCardButton()); + defaultSteps.shouldBeWidgetsQuantity(onMainPage().getWeatherWidgetList(), widgetsQ + 1); defaultSteps.shouldSeeAllElementFromList(onMainPage().getWeatherWidgetList()); } - //@Ignore @Test @Title("Should see widget title") @TestCaseId("12") public void shouldSeeWidgetTitle() { defaultSteps.openMainPageWithCity(CITY); - defaultSteps.shouldSeeElement(defaultSteps.getFirstWidget().getWidgetTitle()); + defaultSteps.shouldSeeElement(onMainPage().getFirstWidget().getWidgetTitle()); } @Test - @Title("Should see field on the widget shows temperature") + @Title("Should see temperature on the widget") @TestCaseId("10") - public void shouldSeeTemperatureOnMainPage() { + public void shouldSeeTemperatureOnWidget() { defaultSteps.openMainPageWithCity(CITY); - defaultSteps.shouldSeeElement(defaultSteps.getFirstWidget().getWidgetText().getTemperature()); + defaultSteps.shouldSeeElement(onMainPage().getFirstWidget().getWidgetText().getTemperature()); } @Test - @Title("Should see same city in the title as entered by kboard") + @Title("Should see city in the widget entered by keyboard") @TestCaseId("9") - public void shouldSeeWidgetWithCityWhichEnter() { + public void shouldSeeCityInputFromKeyboard() { defaultSteps.openMainPageWithCity(null); - defaultSteps.onClickElement(onMainPage().getNewCardButton()); - defaultSteps.onClickElement(defaultSteps.getFirstWidget().getWidgetTitle().getCityNameElement()); - defaultSteps.getFirstWidget().getWidgetTitle().getCityNameElement().clear(); - defaultSteps.getFirstWidget().getWidgetTitle().getCityNameElement().sendKeys(CITY); - defaultSteps.getFirstWidget().getWidgetTitle().getCityNameElement().sendKeys(Keys.ENTER); - defaultSteps.shouldSeeElementTextIsSameToText( - defaultSteps.getFirstWidget().getWidgetTitle().getCityNameElement(), + defaultSteps.clickOn(onMainPage().getNewCardButton()); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getCityNameElement()); + defaultSteps.clearIt(onMainPage().getFirstWidget().getWidgetTitle().getCityNameElement()); + defaultSteps.sendKeysToElement(onMainPage().getFirstWidget().getWidgetTitle().getCityNameElement(), CITY); + defaultSteps.sendKeysToElement(onMainPage().getFirstWidget().getWidgetTitle().getCityNameElement(), Keys.ENTER); + defaultSteps.shouldSeeTextInElement( + onMainPage().getFirstWidget().getWidgetTitle().getCityNameElement(), CITY); } 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 a53935f..a1709bf 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,7 +6,6 @@ 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.Button; import ru.yandex.qatools.htmlelements.loader.decorator.HtmlElementDecorator; import ru.yandex.qatools.htmlelements.loader.decorator.HtmlElementLocatorFactory; @@ -36,4 +35,9 @@ public List getWeatherWidgetList() { public WebElement getNewCardButton() { return newCardButton; } + + public WeatherWidget getFirstWidget() { + return getWeatherWidgetList().get(0); + } + } 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 83cfaee..97c99df 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,22 +2,17 @@ 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.Button; import java.util.List; import static java.lang.String.format; -import static java.lang.Comparable.*; -import static org.hamcrest.Matchers.*; -import static org.hamcrest.core.Is.is; +import static org.hamcrest.Matchers.both; +import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.core.Every.everyItem; 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. @@ -28,7 +23,7 @@ public class DefaultSteps { private static final String MAIN_PAGE = "http://weather.lanwen.ru/#?cities=%s"; - private static final String MAIN_PAGE_WOUTPARS = "http://weather.lanwen.ru/"; + private static final String MAIN_PAGE_WITHOUTPARAMETERS = "http://weather.lanwen.ru/"; private WebDriver driver; @@ -41,12 +36,12 @@ public void openMainPageWithCity(String city) { driver.get(format(MAIN_PAGE, city)); } - @Step("Open main page as a user") + @Step("Open main page without parameters") public void openMainPageWithoutParams() { - driver.get(MAIN_PAGE_WOUTPARS); + driver.get(MAIN_PAGE_WITHOUTPARAMETERS); } - @Step("Shoul see on the page «{0}»") + @Step("Should see on the page «{0}»") public void shouldSeeElement(WebElement element) { assertThat("Don't see element", element, both(exists()).and(isDisplayed())); } @@ -57,29 +52,29 @@ public void shouldSeeAllElementFromList(List wwList) { } @Step("Text «{0}» should be «{1}»") - public void shouldSeeElementTextIsSameToText(WebElement webElement, String text) { + public void shouldSeeTextInElement(WebElement webElement, String text) { assertThat("Expected and actual texts don't match", webElement, hasText(text)); } @Step("Clicking element «{0}»") - public void onClickElement(WebElement element) { + public void clickOn(WebElement element) { element.click(); } @Step("Number of widgets on the page should be «{0}»") - public void shouldBeWidgetsQuantityOnPage(List wwList, int widgetsQuantity) { + public void shouldBeWidgetsQuantity(List wwList, int widgetsQuantity) { assertThat("Number of widgets on the page and expected don't match", wwList, hasSize(widgetsQuantity)); } - public WeatherWidget getFirstWidget() { - return onMainPage().getWeatherWidgetList().get(0); + @Step("Clear element «{0}»") + public void clearIt(WebElement element) { + element.clear(); } - public WebElement getNewCardButton() { - return onMainPage().getNewCardButton(); + @Step("Send keys to element «{0}»") + public void sendKeysToElement(WebElement element, CharSequence ... keys) { + element.sendKeys(keys); } - private MainPage onMainPage() { - return new MainPage(driver); - } + } From 20b92d2732aca2be21a4abadd782e0a369c91c3a Mon Sep 17 00:00:00 2001 From: arrumm Date: Fri, 29 Apr 2016 13:50:00 +0300 Subject: [PATCH 5/7] API tests added: -using Rest assured -using Retrofit --- api-tests-module/pom.xml | 36 +++++++++++ .../java/ApiData/ApiDataPreconditions.java | 20 ++++++ .../main/java/retrofits/APITestService.java | 23 +++++++ .../src/main/java/retrofits/City.java | 21 +++++++ .../java/apitests/RestAssuredApiTest.java | 37 +++++++++++ .../test/java/apitests/RetrofitApiTest.java | 63 +++++++++++++++++++ pom.xml | 15 +++-- 7 files changed, 207 insertions(+), 8 deletions(-) create mode 100644 api-tests-module/pom.xml create mode 100644 api-tests-module/src/main/java/ApiData/ApiDataPreconditions.java create mode 100644 api-tests-module/src/main/java/retrofits/APITestService.java create mode 100644 api-tests-module/src/main/java/retrofits/City.java create mode 100644 api-tests-module/src/test/java/apitests/RestAssuredApiTest.java create mode 100644 api-tests-module/src/test/java/apitests/RetrofitApiTest.java diff --git a/api-tests-module/pom.xml b/api-tests-module/pom.xml new file mode 100644 index 0000000..42ebf8e --- /dev/null +++ b/api-tests-module/pom.xml @@ -0,0 +1,36 @@ + + + + school-2016 + ru.qatools.school + 1.0-SNAPSHOT + + 4.0.0 + + api-tests-module + jar + + API Tests Module + + + + ru.qatools.school + commons-module + ${project.version} + + + com.squareup.retrofit2 + retrofit + 2.0.2 + + + com.squareup.retrofit2 + converter-gson + 2.0.2 + + + + + \ No newline at end of file diff --git a/api-tests-module/src/main/java/ApiData/ApiDataPreconditions.java b/api-tests-module/src/main/java/ApiData/ApiDataPreconditions.java new file mode 100644 index 0000000..d2d4cda --- /dev/null +++ b/api-tests-module/src/main/java/ApiData/ApiDataPreconditions.java @@ -0,0 +1,20 @@ +package ApiData; + +/** + * @author arrumm (Roman Arkhipov) on 29.04.2016. + */ +public class ApiDataPreconditions { + + public static final String BASE_URL = "http://weather.lanwen.ru"; + + public static final String BASE_PATH = "api"; + + public static final String SUGGEST_METHOD = "suggest"; + + public static final String CITIES_METHOD = "cities"; + + public static final String QUERY_PARAM = "query"; + + public static final String LIMIT_PARAM = "limit"; + +} diff --git a/api-tests-module/src/main/java/retrofits/APITestService.java b/api-tests-module/src/main/java/retrofits/APITestService.java new file mode 100644 index 0000000..12efb19 --- /dev/null +++ b/api-tests-module/src/main/java/retrofits/APITestService.java @@ -0,0 +1,23 @@ +package retrofits; + +import retrofit2.Call; +import retrofit2.http.GET; +import retrofit2.http.Query; + +import java.util.List; + +import static ApiData.ApiDataPreconditions.*; + +/** + * @author arrumm (Roman Arkhipov) on 29.04.2016. + */ + +public interface APITestService { + + @GET("/" + BASE_PATH + "/" + SUGGEST_METHOD) + Call> suggest(@Query(QUERY_PARAM) String city); + + @GET("/" + BASE_PATH + "/" + CITIES_METHOD) + Call> cities(@Query(LIMIT_PARAM) String limit); + +} diff --git a/api-tests-module/src/main/java/retrofits/City.java b/api-tests-module/src/main/java/retrofits/City.java new file mode 100644 index 0000000..b99347c --- /dev/null +++ b/api-tests-module/src/main/java/retrofits/City.java @@ -0,0 +1,21 @@ +package retrofits; + +/** + * @author arrumm (Roman Arkhipov) on 28.04.2016. + */ +public class City { + + private int uid; + + private String name; + + public String getName() { + return name; + } + + public int getUid() { + return uid; + } + + +} diff --git a/api-tests-module/src/test/java/apitests/RestAssuredApiTest.java b/api-tests-module/src/test/java/apitests/RestAssuredApiTest.java new file mode 100644 index 0000000..5a822e9 --- /dev/null +++ b/api-tests-module/src/test/java/apitests/RestAssuredApiTest.java @@ -0,0 +1,37 @@ +package apitests; + +import org.apache.http.HttpStatus; +import org.junit.Test; +import ru.yandex.qatools.allure.annotations.Title; + +import java.io.IOException; + +import static ApiData.ApiDataPreconditions.*; +import static com.jayway.restassured.RestAssured.given; +import static org.hamcrest.Matchers.*; + +/** + * @author arrumm (Roman Arkhipov) on 28.04.2016. + */ +public class RestAssuredApiTest { + + @Test + @Title("Should get error 400 with 'limit' parameter illegal type") + public void ShouldGetBadRequestCitiesIncorrectParType() throws IOException { + given().baseUri(BASE_URL) + .basePath(BASE_PATH).param(LIMIT_PARAM, "DD") + .get(CITIES_METHOD) + .then().assertThat().statusCode(HttpStatus.SC_BAD_REQUEST); + } + + @Test + @Title("Should get all cities with 'bu' or 'Bu'") + public void ShouldGetCitiesWithBu() throws IOException { + given().baseUri(BASE_URL) + .basePath(BASE_PATH).param(QUERY_PARAM, "bu") + .get(SUGGEST_METHOD) + .then().assertThat().statusCode(HttpStatus.SC_OK) + .and().body("name", everyItem(anyOf(containsString("bu"), containsString("Bu")))); + } + +} diff --git a/api-tests-module/src/test/java/apitests/RetrofitApiTest.java b/api-tests-module/src/test/java/apitests/RetrofitApiTest.java new file mode 100644 index 0000000..f638d8d --- /dev/null +++ b/api-tests-module/src/test/java/apitests/RetrofitApiTest.java @@ -0,0 +1,63 @@ +package apitests; + +import org.apache.http.HttpStatus; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import retrofit2.Call; +import retrofit2.Response; +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; +import retrofits.APITestService; +import retrofits.City; +import ru.yandex.qatools.allure.annotations.Title; + +import java.io.IOException; +import java.util.List; + +import static ApiData.ApiDataPreconditions.BASE_URL; +import static org.hamcrest.Matchers.*; +import static org.hamcrest.core.Is.is; +import static org.junit.Assert.assertThat; + +/** + * @author arrumm (Roman Arkhipov) on 28.04.2016. + */ +public class RetrofitApiTest { + + private APITestService service; + + @Before + public void initService() { + Retrofit retrofit = new Retrofit.Builder() + .baseUrl(BASE_URL) + .addConverterFactory(GsonConverterFactory.create()) + .build(); + service = retrofit.create(APITestService.class); + } + + @Test + @Title("Should get error 400 with 'limit' parameter illegal type") + public void ShouldGetCityWeatherData() throws IOException { + + Call> request = service.cities("DD"); + Response> response = request.execute(); + assertThat("Request status different from expected", response.code(), is(HttpStatus.SC_BAD_REQUEST)); + + } + + @Test + @Title("Should get all cities with 'bu' or 'Bu'") + public void ShouldGetCitiesWithBu() throws IOException { + + Call> request = service.suggest("bu"); + Response> response = request.execute(); + assertThat("Request status different from expected", response.code(), is(HttpStatus.SC_OK)); + assertThat("Some city don't contain 'bu'", + response.body(), + everyItem(hasProperty("name", anyOf(containsString("bu"), containsString("Bu"))))); + + } + + +} diff --git a/pom.xml b/pom.xml index a32202a..53b53f6 100644 --- a/pom.xml +++ b/pom.xml @@ -15,6 +15,7 @@ steps-module commons-module + api-tests-module @@ -36,21 +37,19 @@ - com.jayway.restassured rest-assured 2.9.0 - ru.yandex.qatools.allure allure-junit-adaptor ${allure.version} - org.seleniumhq.selenium + org.seleniumhq.selenium selenium-java ${selenium.version} @@ -64,16 +63,16 @@ commons-lang3 3.4 - - org.hamcrest - hamcrest-all - 1.3 - ru.yandex.qatools.htmlelements htmlelements-matchers 1.12 + + org.hamcrest + hamcrest-all + 1.3 + From 6774fddb9726b65f1b142e2db635462f2fc75246 Mon Sep 17 00:00:00 2001 From: arrumm Date: Mon, 2 May 2016 12:11:18 +0300 Subject: [PATCH 6/7] refactoring RestAssuredTest, add TestPalm integration --- .../src/main/java/retrofits/City.java | 4 +- .../java/apitests/RestAssuredApiTest.java | 33 ++++--- .../test/java/apitests/RetrofitApiTest.java | 11 ++- .../qatools/school/tp/ConnectedToTPTest.java | 6 +- .../school/webtests/WeatherWebTest.java | 88 +++++++++++++++++-- pom.xml | 6 ++ .../ru/qatools/school/pages/MainPage.java | 19 +++- .../school/pages/blocks/WeatherWidget.java | 6 +- .../pages/blocks/widgetblocks/WidgetText.java | 8 ++ .../blocks/widgetblocks/WidgetTitle.java | 13 +++ .../qatools/school/rules/WebDriverRule.java | 8 ++ .../school/steps/websteps/DefaultSteps.java | 60 +++++++++++-- 12 files changed, 225 insertions(+), 37 deletions(-) diff --git a/api-tests-module/src/main/java/retrofits/City.java b/api-tests-module/src/main/java/retrofits/City.java index b99347c..81d6628 100644 --- a/api-tests-module/src/main/java/retrofits/City.java +++ b/api-tests-module/src/main/java/retrofits/City.java @@ -5,9 +5,9 @@ */ public class City { - private int uid; + public int uid; - private String name; + public String name; public String getName() { return name; diff --git a/api-tests-module/src/test/java/apitests/RestAssuredApiTest.java b/api-tests-module/src/test/java/apitests/RestAssuredApiTest.java index 5a822e9..816c2e6 100644 --- a/api-tests-module/src/test/java/apitests/RestAssuredApiTest.java +++ b/api-tests-module/src/test/java/apitests/RestAssuredApiTest.java @@ -1,13 +1,15 @@ package 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 java.io.IOException; import static ApiData.ApiDataPreconditions.*; -import static com.jayway.restassured.RestAssured.given; import static org.hamcrest.Matchers.*; /** @@ -15,23 +17,32 @@ */ public class RestAssuredApiTest { + private RequestSpecification requestSpecs; + + @Before + public void initService() { + RestAssured RA = new RestAssured(); + requestSpecs = RA.given(); + requestSpecs.baseUri(BASE_URL); + requestSpecs.basePath(BASE_PATH); + } + @Test @Title("Should get error 400 with 'limit' parameter illegal type") public void ShouldGetBadRequestCitiesIncorrectParType() throws IOException { - given().baseUri(BASE_URL) - .basePath(BASE_PATH).param(LIMIT_PARAM, "DD") - .get(CITIES_METHOD) - .then().assertThat().statusCode(HttpStatus.SC_BAD_REQUEST); + requestSpecs.param(LIMIT_PARAM, "DD") + .expect().statusCode(HttpStatus.SC_BAD_REQUEST) + .when().get(CITIES_METHOD); } @Test @Title("Should get all cities with 'bu' or 'Bu'") public void ShouldGetCitiesWithBu() throws IOException { - given().baseUri(BASE_URL) - .basePath(BASE_PATH).param(QUERY_PARAM, "bu") - .get(SUGGEST_METHOD) - .then().assertThat().statusCode(HttpStatus.SC_OK) - .and().body("name", everyItem(anyOf(containsString("bu"), containsString("Bu")))); + requestSpecs.param(QUERY_PARAM, "bu") + .expect() + .statusCode(HttpStatus.SC_OK) + .and().body("name", everyItem(anyOf(containsString("bu"), containsString("Bu")))) + .when().get(SUGGEST_METHOD); } -} +} \ No newline at end of file diff --git a/api-tests-module/src/test/java/apitests/RetrofitApiTest.java b/api-tests-module/src/test/java/apitests/RetrofitApiTest.java index f638d8d..fb033b9 100644 --- a/api-tests-module/src/test/java/apitests/RetrofitApiTest.java +++ b/api-tests-module/src/test/java/apitests/RetrofitApiTest.java @@ -10,6 +10,8 @@ import retrofit2.converter.gson.GsonConverterFactory; import retrofits.APITestService; import retrofits.City; +import ru.qatools.school.tp.TPInformerRule; +import ru.yandex.qatools.allure.annotations.TestCaseId; import ru.yandex.qatools.allure.annotations.Title; import java.io.IOException; @@ -27,6 +29,9 @@ public class RetrofitApiTest { private APITestService service; + @Rule + public TPInformerRule tms = new TPInformerRule("arrumm"); + @Before public void initService() { Retrofit retrofit = new Retrofit.Builder() @@ -37,8 +42,9 @@ public void initService() { } @Test - @Title("Should get error 400 with 'limit' parameter illegal type") - public void ShouldGetCityWeatherData() throws IOException { + @Title("Should get error 400 with 'limit' parameter String type") + @TestCaseId("14") + public void ShouldGetErrorLimitIsString() throws IOException { Call> request = service.cities("DD"); Response> response = request.execute(); @@ -48,6 +54,7 @@ public void ShouldGetCityWeatherData() throws IOException { @Test @Title("Should get all cities with 'bu' or 'Bu'") + @TestCaseId("15") public void ShouldGetCitiesWithBu() throws IOException { Call> request = service.suggest("bu"); 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 index cc66bbe..62ddb1c 100644 --- a/commons-module/src/test/java/ru/qatools/school/tp/ConnectedToTPTest.java +++ b/commons-module/src/test/java/ru/qatools/school/tp/ConnectedToTPTest.java @@ -1,5 +1,6 @@ package ru.qatools.school.tp; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import ru.yandex.qatools.allure.annotations.TestCaseId; @@ -18,13 +19,14 @@ public class ConnectedToTPTest { public TPInformerRule tms = new TPInformerRule("ruletest"); + @Ignore @Test @TestCaseId("1") public void shouldMarkCaseStatusAsPassed() throws IOException, InterruptedException { SECONDS.sleep(15); } - + @Ignore @Test @TestCaseId("2") public void shouldFail() throws IOException, InterruptedException { @@ -32,6 +34,7 @@ public void shouldFail() throws IOException, InterruptedException { fail(); } + @Ignore @Test @TestCaseId("3") public void shouldBroke() throws IOException, InterruptedException { @@ -39,6 +42,7 @@ public void shouldBroke() throws IOException, InterruptedException { throw new RuntimeException(); } + @Ignore @Test @TestCaseId("4") public void shouldBeSkipped() throws IOException, InterruptedException { 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..745c3c2 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,36 +1,114 @@ package ru.qatools.school.webtests; +/* @author arrumm (Arkhipov Roman) */ + import org.junit.Before; import org.junit.Rule; import org.junit.Test; +import org.openqa.selenium.Keys; import ru.qatools.school.pages.MainPage; import ru.qatools.school.rules.WebDriverRule; import ru.qatools.school.steps.websteps.DefaultSteps; +import ru.qatools.school.tp.TPInformerRule; +import ru.yandex.qatools.allure.annotations.TestCaseId; import ru.yandex.qatools.allure.annotations.Title; public class WeatherWebTest { - public static final String MOSCOW = "Moscow"; + private static final String CITY = "Tomsk"; private DefaultSteps defaultSteps; @Rule public WebDriverRule webDriverRule = new WebDriverRule(); + @Rule + public TPInformerRule tms = new TPInformerRule("arrumm"); + @Before public void initSteps() { defaultSteps = new DefaultSteps(webDriverRule.getDriver()); } @Test - @Title("Должны видеть виджет на главной странице") + @Title("Should see add widget button on the main page (URL without params)") + @TestCaseId("6") + public void shouldSeeAddWidgetButtonOnMainPageWithoutParams() { + defaultSteps.openMainPageWithoutParams(); + defaultSteps.shouldSeeElement(onMainPage().getNewCardButton()); + } + + @Test + @Title("Should see widget on the main page") + @TestCaseId("7") public void shouldSeeWidgetOnMainPage() { - defaultSteps.openMainPageWithCity(MOSCOW); - defaultSteps.shouldSee(onMainPage().getWeatherWidget().get(0)); + defaultSteps.openMainPageWithCity(CITY); + defaultSteps.shouldSeeElement(onMainPage().getFirstWidget()); } + @Test + @Title("Should see picture on widget shows weather") + @TestCaseId("11") + public void shouldSeeWeatherPict() { + defaultSteps.openMainPageWithCity(CITY); + defaultSteps.shouldSeeElement(onMainPage().getFirstWidget().getWidgetText().getWeatherImage()); + } + + @Test + @Title("City name at widget title match city in URL") + @TestCaseId("1") + public void shouldSeeWidgetWithCityInURLOnMainPage() { + defaultSteps.openMainPageWithCity(CITY); + defaultSteps.shouldSeeTextInElement( + onMainPage().getFirstWidget().getWidgetTitle().getCityNameElement(), + CITY); + } + + @Test + @Title("Should see once more widget on the main page after adding") + @TestCaseId("8") + public void shouldDetectOnceMoreWidgetOnThePage() { + defaultSteps.openMainPageWithCity(CITY); + int widgetsQ = onMainPage().getWeatherWidgetList().size(); + defaultSteps.clickOn(onMainPage().getNewCardButton()); + defaultSteps.shouldBeWidgetsQuantity(onMainPage().getWeatherWidgetList(), widgetsQ + 1); + defaultSteps.shouldSeeAllElementFromList(onMainPage().getWeatherWidgetList()); + } + + @Test + @Title("Should see widget title") + @TestCaseId("12") + public void shouldSeeWidgetTitle() { + defaultSteps.openMainPageWithCity(CITY); + defaultSteps.shouldSeeElement(onMainPage().getFirstWidget().getWidgetTitle()); + } + + @Test + @Title("Should see temperature on the widget") + @TestCaseId("10") + public void shouldSeeTemperatureOnWidget() { + defaultSteps.openMainPageWithCity(CITY); + defaultSteps.shouldSeeElement(onMainPage().getFirstWidget().getWidgetText().getTemperature()); + } + + @Test + @Title("Should see city in the widget entered by keyboard") + @TestCaseId("9") + public void shouldSeeCityInputFromKeyboard() { + defaultSteps.openMainPageWithCity(null); + defaultSteps.clickOn(onMainPage().getNewCardButton()); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getCityNameElement()); + defaultSteps.clearIt(onMainPage().getFirstWidget().getWidgetTitle().getCityNameElement()); + defaultSteps.sendKeysToElement(onMainPage().getFirstWidget().getWidgetTitle().getCityNameElement(), CITY); + defaultSteps.sendKeysToElement(onMainPage().getFirstWidget().getWidgetTitle().getCityNameElement(), Keys.ENTER); + defaultSteps.shouldSeeTextInElement( + onMainPage().getFirstWidget().getWidgetTitle().getCityNameElement(), + CITY); + } + + private MainPage onMainPage() { return new MainPage(webDriverRule.getDriver()); } -} +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index 53b53f6..5f8610d 100644 --- a/pom.xml +++ b/pom.xml @@ -4,6 +4,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 + ru.qatools.school school-2016 1.0-SNAPSHOT @@ -25,6 +26,9 @@ 2.53.0 1.15 1.8.5 + + UTF-8 + @@ -96,6 +100,8 @@ -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar" + -Xmx2048m + -Xss4m listener 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..a1709bf 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; @@ -21,10 +22,22 @@ public MainPage(WebDriver driver) { @Name("Список виджетов") @FindBy(css = ".card.card_md") - private List weatherWidget; + private List weatherWidgetList; - public List getWeatherWidget() { - return weatherWidget; + @Name("Кнопка добавления виджета на страницу") + @FindBy(css = ".new-card") + private WebElement newCardButton; + + public List getWeatherWidgetList() { + return weatherWidgetList; + } + + public WebElement getNewCardButton() { + return newCardButton; + } + + public WeatherWidget getFirstWidget() { + return getWeatherWidgetList().get(0); } } 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..0fd5f8a 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 @@ -6,6 +6,7 @@ import ru.qatools.school.pages.blocks.widgetblocks.WidgetText; import ru.qatools.school.pages.blocks.widgetblocks.WidgetTitle; import ru.yandex.qatools.htmlelements.annotations.Name; +import ru.yandex.qatools.htmlelements.element.Button; import ru.yandex.qatools.htmlelements.element.HtmlElement; /** @@ -33,11 +34,8 @@ public WidgetTitle getWidgetTitle() { return widgetTitle; } - public WebElement getActions() { - return actions; - } - public Rectangle getRect() { return null; } + } diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetText.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetText.java index 510d070..a00b4d9 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 @@ -15,6 +15,14 @@ public class WidgetText extends HtmlElement { @FindBy(css = ".weather-image") private WebElement weatherImage; + @Name("Значение температуры") + @FindBy(css = ".weather-temperature__digit") + private WebElement temperature; + + public WebElement getTemperature() { + return temperature; + } + public WebElement getWeatherImage() { return weatherImage; } 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..88253f4 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 @@ -2,12 +2,25 @@ import org.openqa.selenium.Rectangle; import ru.yandex.qatools.htmlelements.element.HtmlElement; +import org.openqa.selenium.support.FindBy; +import ru.yandex.qatools.htmlelements.annotations.Name; +import ru.yandex.qatools.htmlelements.element.HtmlElement; /** * Created by kurau. + * added by arrumm (Arkhipov Roman) */ public class WidgetTitle extends HtmlElement { + @Name("Название города в заголовке") + @FindBy(css = ".inplace") + private WidgetTitle cityNameElement; + + + public HtmlElement getCityNameElement() { + return cityNameElement; + } + public Rectangle getRect() { return null; } diff --git a/steps-module/src/main/java/ru/qatools/school/rules/WebDriverRule.java b/steps-module/src/main/java/ru/qatools/school/rules/WebDriverRule.java index 418c363..1573eef 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 @@ -2,16 +2,24 @@ import org.junit.rules.ExternalResource; import org.openqa.selenium.WebDriver; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.firefox.FirefoxBinary; import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.firefox.FirefoxProfile; + +import java.io.File; /** * Created by kurau. + * added by arrumm (Arkhipov Roman) */ public class WebDriverRule extends ExternalResource { private WebDriver driver; protected void before() throws Throwable { + + System.setProperty("webdriver.firefox.bin", "D:\\my Programs\\firefox\\firefox.exe"); this.driver = new FirefoxDriver(); } 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..97c99df 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,19 +2,28 @@ import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; -import ru.qatools.school.pages.MainPage; +import ru.qatools.school.pages.blocks.WeatherWidget; import ru.yandex.qatools.allure.annotations.Step; +import java.util.List; + import static java.lang.String.format; +import static org.hamcrest.Matchers.both; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.core.Every.everyItem; import static org.junit.Assert.assertThat; -import static ru.yandex.qatools.htmlelements.matchers.WebElementMatchers.isDisplayed; +import static ru.yandex.qatools.htmlelements.matchers.WebElementMatchers.*; /** * Created by kurau. + * + * @author arrumm (Arkhipov Roman) */ 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 static final String MAIN_PAGE_WITHOUTPARAMETERS = "http://weather.lanwen.ru/"; private WebDriver driver; @@ -22,17 +31,50 @@ public DefaultSteps(WebDriver driver) { this.driver = driver; } - @Step("Открываем главную страницу для города «{0}»") + @Step("Open main page with city «{0}»") public void openMainPageWithCity(String city) { driver.get(format(MAIN_PAGE, city)); } - @Step("Должны видеть на странице «{0}»") - public void shouldSee(WebElement element) { - assertThat("Должны видеть элемент", element, isDisplayed()); + @Step("Open main page without parameters") + public void openMainPageWithoutParams() { + driver.get(MAIN_PAGE_WITHOUTPARAMETERS); + } + + @Step("Should see on the page «{0}»") + public void shouldSeeElement(WebElement element) { + assertThat("Don't see element", element, both(exists()).and(isDisplayed())); + } + + @Step("Should see all list elements on the page «{0}»") + public void shouldSeeAllElementFromList(List wwList) { + assertThat("Don't see all elements", (List)wwList, everyItem(both(exists()).and(isDisplayed()))); + } + + @Step("Text «{0}» should be «{1}»") + public void shouldSeeTextInElement(WebElement webElement, String text) { + assertThat("Expected and actual texts don't match", webElement, hasText(text)); } - private MainPage onMainPage() { - return new MainPage(driver); + @Step("Clicking element «{0}»") + public void clickOn(WebElement element) { + element.click(); } + + @Step("Number of widgets on the page should be «{0}»") + public void shouldBeWidgetsQuantity(List wwList, int widgetsQuantity) { + assertThat("Number of widgets on the page and expected don't match", wwList, hasSize(widgetsQuantity)); + } + + @Step("Clear element «{0}»") + public void clearIt(WebElement element) { + element.clear(); + } + + @Step("Send keys to element «{0}»") + public void sendKeysToElement(WebElement element, CharSequence ... keys) { + element.sendKeys(keys); + } + + } From e2eee428352f21ad051a182d79e8f2279ddba762 Mon Sep 17 00:00:00 2001 From: arrumm Date: Sun, 8 May 2016 14:20:49 +0300 Subject: [PATCH 7/7] changes due to comments --- api-tests-module/pom.xml | 36 ---------- .../java/ApiData/ApiDataPreconditions.java | 20 ------ .../main/java/retrofits/APITestService.java | 23 ------ .../src/main/java/retrofits/City.java | 21 ------ .../java/apitests/RestAssuredApiTest.java | 48 ------------- .../test/java/apitests/RetrofitApiTest.java | 70 ------------------- .../school/webtests/WeatherWebTest.java | 43 ++++++------ pom.xml | 18 +++-- .../ru/qatools/school/pages/MainPage.java | 16 ++--- .../ru/qatools/school/steps/UserSteps.java | 33 --------- .../school/steps/websteps/DefaultSteps.java | 43 ++++++------ 11 files changed, 62 insertions(+), 309 deletions(-) delete mode 100644 api-tests-module/pom.xml delete mode 100644 api-tests-module/src/main/java/ApiData/ApiDataPreconditions.java delete mode 100644 api-tests-module/src/main/java/retrofits/APITestService.java delete mode 100644 api-tests-module/src/main/java/retrofits/City.java delete mode 100644 api-tests-module/src/test/java/apitests/RestAssuredApiTest.java delete mode 100644 api-tests-module/src/test/java/apitests/RetrofitApiTest.java delete mode 100644 steps-module/src/main/java/ru/qatools/school/steps/UserSteps.java diff --git a/api-tests-module/pom.xml b/api-tests-module/pom.xml deleted file mode 100644 index 42ebf8e..0000000 --- a/api-tests-module/pom.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - school-2016 - ru.qatools.school - 1.0-SNAPSHOT - - 4.0.0 - - api-tests-module - jar - - API Tests Module - - - - ru.qatools.school - commons-module - ${project.version} - - - com.squareup.retrofit2 - retrofit - 2.0.2 - - - com.squareup.retrofit2 - converter-gson - 2.0.2 - - - - - \ No newline at end of file diff --git a/api-tests-module/src/main/java/ApiData/ApiDataPreconditions.java b/api-tests-module/src/main/java/ApiData/ApiDataPreconditions.java deleted file mode 100644 index d2d4cda..0000000 --- a/api-tests-module/src/main/java/ApiData/ApiDataPreconditions.java +++ /dev/null @@ -1,20 +0,0 @@ -package ApiData; - -/** - * @author arrumm (Roman Arkhipov) on 29.04.2016. - */ -public class ApiDataPreconditions { - - public static final String BASE_URL = "http://weather.lanwen.ru"; - - public static final String BASE_PATH = "api"; - - public static final String SUGGEST_METHOD = "suggest"; - - public static final String CITIES_METHOD = "cities"; - - public static final String QUERY_PARAM = "query"; - - public static final String LIMIT_PARAM = "limit"; - -} diff --git a/api-tests-module/src/main/java/retrofits/APITestService.java b/api-tests-module/src/main/java/retrofits/APITestService.java deleted file mode 100644 index 12efb19..0000000 --- a/api-tests-module/src/main/java/retrofits/APITestService.java +++ /dev/null @@ -1,23 +0,0 @@ -package retrofits; - -import retrofit2.Call; -import retrofit2.http.GET; -import retrofit2.http.Query; - -import java.util.List; - -import static ApiData.ApiDataPreconditions.*; - -/** - * @author arrumm (Roman Arkhipov) on 29.04.2016. - */ - -public interface APITestService { - - @GET("/" + BASE_PATH + "/" + SUGGEST_METHOD) - Call> suggest(@Query(QUERY_PARAM) String city); - - @GET("/" + BASE_PATH + "/" + CITIES_METHOD) - Call> cities(@Query(LIMIT_PARAM) String limit); - -} diff --git a/api-tests-module/src/main/java/retrofits/City.java b/api-tests-module/src/main/java/retrofits/City.java deleted file mode 100644 index 81d6628..0000000 --- a/api-tests-module/src/main/java/retrofits/City.java +++ /dev/null @@ -1,21 +0,0 @@ -package retrofits; - -/** - * @author arrumm (Roman Arkhipov) on 28.04.2016. - */ -public class City { - - public int uid; - - public String name; - - public String getName() { - return name; - } - - public int getUid() { - return uid; - } - - -} diff --git a/api-tests-module/src/test/java/apitests/RestAssuredApiTest.java b/api-tests-module/src/test/java/apitests/RestAssuredApiTest.java deleted file mode 100644 index 816c2e6..0000000 --- a/api-tests-module/src/test/java/apitests/RestAssuredApiTest.java +++ /dev/null @@ -1,48 +0,0 @@ -package 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 java.io.IOException; - -import static ApiData.ApiDataPreconditions.*; -import static org.hamcrest.Matchers.*; - -/** - * @author arrumm (Roman Arkhipov) on 28.04.2016. - */ -public class RestAssuredApiTest { - - private RequestSpecification requestSpecs; - - @Before - public void initService() { - RestAssured RA = new RestAssured(); - requestSpecs = RA.given(); - requestSpecs.baseUri(BASE_URL); - requestSpecs.basePath(BASE_PATH); - } - - @Test - @Title("Should get error 400 with 'limit' parameter illegal type") - public void ShouldGetBadRequestCitiesIncorrectParType() throws IOException { - requestSpecs.param(LIMIT_PARAM, "DD") - .expect().statusCode(HttpStatus.SC_BAD_REQUEST) - .when().get(CITIES_METHOD); - } - - @Test - @Title("Should get all cities with 'bu' or 'Bu'") - public void ShouldGetCitiesWithBu() throws IOException { - requestSpecs.param(QUERY_PARAM, "bu") - .expect() - .statusCode(HttpStatus.SC_OK) - .and().body("name", everyItem(anyOf(containsString("bu"), containsString("Bu")))) - .when().get(SUGGEST_METHOD); - } - -} \ No newline at end of file diff --git a/api-tests-module/src/test/java/apitests/RetrofitApiTest.java b/api-tests-module/src/test/java/apitests/RetrofitApiTest.java deleted file mode 100644 index fb033b9..0000000 --- a/api-tests-module/src/test/java/apitests/RetrofitApiTest.java +++ /dev/null @@ -1,70 +0,0 @@ -package apitests; - -import org.apache.http.HttpStatus; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import retrofit2.Call; -import retrofit2.Response; -import retrofit2.Retrofit; -import retrofit2.converter.gson.GsonConverterFactory; -import retrofits.APITestService; -import retrofits.City; -import ru.qatools.school.tp.TPInformerRule; -import ru.yandex.qatools.allure.annotations.TestCaseId; -import ru.yandex.qatools.allure.annotations.Title; - -import java.io.IOException; -import java.util.List; - -import static ApiData.ApiDataPreconditions.BASE_URL; -import static org.hamcrest.Matchers.*; -import static org.hamcrest.core.Is.is; -import static org.junit.Assert.assertThat; - -/** - * @author arrumm (Roman Arkhipov) on 28.04.2016. - */ -public class RetrofitApiTest { - - private APITestService service; - - @Rule - public TPInformerRule tms = new TPInformerRule("arrumm"); - - @Before - public void initService() { - Retrofit retrofit = new Retrofit.Builder() - .baseUrl(BASE_URL) - .addConverterFactory(GsonConverterFactory.create()) - .build(); - service = retrofit.create(APITestService.class); - } - - @Test - @Title("Should get error 400 with 'limit' parameter String type") - @TestCaseId("14") - public void ShouldGetErrorLimitIsString() throws IOException { - - Call> request = service.cities("DD"); - Response> response = request.execute(); - assertThat("Request status different from expected", response.code(), is(HttpStatus.SC_BAD_REQUEST)); - - } - - @Test - @Title("Should get all cities with 'bu' or 'Bu'") - @TestCaseId("15") - public void ShouldGetCitiesWithBu() throws IOException { - - Call> request = service.suggest("bu"); - Response> response = request.execute(); - assertThat("Request status different from expected", response.code(), is(HttpStatus.SC_OK)); - assertThat("Some city don't contain 'bu'", - response.body(), - everyItem(hasProperty("name", anyOf(containsString("bu"), containsString("Bu"))))); - - } - - -} 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 745c3c2..b3ae94a 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 @@ -3,6 +3,7 @@ /* @author arrumm (Arkhipov Roman) */ import org.junit.Before; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.openqa.selenium.Keys; @@ -30,34 +31,36 @@ public void initSteps() { defaultSteps = new DefaultSteps(webDriverRule.getDriver()); } + @Test @Title("Should see add widget button on the main page (URL without params)") @TestCaseId("6") public void shouldSeeAddWidgetButtonOnMainPageWithoutParams() { defaultSteps.openMainPageWithoutParams(); - defaultSteps.shouldSeeElement(onMainPage().getNewCardButton()); + defaultSteps.shouldSee(onMainPage().newCardButton()); } @Test @Title("Should see widget on the main page") @TestCaseId("7") public void shouldSeeWidgetOnMainPage() { - defaultSteps.openMainPageWithCity(CITY); - defaultSteps.shouldSeeElement(onMainPage().getFirstWidget()); + defaultSteps.openMainPageWithCity(null); + defaultSteps.shouldSee(onMainPage().getFirstWidget()); } @Test @Title("Should see picture on widget shows weather") @TestCaseId("11") - public void shouldSeeWeatherPict() { + public void shouldSeeWeatherPicture() { defaultSteps.openMainPageWithCity(CITY); - defaultSteps.shouldSeeElement(onMainPage().getFirstWidget().getWidgetText().getWeatherImage()); + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getWeatherImage()); } + @Test - @Title("City name at widget title match city in URL") + @Title("City name at widget title should match URL") @TestCaseId("1") - public void shouldSeeWidgetWithCityInURLOnMainPage() { + public void shouldSeeWidgetWithCityInURL() { defaultSteps.openMainPageWithCity(CITY); defaultSteps.shouldSeeTextInElement( onMainPage().getFirstWidget().getWidgetTitle().getCityNameElement(), @@ -65,22 +68,23 @@ public void shouldSeeWidgetWithCityInURLOnMainPage() { } @Test - @Title("Should see once more widget on the main page after adding") + @Title("Should see one more widget on the main page after adding") @TestCaseId("8") - public void shouldDetectOnceMoreWidgetOnThePage() { + public void shouldDetectOnceMoreWidget() { defaultSteps.openMainPageWithCity(CITY); - int widgetsQ = onMainPage().getWeatherWidgetList().size(); - defaultSteps.clickOn(onMainPage().getNewCardButton()); - defaultSteps.shouldBeWidgetsQuantity(onMainPage().getWeatherWidgetList(), widgetsQ + 1); - defaultSteps.shouldSeeAllElementFromList(onMainPage().getWeatherWidgetList()); + int widgetsQ = onMainPage().widgets().size(); + defaultSteps.clickOn(onMainPage().newCardButton()); + defaultSteps.shouldBeWidgetsQuantityOnPage(onMainPage().widgets(), widgetsQ + 1); + defaultSteps.shouldSeeAllFrom(onMainPage().widgets()); } + //@Ignore @Test @Title("Should see widget title") @TestCaseId("12") public void shouldSeeWidgetTitle() { defaultSteps.openMainPageWithCity(CITY); - defaultSteps.shouldSeeElement(onMainPage().getFirstWidget().getWidgetTitle()); + defaultSteps.shouldSee(onMainPage().getFirstWidget()); } @Test @@ -88,25 +92,24 @@ public void shouldSeeWidgetTitle() { @TestCaseId("10") public void shouldSeeTemperatureOnWidget() { defaultSteps.openMainPageWithCity(CITY); - defaultSteps.shouldSeeElement(onMainPage().getFirstWidget().getWidgetText().getTemperature()); + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getTemperature()); } @Test - @Title("Should see city in the widget entered by keyboard") + @Title("Should see same city in the title entered by keyboard") @TestCaseId("9") public void shouldSeeCityInputFromKeyboard() { defaultSteps.openMainPageWithCity(null); - defaultSteps.clickOn(onMainPage().getNewCardButton()); + defaultSteps.clickOn(onMainPage().newCardButton()); defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getCityNameElement()); defaultSteps.clearIt(onMainPage().getFirstWidget().getWidgetTitle().getCityNameElement()); - defaultSteps.sendKeysToElement(onMainPage().getFirstWidget().getWidgetTitle().getCityNameElement(), CITY); - defaultSteps.sendKeysToElement(onMainPage().getFirstWidget().getWidgetTitle().getCityNameElement(), Keys.ENTER); + defaultSteps.sendKeysTo(onMainPage().getFirstWidget().getWidgetTitle().getCityNameElement(), CITY); + defaultSteps.sendKeysTo(onMainPage().getFirstWidget().getWidgetTitle().getCityNameElement(), Keys.ENTER); defaultSteps.shouldSeeTextInElement( onMainPage().getFirstWidget().getWidgetTitle().getCityNameElement(), CITY); } - private MainPage onMainPage() { return new MainPage(webDriverRule.getDriver()); } diff --git a/pom.xml b/pom.xml index 5f8610d..95a9647 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,6 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - ru.qatools.school school-2016 1.0-SNAPSHOT @@ -16,7 +15,6 @@ steps-module commons-module - api-tests-module @@ -41,19 +39,21 @@ + com.jayway.restassured rest-assured 2.9.0 + ru.yandex.qatools.allure allure-junit-adaptor ${allure.version} - org.seleniumhq.selenium + org.seleniumhq.selenium selenium-java ${selenium.version} @@ -67,16 +67,16 @@ commons-lang3 3.4 - - ru.yandex.qatools.htmlelements - htmlelements-matchers - 1.12 - org.hamcrest hamcrest-all 1.3 + + ru.yandex.qatools.htmlelements + htmlelements-matchers + 1.12 + @@ -100,8 +100,6 @@ -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar" - -Xmx2048m - -Xss4m listener 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 a1709bf..16521e3 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,6 +13,7 @@ /** * Created by kurau. + * edited by arrumm. */ public class MainPage { @@ -22,22 +23,21 @@ public MainPage(WebDriver driver) { @Name("Список виджетов") @FindBy(css = ".card.card_md") - private List weatherWidgetList; + private List widgets; @Name("Кнопка добавления виджета на страницу") @FindBy(css = ".new-card") private WebElement newCardButton; - public List getWeatherWidgetList() { - return weatherWidgetList; - } - - public WebElement getNewCardButton() { - return newCardButton; + public List widgets() { + return widgets; } public WeatherWidget getFirstWidget() { - return getWeatherWidgetList().get(0); + return widgets().get(0); } + public WebElement newCardButton() { + return newCardButton; + } } diff --git a/steps-module/src/main/java/ru/qatools/school/steps/UserSteps.java b/steps-module/src/main/java/ru/qatools/school/steps/UserSteps.java deleted file mode 100644 index f22648c..0000000 --- a/steps-module/src/main/java/ru/qatools/school/steps/UserSteps.java +++ /dev/null @@ -1,33 +0,0 @@ -package ru.qatools.school.steps; - -import ru.qatools.school.data.Place; - -import static org.hamcrest.core.Is.is; -import static org.junit.Assert.assertThat; - - -/** - * @author lanwen (Merkushev Kirill) - * @author gladnik (Gladkov Nikolai) - */ -public class UserSteps { - - private Place place; - - private UserSteps() { - } - - public static UserSteps user() { - return new UserSteps(); - } - - public UserSteps goTo(Place place) { - this.place = place; - return this; - } - - public UserSteps shouldBeAtPlace(Place expectedPlace) { - assertThat("Places should match!", this.place, is(expectedPlace)); - return this; - } -} diff --git a/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java b/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java index 97c99df..3c162c2 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 ru.qatools.school.pages.MainPage; import ru.qatools.school.pages.blocks.WeatherWidget; import ru.yandex.qatools.allure.annotations.Step; @@ -31,39 +32,44 @@ public DefaultSteps(WebDriver driver) { this.driver = driver; } - @Step("Open main page with city «{0}»") + @Step("Открываем главную страницу для города «{0}»") public void openMainPageWithCity(String city) { driver.get(format(MAIN_PAGE, city)); } - @Step("Open main page without parameters") + @Step("Открываем главную страницу как обычный пользователь") public void openMainPageWithoutParams() { - driver.get(MAIN_PAGE_WITHOUTPARAMETERS); + driver.get(MAIN_PAGE_WITHOUTPARAMETERS ); } - @Step("Should see on the page «{0}»") - public void shouldSeeElement(WebElement element) { - assertThat("Don't see element", element, both(exists()).and(isDisplayed())); + @Step("Должны видеть на странице «{0}»") + public void shouldSee(WebElement element) { + assertThat("Должны видеть элемент", element, both(exists()).and(isDisplayed())); } - @Step("Should see all list elements on the page «{0}»") - public void shouldSeeAllElementFromList(List wwList) { - assertThat("Don't see all elements", (List)wwList, everyItem(both(exists()).and(isDisplayed()))); + @Step("Должны видеть на странице все элементы списка «{0}»") + public void shouldSeeAllFrom(List widgets) { + assertThat("Видим не все элементы", (List) widgets, everyItem(both(exists()).and(isDisplayed()))); } - @Step("Text «{0}» should be «{1}»") + @Step("Текст «{0}» элемента должен быть «{1}»") public void shouldSeeTextInElement(WebElement webElement, String text) { - assertThat("Expected and actual texts don't match", webElement, hasText(text)); + assertThat("Текст элемента и ожидаемый не совпадают", webElement, hasText(text)); } - @Step("Clicking element «{0}»") + @Step("Должен кликнуться элемент «{0}»") public void clickOn(WebElement element) { element.click(); } - @Step("Number of widgets on the page should be «{0}»") - public void shouldBeWidgetsQuantity(List wwList, int widgetsQuantity) { - assertThat("Number of widgets on the page and expected don't match", wwList, hasSize(widgetsQuantity)); + @Step("Количество виджетов на странице должно быть «{0}»") + public void shouldBeWidgetsQuantityOnPage(List widgets, int widgetsQuantity) { + assertThat("Количество виджетов на странице не равно ожидаемому", widgets, hasSize(widgetsQuantity)); + } + + @Step("Send keys to element «{0}»") + public void sendKeysTo(WebElement element, CharSequence ... keys) { + element.sendKeys(keys); } @Step("Clear element «{0}»") @@ -71,10 +77,7 @@ public void clearIt(WebElement element) { element.clear(); } - @Step("Send keys to element «{0}»") - public void sendKeysToElement(WebElement element, CharSequence ... keys) { - element.sendKeys(keys); + private MainPage onMainPage() { + return new MainPage(driver); } - - }