diff --git a/README.md b/README.md index 69e007d..e9f9400 100644 --- a/README.md +++ b/README.md @@ -1,3 +1 @@ -# Practice of automation school 2016 - -See all info in repo [autoschool/autoschool.github.io](https://github.com/autoschool/autoschool.github.io) +Ссылка на репозиторий с докер файлом: https://github.com/vananos/Docker.git diff --git a/commons-module/pom.xml b/commons-module/pom.xml new file mode 100644 index 0000000..a123fc2 --- /dev/null +++ b/commons-module/pom.xml @@ -0,0 +1,52 @@ + + + 4.0.0 + + + school-2016 + ru.qatools.school + 1.0-SNAPSHOT + + + commons-module + jar + + Commons Module + + + + ru.qatools.school + steps-module + ${project.version} + + + com.tngtech.java + junit-dataprovider + 1.10.4 + test + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + + + + + true + + + ru.yandex.qatools.allure + allure-maven-plugin + 2.5 + + + + + diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/BaseWeatherAppTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/BaseWeatherAppTest.java new file mode 100644 index 0000000..fe61f8c --- /dev/null +++ b/commons-module/src/test/java/ru/qatools/school/webtests/BaseWeatherAppTest.java @@ -0,0 +1,29 @@ +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 vananos on 4/20/16. + */ +public class BaseWeatherAppTest { + public static final String CITY = "Moscow"; + @Rule + public WebDriverRule webDriverRule = new WebDriverRule(); + @Rule + public TPInformerRule tms = new TPInformerRule("vananos"); + protected DefaultSteps defaultSteps; + + @Before + public void initSteps() { + defaultSteps = new DefaultSteps(webDriverRule.getDriver()); + } + + protected MainPage onMainPage() { + return new MainPage(webDriverRule.getDriver()); + } +} diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/pagetest/AddWidgetButtonTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/pagetest/AddWidgetButtonTest.java new file mode 100644 index 0000000..87ecbb1 --- /dev/null +++ b/commons-module/src/test/java/ru/qatools/school/webtests/pagetest/AddWidgetButtonTest.java @@ -0,0 +1,34 @@ +package ru.qatools.school.webtests.pagetest; + +import com.tngtech.java.junit.dataprovider.DataProvider; +import com.tngtech.java.junit.dataprovider.DataProviderRunner; +import com.tngtech.java.junit.dataprovider.UseDataProvider; +import org.junit.Test; +import org.junit.runner.RunWith; +import ru.qatools.school.webtests.BaseWeatherAppTest; +import ru.yandex.qatools.allure.annotations.TestCaseId; +import ru.yandex.qatools.allure.annotations.Title; + + +@RunWith(DataProviderRunner.class) +public class AddWidgetButtonTest extends BaseWeatherAppTest { + + @DataProvider + public static Object[][] dataProviderNumber() { + return new Object[][]{ + {1}, {2} + }; + } + + + @Test + @Title("Жмем на кнопку n раз, должно быть n+1 виджетов") + @UseDataProvider("dataProviderNumber") + @TestCaseId("1") + public void shouldSeeNPlusOneWidgetsAfterNClickByAddButton(int n) { + defaultSteps.openMainPageWithCity(CITY); + defaultSteps.clickNTimes(onMainPage().getNewWidgetButton(),n); + defaultSteps.widgetsAmountShouldBe(n + 1); + } + +} diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/pagetest/PageIsNotEmptyTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/pagetest/PageIsNotEmptyTest.java new file mode 100644 index 0000000..8b75371 --- /dev/null +++ b/commons-module/src/test/java/ru/qatools/school/webtests/pagetest/PageIsNotEmptyTest.java @@ -0,0 +1,25 @@ +package ru.qatools.school.webtests.pagetest; + +import org.junit.Test; +import ru.qatools.school.webtests.BaseWeatherAppTest; +import ru.yandex.qatools.allure.annotations.TestCaseId; +import ru.yandex.qatools.allure.annotations.Title; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.Is.is; +import static org.hamcrest.core.IsNot.not; + + +public class PageIsNotEmptyTest extends BaseWeatherAppTest { + + + @Test + @Title("При открытии страницы с пустым параметром cites на странице должна быть кнопка добавления виджета") + @TestCaseId("6") + public void addWidgetbuttonShouldBeOnPage() { + defaultSteps.openMainPage(); + System.out.println(onMainPage()); + assertThat(onMainPage().getNewWidgetButton(), is(not(null))); + } + +} \ No newline at end of file diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/pagetest/WeatherWebTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/pagetest/WeatherWebTest.java new file mode 100644 index 0000000..cfa5d1b --- /dev/null +++ b/commons-module/src/test/java/ru/qatools/school/webtests/pagetest/WeatherWebTest.java @@ -0,0 +1,20 @@ +package ru.qatools.school.webtests.pagetest; + +import org.junit.Test; +import ru.qatools.school.webtests.BaseWeatherAppTest; +import ru.yandex.qatools.allure.annotations.TestCaseId; +import ru.yandex.qatools.allure.annotations.Title; + + +public class WeatherWebTest extends BaseWeatherAppTest { + + + @Test + @Title("Должны видеть виджет на главной странице") + @TestCaseId("4") + public void shouldSeeWidgetOnMainPage() { + defaultSteps.openMainPageWithCity(CITY); + defaultSteps.shouldSee(onMainPage().getWeatherWidgetList().get(0)); + } + +} diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/DateTimeTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/DateTimeTest.java new file mode 100644 index 0000000..d77408a --- /dev/null +++ b/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/DateTimeTest.java @@ -0,0 +1,26 @@ +package ru.qatools.school.webtests.widgettest; + +import org.junit.Test; +import ru.qatools.school.RepresentationPatterns; +import ru.qatools.school.webtests.BaseWeatherAppTest; +import ru.yandex.qatools.allure.annotations.TestCaseId; +import ru.yandex.qatools.allure.annotations.Title; + + +/** + * Created by vananos on 4/22/16. + */ +public class DateTimeTest extends BaseWeatherAppTest { + + + @Test + @Title("Дата должна отображаться в соответствии с определенным представлением") + @TestCaseId("7") + public void dateTimeTest() { + defaultSteps.openMainPageWithCity(CITY); + defaultSteps.shouldBeRepresentedAs( + onMainPage().getWeatherWidgetList().get(0).getWidgetTitle().getDateTime().getText() + , RepresentationPatterns.DATE_TIME + ); + } +} diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/InfoFieldsTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/InfoFieldsTest.java new file mode 100644 index 0000000..a432b65 --- /dev/null +++ b/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/InfoFieldsTest.java @@ -0,0 +1,44 @@ +package ru.qatools.school.webtests.widgettest; + +import com.tngtech.java.junit.dataprovider.DataProvider; +import com.tngtech.java.junit.dataprovider.DataProviderRunner; +import com.tngtech.java.junit.dataprovider.UseDataProvider; +import org.junit.Test; +import org.junit.runner.RunWith; +import ru.qatools.school.RepresentationPatterns; +import ru.qatools.school.pages.blocks.widgetblocks.InfoLine; +import ru.qatools.school.webtests.BaseWeatherAppTest; +import ru.yandex.qatools.allure.annotations.TestCaseId; +import ru.yandex.qatools.allure.annotations.Title; +import ru.yandex.qatools.htmlelements.element.HtmlElement; + +import java.util.List; + +@RunWith(DataProviderRunner.class) +public class InfoFieldsTest extends BaseWeatherAppTest { + + @DataProvider + public static Object[][] dataProvider() { + + return new Object[][]{ + {0, RepresentationPatterns.SUNRISE}, + {1, RepresentationPatterns.SUNSET}, + {2, RepresentationPatterns.WIND}, + {3, RepresentationPatterns.HUMIDITY} + }; + } + + + @Test + @Title("Проверяем, что поля соответствуют паттернам") + @UseDataProvider("dataProvider") + @TestCaseId("8") + public void infoFieldsTest(int n, RepresentationPatterns pattern) { + defaultSteps.openMainPageWithCity(CITY); + InfoLine infoLine = onMainPage().getWeatherWidgetList().get(0).getWidgetText().getInfoLines().get(n); + defaultSteps.shouldBeRepresentedAs(infoLine.getTextRepresentation(), pattern); + defaultSteps.shouldSee(infoLine.getImage()); + + } + +} \ No newline at end of file diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/RemoveButtonTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/RemoveButtonTest.java new file mode 100644 index 0000000..0470ab5 --- /dev/null +++ b/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/RemoveButtonTest.java @@ -0,0 +1,35 @@ +package ru.qatools.school.webtests.widgettest; + +import com.tngtech.java.junit.dataprovider.DataProvider; +import com.tngtech.java.junit.dataprovider.DataProviderRunner; +import com.tngtech.java.junit.dataprovider.UseDataProvider; +import org.junit.Test; +import org.junit.runner.RunWith; +import ru.qatools.school.webtests.BaseWeatherAppTest; +import ru.yandex.qatools.allure.annotations.TestCaseId; +import ru.yandex.qatools.allure.annotations.Title; + + +@RunWith(DataProviderRunner.class) +public class RemoveButtonTest extends BaseWeatherAppTest { + + @DataProvider + public static Object[][] dataProviderNumber() { + return new Object[][]{ + {0}, {3} + }; + } + + + @Test + @Title("Жмем на кнопку добавления n раз, Затем удаляем средний виджет") + @UseDataProvider("dataProviderNumber") + @TestCaseId("3") + public void shouldSeeNWidgetsAfterOneClickByRemoveButton(int n) { + defaultSteps.openMainPageWithCity(CITY); + defaultSteps.clickNTimes(onMainPage().getNewWidgetButton(), n); + defaultSteps.click(onMainPage().getWeatherWidgetList().get(n / 2).getActionBlock().getRemoveButton()); + defaultSteps.widgetsAmountShouldBe(n); + } + +} \ No newline at end of file diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/TemperatureBlockTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/TemperatureBlockTest.java new file mode 100644 index 0000000..8a1b55d --- /dev/null +++ b/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/TemperatureBlockTest.java @@ -0,0 +1,46 @@ +package ru.qatools.school.webtests.widgettest; + +import com.tngtech.java.junit.dataprovider.DataProvider; +import com.tngtech.java.junit.dataprovider.DataProviderRunner; +import com.tngtech.java.junit.dataprovider.UseDataProvider; +import org.junit.Test; +import org.junit.runner.RunWith; +import ru.qatools.school.RepresentationPatterns; +import ru.qatools.school.pages.blocks.widgetblocks.TemperatureBlock; +import ru.qatools.school.webtests.BaseWeatherAppTest; +import ru.yandex.qatools.allure.annotations.TestCaseId; +import ru.yandex.qatools.allure.annotations.Title; + + +/** + * Created by vananos on 4/22/16. + */ +@RunWith(DataProviderRunner.class) +public class TemperatureBlockTest extends BaseWeatherAppTest { + + @DataProvider + public static Object[][] dataProvider() { + return new Object[][]{ + {0,RepresentationPatterns.CELSIUS}, + {1,RepresentationPatterns.KELVIN}, + {2, RepresentationPatterns.FAHRENHEIT}, + {3, RepresentationPatterns.KAIF}, + {4, RepresentationPatterns.CELSIUS} + }; + } + + + @Test + @Title("Температура должна отображаться в соответствии с определенным представлением") + @UseDataProvider("dataProvider") + @TestCaseId("5") + public void temperatureBlockTest(int n,RepresentationPatterns pattern) { + defaultSteps.openMainPageWithCity(CITY); + TemperatureBlock temperatureBlock = onMainPage().getWeatherWidgetList() + .get(0).getWidgetText().getTempBlock(); + defaultSteps.clickNTimes(temperatureBlock,n); + defaultSteps.shouldBeRepresentedAs(temperatureBlock.getRepresentation(), pattern); + + + } +} diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/TitleTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/TitleTest.java new file mode 100644 index 0000000..11869dd --- /dev/null +++ b/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/TitleTest.java @@ -0,0 +1,37 @@ +package ru.qatools.school.webtests.widgettest; + +import com.tngtech.java.junit.dataprovider.DataProvider; +import com.tngtech.java.junit.dataprovider.DataProviderRunner; +import com.tngtech.java.junit.dataprovider.UseDataProvider; +import org.junit.Test; +import org.junit.runner.RunWith; +import ru.qatools.school.webtests.BaseWeatherAppTest; +import ru.yandex.qatools.allure.annotations.TestCaseId; +import ru.yandex.qatools.allure.annotations.Title; + + +@RunWith(DataProviderRunner.class) + +public class TitleTest extends BaseWeatherAppTest { + + @DataProvider + public static Object[][] dataProviderCity() { + return new Object[][]{ + {"Moscow"}, + {"Kiev"}, + {"Berlin"}, + {"New York"} + }; + } + + + @Test + @Title("В названии погоды должен быть город «{0}»") + @UseDataProvider("dataProviderCity") + @TestCaseId("2") + public void titleShouldBeCity(String city) { + defaultSteps.openMainPageWithCity(city); + defaultSteps.cityIntitleShouldBe(onMainPage().getWeatherWidgetList().get(0).getWidgetTitle(), city); + } + +} diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/WeatherImageTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/WeatherImageTest.java new file mode 100644 index 0000000..34fea44 --- /dev/null +++ b/commons-module/src/test/java/ru/qatools/school/webtests/widgettest/WeatherImageTest.java @@ -0,0 +1,20 @@ +package ru.qatools.school.webtests.widgettest; + +import org.junit.Test; +import ru.qatools.school.webtests.BaseWeatherAppTest; +import ru.yandex.qatools.allure.annotations.TestCaseId; +import ru.yandex.qatools.allure.annotations.Title; + +/** + * Created by vananos on 4/21/16. + */ +public class WeatherImageTest extends BaseWeatherAppTest { + + @Test + @Title("Проверяет наличие картинки погоды") + @TestCaseId("9") + public void widgetImageTest() { + defaultSteps.openMainPageWithCity(CITY); + defaultSteps.shouldSee(onMainPage().getWeatherWidgetList().get(0).getWidgetText().getWeatherImage()); + } +} diff --git a/pom.xml b/pom.xml index 206b663..09b852e 100644 --- a/pom.xml +++ b/pom.xml @@ -1,23 +1,117 @@ - 4.0.0 ru.qatools.school school-2016 - pom 1.0-SNAPSHOT - + pom + + Automation Foreva + First automation project ever + steps-module + commons-module - Automation Foreva - First automation project ever - + + 1.8 + + 1.4.23 + 2.53.0 + 1.15 + 1.8.5 + + - + + junit + junit + 4.12 + - - \ No newline at end of file + + + + + ru.yandex.qatools.allure + allure-junit-adaptor + ${allure.version} + + + org.seleniumhq.selenium + selenium-java + ${selenium.version} + + + ru.yandex.qatools.htmlelements + htmlelements-java + ${htmlelements.version} + + + org.apache.commons + commons-lang3 + 3.4 + + + org.hamcrest + hamcrest-all + 1.3 + + + ru.yandex.qatools.htmlelements + htmlelements-matchers + 1.12 + + + com.jayway.restassured + rest-assured + 2.9.0 + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.0 + + ${compiler.version} + ${compiler.version} + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.18.1 + + + -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar" + + + + listener + ru.yandex.qatools.allure.junit.AllureRunListener + + + + + + org.aspectj + aspectjweaver + ${aspectj.version} + + + + + + + + + diff --git a/steps-module/pom.xml b/steps-module/pom.xml index fa52f60..3de61a5 100644 --- a/steps-module/pom.xml +++ b/steps-module/pom.xml @@ -1,18 +1,54 @@ - + 4.0.0 + school-2016 ru.qatools.school 1.0-SNAPSHOT - - 4.0.0 - jar - + steps-module + jar + Logic Module + + + ru.yandex.qatools.allure + allure-junit-adaptor + + + org.seleniumhq.selenium + selenium-java + + + ru.yandex.qatools.htmlelements + htmlelements-java + + + org.apache.commons + commons-lang3 + + + org.hamcrest + hamcrest-all + + + ru.yandex.qatools.htmlelements + htmlelements-matchers + + + com.jayway.restassured + rest-assured + + + com.jcabi + jcabi-matchers + 1.3 + + - \ No newline at end of file + diff --git a/steps-module/src/main/java/ru/qatools/school/RepresentationPatterns.java b/steps-module/src/main/java/ru/qatools/school/RepresentationPatterns.java new file mode 100644 index 0000000..1d2aa77 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/RepresentationPatterns.java @@ -0,0 +1,32 @@ +package ru.qatools.school; + +/** + * Created by vananos on 4/20/16. + */ +public enum RepresentationPatterns { + + DATE_TIME("\\d{1,2} (P|A)M, \\d{1,2} (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \\d{2} \\((?!((\\+|\\-)00:00))(00:00|(\\+|\\-)\\d{2}:\\d{2})\\)"), + CELSIUS("\\-?\\d{1,2}\\.\\d °C"), + FAHRENHEIT("\\-?\\d{1,3}\\.\\d °F"), + KELVIN("\\d{3}\\.\\d °K"), + KAIF("\\d{2}\\.\\d °Kaif"), + SUNRISE("Sunrise\\s\\d{2}:\\d{2}"), + SUNSET("Sunset\\s\\d{2}:\\d{2}"), + WIND("Wind\\s\\d{1,3}(\\.\\d{2})? m\\/s"), + HUMIDITY("Humidity\\s\\d{1,2} %"); + + + private final String pattern; + + RepresentationPatterns(String pattern) { + this.pattern = pattern; + } + + public String getPattern() { + return pattern; + } + + public String toString() { + return pattern.toString(); + } +} diff --git a/steps-module/src/main/java/ru/qatools/school/data/Place.java b/steps-module/src/main/java/ru/qatools/school/data/Place.java deleted file mode 100644 index 719cc4c..0000000 --- a/steps-module/src/main/java/ru/qatools/school/data/Place.java +++ /dev/null @@ -1,9 +0,0 @@ -package ru.qatools.school.data; - -/** - * @author lanwen (Merkushev Kirill) - */ -public enum Place { - HOME, - AT_YANDEX -} diff --git a/steps-module/src/main/java/ru/qatools/school/pages/MainPage.java b/steps-module/src/main/java/ru/qatools/school/pages/MainPage.java new file mode 100644 index 0000000..71ea860 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/pages/MainPage.java @@ -0,0 +1,39 @@ +package ru.qatools.school.pages; + +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.support.FindBy; +import org.openqa.selenium.support.PageFactory; +import ru.qatools.school.pages.blocks.NewWidgetButton; +import ru.qatools.school.pages.blocks.WeatherWidget; +import ru.yandex.qatools.htmlelements.annotations.Name; +import ru.yandex.qatools.htmlelements.loader.decorator.HtmlElementDecorator; +import ru.yandex.qatools.htmlelements.loader.decorator.HtmlElementLocatorFactory; + +import java.util.List; + +/** + * Created by kurau. + */ +public class MainPage { + + @Name("Список виджетов") + @FindBy(css = ".card.card_md") + private List weatherWidget; + @Name("Кнопка 'Новый виджет' ") + @FindBy(css = ".new-card") + private NewWidgetButton newWidgetBut; + + public MainPage(WebDriver driver) { + PageFactory.initElements(new HtmlElementDecorator(new HtmlElementLocatorFactory(driver)), this); + } + + public List getWeatherWidgetList() { + return weatherWidget; + } + + + public NewWidgetButton getNewWidgetButton() { + return newWidgetBut; + } + +} diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/NewWidgetButton.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/NewWidgetButton.java new file mode 100644 index 0000000..8006303 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/NewWidgetButton.java @@ -0,0 +1,14 @@ +package ru.qatools.school.pages.blocks; + +import org.openqa.selenium.Rectangle; +import ru.yandex.qatools.htmlelements.element.HtmlElement; + +/** + * Created by vananos on 4/14/16. + */ +public class NewWidgetButton extends HtmlElement { + + public Rectangle getRect() { + return null; + } +} diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/WeatherWidget.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/WeatherWidget.java new file mode 100644 index 0000000..a90ba0b --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/WeatherWidget.java @@ -0,0 +1,50 @@ +package ru.qatools.school.pages.blocks; + +import org.openqa.selenium.Rectangle; +import org.openqa.selenium.support.FindBy; +import ru.qatools.school.pages.blocks.widgetblocks.ActionBlock; +import ru.qatools.school.pages.blocks.widgetblocks.TemperatureBlock; +import ru.qatools.school.pages.blocks.widgetblocks.WidgetText; +import ru.qatools.school.pages.blocks.widgetblocks.WidgetTitle; +import ru.yandex.qatools.htmlelements.annotations.Name; +import ru.yandex.qatools.htmlelements.element.HtmlElement; + +/** + * Created by kurau. + */ +public class WeatherWidget extends HtmlElement { + + @Name("Заголовок виджета") + @FindBy(css = ".card-title") + private WidgetTitle widgetTitle; + + @Name("Текст виджета") + @FindBy(css = ".card-text") + private WidgetText widgetText; + + @Name("Панель управления виджетом") + @FindBy(css = ".card-actions") + private ActionBlock actions; + + + + + + public WidgetText getWidgetText() { + return widgetText; + } + + public WidgetTitle getWidgetTitle() { + return widgetTitle; + } + + public ActionBlock getActionBlock() { + return actions; + } + + + + public Rectangle getRect() { + return null; + } +} diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/ActionBlock.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/ActionBlock.java new file mode 100644 index 0000000..c762c56 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/ActionBlock.java @@ -0,0 +1,25 @@ +package ru.qatools.school.pages.blocks.widgetblocks; + +import org.openqa.selenium.Rectangle; +import org.openqa.selenium.support.FindBy; +import ru.yandex.qatools.htmlelements.annotations.Name; +import ru.yandex.qatools.htmlelements.element.HtmlElement; + +/** + * Created by vananos on 4/24/16. + */ +public class ActionBlock extends HtmlElement { + + @Name("Кнопка удаления виджета") + @FindBy(css = ".remove-card.btn.btn-default") + private HtmlElement removeButton; + + public HtmlElement getRemoveButton() { + return removeButton; + } + + @Override + public Rectangle getRect() { + return null; + } +} diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/InfoLine.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/InfoLine.java new file mode 100644 index 0000000..a3e3fcd --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/InfoLine.java @@ -0,0 +1,45 @@ +package ru.qatools.school.pages.blocks.widgetblocks; + +import org.openqa.selenium.Rectangle; +import org.openqa.selenium.support.FindBy; +import ru.yandex.qatools.htmlelements.annotations.Name; +import ru.yandex.qatools.htmlelements.element.HtmlElement; + +/** + * Created by vananos on 4/24/16. + */ +public class InfoLine extends HtmlElement { + + @Name("Заголовок") + @FindBy(css = ".info-line__title") + HtmlElement title; + + @Name("Значение") + @FindBy(css = ".info-line__value") + HtmlElement value; + + @Name("Картинка") + @FindBy(css = ".info-line__image") + HtmlElement image; + + public HtmlElement getValue() { + return value; + } + + public HtmlElement getImage() { + return image; + } + + public HtmlElement getTitle() { + return title; + } + + public String getTextRepresentation() { + return title.getText() + " " + value.getText(); + } + + @Override + public Rectangle getRect() { + return null; + } +} diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/TemperatureBlock.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/TemperatureBlock.java new file mode 100644 index 0000000..6f894e3 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/TemperatureBlock.java @@ -0,0 +1,36 @@ +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; + + + +public class TemperatureBlock extends HtmlElement { + + @Name("Значение температуры") + @FindBy(css = ".weather-temperature__digit") + private HtmlElement tempVal; + + @Name("Мера измерения температуры") + @FindBy(css = ".weather-temperature__unit") + private HtmlElement tempFormat; + + + public HtmlElement getTemperatureValueBlock() { + return tempVal; + } + + public HtmlElement getTemperatureFormatBlock() { + return tempFormat; + } + + public String getRepresentation() { + return tempVal.getText() + " " + tempFormat.getText(); + } + + public Rectangle getRect() { + return null; + } +} diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetText.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetText.java new file mode 100644 index 0000000..aed9373 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetText.java @@ -0,0 +1,43 @@ +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; + +import java.util.List; + +/** + * Created by kurau. + */ +public class WidgetText extends HtmlElement { + + @Name("Картинка текущей погоды") + @FindBy(css = ".weather-image") + private WebElement weatherImage; + + @Name("Поля с дополнительной информацией") + @FindBy(css = ".info-line") + private List infoLines; + + @Name("Блок температуры") + @FindBy(css = ".weather-temperature") + private TemperatureBlock tempBlock; + + public WebElement getWeatherImage() { + return weatherImage; + } + + public List getInfoLines() { + return infoLines; + } + + public TemperatureBlock getTempBlock() { + return tempBlock; + } + + public Rectangle getRect() { + return null; + } +} diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetTitle.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetTitle.java new file mode 100644 index 0000000..3bf4769 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetTitle.java @@ -0,0 +1,32 @@ +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 kurau. + */ +public class WidgetTitle extends HtmlElement { + + @Name("Город заголовка") + @FindBy(css = ".inplace.inplace_displayed") + private HtmlElement cityElement; + + @Name("Дата заголовка") + @FindBy(css = ".card-title__secondary") + private HtmlElement dateTime; + + public HtmlElement getTitleCityElement() { + return cityElement; + } + + public HtmlElement getDateTime() { + return dateTime; + } + + public Rectangle getRect() { + return null; + } +} diff --git a/steps-module/src/main/java/ru/qatools/school/rules/WebDriverRule.java b/steps-module/src/main/java/ru/qatools/school/rules/WebDriverRule.java new file mode 100644 index 0000000..418c363 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/rules/WebDriverRule.java @@ -0,0 +1,27 @@ +package ru.qatools.school.rules; + +import org.junit.rules.ExternalResource; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.firefox.FirefoxDriver; + +/** + * Created by kurau. + */ +public class WebDriverRule extends ExternalResource { + + private WebDriver driver; + + protected void before() throws Throwable { + this.driver = new FirefoxDriver(); + } + + protected void after() { + driver.close(); + driver.quit(); + } + + public WebDriver getDriver() { + return driver; + } + +} 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 043ad54..0000000 --- a/steps-module/src/main/java/ru/qatools/school/steps/UserSteps.java +++ /dev/null @@ -1,23 +0,0 @@ -package ru.qatools.school.steps; - -import ru.qatools.school.data.Place; - -/** - * @author lanwen (Merkushev Kirill) - */ -public class UserSteps { - - private Place place; - - private UserSteps() { - } - - public static UserSteps user() { - return new UserSteps(); - } - - public UserSteps goTo(Place place) { - this.place = place; - return this; - } -} diff --git a/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java b/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java new file mode 100644 index 0000000..97f0ff0 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java @@ -0,0 +1,88 @@ +package ru.qatools.school.steps.websteps; + +import com.jcabi.matchers.RegexMatchers; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; +import ru.qatools.school.RepresentationPatterns; +import ru.qatools.school.pages.MainPage; +import ru.qatools.school.pages.blocks.widgetblocks.WidgetTitle; +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.hasText; +import static ru.yandex.qatools.htmlelements.matchers.WebElementMatchers.isDisplayed; + + +/** + * Created by kurau. + */ +public class DefaultSteps { + + public static final String MAIN_PAGE = "http://weather.lanwen.ru/"; + public static final String MAIN_PAGE_WITH_CITY = "http://weather.lanwen.ru/#?cities=%s"; + + private WebDriver driver; + + + public DefaultSteps(WebDriver driver) { + this.driver = driver; + } + + @Step("Открываем главную страницу для города «{0}»") + public void openMainPageWithCity(String city) { + driver.get(format(MAIN_PAGE_WITH_CITY, city)); + } + + @Step("Открываем главную страницу без города") + public void openMainPage() { + driver.get(MAIN_PAGE); + } + + @Step("Должны видеть на странице «{0}»") + public void shouldSee(WebElement element) { + assertThat("Должны видеть элемент", element, isDisplayed()); + } + + @Step("Заголовок должен быть «{1}»") + public void cityIntitleShouldBe(WidgetTitle widgetTitle, String title) { + assertThat("Город должен быть", widgetTitle.getTitleCityElement(), hasText(title)); + } + + @Step("Количество виджетов должно быть «{0}»") + public void widgetsAmountShouldBe(int n) { + assertThat("Количество виджетов должно быть", onMainPage().getWeatherWidgetList().size(), is(n)); + } + + + @Step("Жмем на элемент") + public void click(WebElement el) { + el.click(); + } + + @Step("Жмем на элемент n раз") + public void clickNTimes(WebElement el, int n) { + while(n-- > 0) { + el.click(); + } + } + + + + @Step("Проверяем что представление элемента {0} соответствует паттерну {1}") + public void shouldBeRepresentedAs(String representation, RepresentationPatterns pattern) { + assertThat("Представление должно соответствовать регулярному выражение", + representation, RegexMatchers.containsPattern(pattern.getPattern())); + + } + + + private MainPage onMainPage() { + return new MainPage(driver); + } +} + + + + diff --git a/steps-module/src/main/java/ru/qatools/school/tp/TPInformerRule.java b/steps-module/src/main/java/ru/qatools/school/tp/TPInformerRule.java new file mode 100644 index 0000000..b52d777 --- /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..b29a8ed --- /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", "https://localhost/"); + private static final String TOKEN = System.getProperty("tp.api.token", ""); + private static final String RUN = System.getProperty("tp.api.run", ""); + + public static void callUpdate(String project, List statuses) { + 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; + } + } + +} diff --git a/steps-module/src/test/java/ru/qatools/school/MyFirstTest.java b/steps-module/src/test/java/ru/qatools/school/MyFirstTest.java deleted file mode 100644 index 5378485..0000000 --- a/steps-module/src/test/java/ru/qatools/school/MyFirstTest.java +++ /dev/null @@ -1,14 +0,0 @@ -package ru.qatools.school; - -import static ru.qatools.school.steps.UserSteps.user; - -/** - * @author lanwen (Merkushev Kirill) - */ -public class MyFirstTest { - - public void test() { - user().goTo(null); - } - -}