From feaef76dee7dbdb4ea763aaa9530c2d755eac01a Mon Sep 17 00:00:00 2001 From: totallynotkate Date: Thu, 19 May 2016 00:29:21 +0300 Subject: [PATCH 1/3] Add tests for mobile --- .../school/mobiletests/MobileTests.java | 47 +++++++++++++++++++ .../school/rules/MobileDriverRule.java | 32 +++++++++++++ .../ru/qatools/school/screens/MainScreen.java | 42 +++++++++++++++++ .../school/screens/SelectStationScreen.java | 36 ++++++++++++++ .../ru/qatools/school/screens/TopPanel.java | 25 ++++++++++ .../school/steps/mobilesteps/MobileSteps.java | 38 +++++++++++++++ 6 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/screens/TopPanel.java create mode 100644 steps-module/src/main/java/ru/qatools/school/steps/mobilesteps/MobileSteps.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..fdde2fa --- /dev/null +++ b/commons-module/src/test/java/ru/qatools/school/mobiletests/MobileTests.java @@ -0,0 +1,47 @@ +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.MobileSteps; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.greaterThan; +import static org.hamcrest.Matchers.is; + +/** + * @author totallynotkate (Kate Kocijevska) + */ +public class MobileTests { + + public static final String FIRST_STATION = "Arbatskaya"; + public static final String SECOND_STATION = "Borisovo"; + private MobileSteps mobileSteps; + + @Rule + public MobileDriverRule mobileDriverRule = new MobileDriverRule(); + + @Before + public void initSteps(){ + mobileSteps = new MobileSteps(mobileDriverRule.getDriver()); + } + + @Test + public void shouldSeeTime(){ + SelectStationScreen selectStationScreen = mobileSteps.goToSelectStationScreen(onMainScreen().fromField()); + mobileSteps.input(selectStationScreen.stationNameInput(), FIRST_STATION); + mobileSteps.tap(selectStationScreen.stationsList().get(0)); + selectStationScreen = mobileSteps.goToSelectStationScreen(onMainScreen().toField()); + mobileSteps.input(selectStationScreen.stationNameInput(), SECOND_STATION); + mobileSteps.tap(selectStationScreen.stationsList().get(0)); + assertThat(Integer.parseInt(onMainScreen().topPanel().rideTimeString().getText().trim().split(" ")[0]), + greaterThan(10)); + } + + private MainScreen onMainScreen(){ + return new MainScreen(mobileDriverRule.getDriver()); + } +} 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..88ac62d --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/rules/MobileDriverRule.java @@ -0,0 +1,32 @@ +package ru.qatools.school.rules; + +import org.junit.rules.ExternalResource; +import org.openqa.selenium.remote.DesiredCapabilities; +import org.openqa.selenium.remote.RemoteWebDriver; + +import java.net.MalformedURLException; +import java.net.URL; + +/** + * @author totallynotkate (Kate Kocijevska) + */ +public class MobileDriverRule extends ExternalResource { + protected RemoteWebDriver driver; + + protected void before() throws MalformedURLException { + 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 RemoteWebDriver 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..d0c7347 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/screens/MainScreen.java @@ -0,0 +1,42 @@ +package ru.qatools.school.screens; + +import org.openqa.selenium.remote.RemoteWebDriver; +import org.openqa.selenium.support.FindBy; +import org.openqa.selenium.support.PageFactory; +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; + +/** + * @author totallynotkate (Kate Kocijevska) + */ +public class MainScreen { + public MainScreen(RemoteWebDriver driver){ + PageFactory.initElements(new HtmlElementDecorator(new HtmlElementLocatorFactory(driver)), this); + } + + @Name("Поле From") + @FindBy(id = "ru.yandex.metro:id/tv_from_name") + private HtmlElement fromField; + + @Name("Поле To") + @FindBy(id = "ru.yandex.metro:id/tv_to_name") + private HtmlElement toField; + + @Name("Выезжающая панель") + @FindBy(id="ru.yandex.metro:id/topPanel") + private TopPanel topPanel; + + public HtmlElement fromField(){ + return fromField; + } + + public HtmlElement toField() { + return toField; + } + + public TopPanel topPanel() { + return topPanel; + } +} 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..bad0372 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/screens/SelectStationScreen.java @@ -0,0 +1,36 @@ +package ru.qatools.school.screens; + +import org.openqa.selenium.remote.RemoteWebDriver; +import org.openqa.selenium.support.FindBy; +import org.openqa.selenium.support.PageFactory; +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; + +import java.util.List; + +/** + * @author totallynotkate (Kate Kocijevska) + */ +public class SelectStationScreen { + public SelectStationScreen(RemoteWebDriver driver){ + PageFactory.initElements(new HtmlElementDecorator(new HtmlElementLocatorFactory(driver)), this); + } + + @Name("Поле ввода названия станции") + @FindBy(id = "ru.yandex.metro:id/filterTextId") + private HtmlElement stationNameInput; + + @Name("Список станций") + @FindBy(id="ru.yandex.metro:id/txtStationName") + private List stationsList; + + public HtmlElement stationNameInput() { + return stationNameInput; + } + + public List stationsList() { + return stationsList; + } +} diff --git a/steps-module/src/main/java/ru/qatools/school/screens/TopPanel.java b/steps-module/src/main/java/ru/qatools/school/screens/TopPanel.java new file mode 100644 index 0000000..27d5625 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/screens/TopPanel.java @@ -0,0 +1,25 @@ +package ru.qatools.school.screens; + +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; + +/** + * @author totallynotkate (Kate Kocijevska) + */ +public class TopPanel extends HtmlElement{ + + @Name("Время поездки") + @FindBy(id="ru.yandex.metro:id/tv_time") + private HtmlElement rideTimeString; + + public HtmlElement rideTimeString() { + return rideTimeString; + } + + @Override + public Rectangle getRect() { + return null; + } +} diff --git a/steps-module/src/main/java/ru/qatools/school/steps/mobilesteps/MobileSteps.java b/steps-module/src/main/java/ru/qatools/school/steps/mobilesteps/MobileSteps.java new file mode 100644 index 0000000..d67481b --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/steps/mobilesteps/MobileSteps.java @@ -0,0 +1,38 @@ +package ru.qatools.school.steps.mobilesteps; + +import org.openqa.selenium.remote.RemoteWebDriver; +import ru.qatools.school.screens.MainScreen; +import ru.qatools.school.screens.SelectStationScreen; +import ru.yandex.qatools.allure.annotations.Step; +import ru.yandex.qatools.htmlelements.element.HtmlElement; + +/** + * @author totallynotkate (Kate Kocijevska) + */ +public class MobileSteps { + private RemoteWebDriver driver; + + public MobileSteps(RemoteWebDriver driver){ + this.driver = driver; + } + + @Step("Тапаем по элементу {0}") + public void tap(HtmlElement element){ + element.click(); + } + + @Step("Переходим на страницу выбора станции с элемента {0}") + public SelectStationScreen goToSelectStationScreen(HtmlElement element){ + element.click(); + return new SelectStationScreen(driver); + } + + @Step("Вводим текст {1} в поле {0}") + public void input(HtmlElement element, String text){ + element.sendKeys(text); + } + + private MainScreen onMainScreen(){ + return new MainScreen(driver); + } +} From f59d987166912ae342963ee941012b56cc4d15e2 Mon Sep 17 00:00:00 2001 From: totallynotkate Date: Thu, 19 May 2016 00:41:36 +0300 Subject: [PATCH 2/3] Add title annotation and assert message --- .../java/ru/qatools/school/mobiletests/MobileTests.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) 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 fdde2fa..8943202 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 @@ -7,6 +7,8 @@ import ru.qatools.school.screens.MainScreen; import ru.qatools.school.screens.SelectStationScreen; import ru.qatools.school.steps.mobilesteps.MobileSteps; +import ru.yandex.qatools.allure.annotations.Title; +import ru.yandex.qatools.htmlelements.annotations.Name; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.greaterThan; @@ -30,14 +32,16 @@ public void initSteps(){ } @Test - public void shouldSeeTime(){ + @Title("Время поездки от Арбатской до Борисово должно быть больше 10 минут") + public void shouldSeeOver10MinutesTime(){ SelectStationScreen selectStationScreen = mobileSteps.goToSelectStationScreen(onMainScreen().fromField()); mobileSteps.input(selectStationScreen.stationNameInput(), FIRST_STATION); mobileSteps.tap(selectStationScreen.stationsList().get(0)); selectStationScreen = mobileSteps.goToSelectStationScreen(onMainScreen().toField()); mobileSteps.input(selectStationScreen.stationNameInput(), SECOND_STATION); mobileSteps.tap(selectStationScreen.stationsList().get(0)); - assertThat(Integer.parseInt(onMainScreen().topPanel().rideTimeString().getText().trim().split(" ")[0]), + assertThat("Неправильное время поездки", + Integer.parseInt(onMainScreen().topPanel().rideTimeString().getText().trim().split(" ")[0]), greaterThan(10)); } From 3a80a173a81f6329d12dd02c8decb9e7da75ba3c Mon Sep 17 00:00:00 2001 From: totallynotkate Date: Thu, 19 May 2016 00:47:57 +0300 Subject: [PATCH 3/3] Move assure to steps --- .../school/mobiletests/MobileTests.java | 9 ++++---- .../school/steps/mobilesteps/MobileSteps.java | 22 ++++++++++++++----- 2 files changed, 21 insertions(+), 10 deletions(-) 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 8943202..ce3c591 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 @@ -21,6 +21,7 @@ public class MobileTests { public static final String FIRST_STATION = "Arbatskaya"; public static final String SECOND_STATION = "Borisovo"; + public static final int TIME = 10; private MobileSteps mobileSteps; @Rule @@ -33,16 +34,16 @@ public void initSteps(){ @Test @Title("Время поездки от Арбатской до Борисово должно быть больше 10 минут") - public void shouldSeeOver10MinutesTime(){ + public void shouldSeeGreaterTime(){ SelectStationScreen selectStationScreen = mobileSteps.goToSelectStationScreen(onMainScreen().fromField()); mobileSteps.input(selectStationScreen.stationNameInput(), FIRST_STATION); mobileSteps.tap(selectStationScreen.stationsList().get(0)); + selectStationScreen = mobileSteps.goToSelectStationScreen(onMainScreen().toField()); mobileSteps.input(selectStationScreen.stationNameInput(), SECOND_STATION); mobileSteps.tap(selectStationScreen.stationsList().get(0)); - assertThat("Неправильное время поездки", - Integer.parseInt(onMainScreen().topPanel().rideTimeString().getText().trim().split(" ")[0]), - greaterThan(10)); + + mobileSteps.shouldSeeTimeGreaterThan(TIME); } private MainScreen onMainScreen(){ diff --git a/steps-module/src/main/java/ru/qatools/school/steps/mobilesteps/MobileSteps.java b/steps-module/src/main/java/ru/qatools/school/steps/mobilesteps/MobileSteps.java index d67481b..5e79b0f 100644 --- a/steps-module/src/main/java/ru/qatools/school/steps/mobilesteps/MobileSteps.java +++ b/steps-module/src/main/java/ru/qatools/school/steps/mobilesteps/MobileSteps.java @@ -6,33 +6,43 @@ import ru.yandex.qatools.allure.annotations.Step; import ru.yandex.qatools.htmlelements.element.HtmlElement; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.greaterThan; + /** * @author totallynotkate (Kate Kocijevska) */ public class MobileSteps { private RemoteWebDriver driver; - public MobileSteps(RemoteWebDriver driver){ + public MobileSteps(RemoteWebDriver driver) { this.driver = driver; } @Step("Тапаем по элементу {0}") - public void tap(HtmlElement element){ - element.click(); + public void tap(HtmlElement element) { + element.click(); } @Step("Переходим на страницу выбора станции с элемента {0}") - public SelectStationScreen goToSelectStationScreen(HtmlElement element){ + public SelectStationScreen goToSelectStationScreen(HtmlElement element) { element.click(); return new SelectStationScreen(driver); } @Step("Вводим текст {1} в поле {0}") - public void input(HtmlElement element, String text){ + public void input(HtmlElement element, String text) { element.sendKeys(text); } - private MainScreen onMainScreen(){ + @Step() + public void shouldSeeTimeGreaterThan(int time) { + assertThat("Неправильное время поездки", + Integer.parseInt(onMainScreen().topPanel().rideTimeString().getText().trim().split(" ")[0]), + greaterThan(time)); + } + + private MainScreen onMainScreen() { return new MainScreen(driver); } }