diff --git a/api-tests-module/pom.xml b/api-tests-module/pom.xml new file mode 100644 index 0000000..fdbbcb6 --- /dev/null +++ b/api-tests-module/pom.xml @@ -0,0 +1,56 @@ + + + + school-2016 + ru.qatools.school + 1.0-SNAPSHOT + + 4.0.0 + + api-tests-module + + + + + com.jayway.restassured + rest-assured + 2.9.0 + + + com.squareup.retrofit2 + retrofit + 2.0.2 + + + com.google.code.gson + gson + 2.6.2 + test + + + com.squareup.retrofit2 + converter-gson + 2.0.2 + + + org.hamcrest + hamcrest-all + 1.3 + + + ru.yandex.qatools.allure + allure-junit-adaptor + 1.4.23 + + + ru.yandex.qatools.matchers + collection-matchers + 1.3 + + + + + + \ No newline at end of file diff --git a/api-tests-module/src/test/java/ru/qatools/school/apitests/RestAssureAPITest.java b/api-tests-module/src/test/java/ru/qatools/school/apitests/RestAssureAPITest.java new file mode 100644 index 0000000..e3bc5d2 --- /dev/null +++ b/api-tests-module/src/test/java/ru/qatools/school/apitests/RestAssureAPITest.java @@ -0,0 +1,60 @@ +package ru.qatools.school.apitests; + +import com.jayway.restassured.response.Response; +import org.apache.http.HttpStatus; +import org.junit.Before; +import org.junit.Test; +import com.jayway.restassured.builder.RequestSpecBuilder; +import com.jayway.restassured.specification.RequestSpecification; +import ru.qatools.school.apitests.data.City; +import ru.qatools.school.apitests.data.WeatherInfo; +import ru.yandex.qatools.allure.annotations.Title; + +import java.io.IOException; + +import static com.jayway.restassured.RestAssured.given; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.Is.is; + +/** + * @author Gavrilov_IS + */ +public class RestAssureAPITest { + private static final String MAIN_PAGE = "http://weather.lanwen.ru/"; + private static final String BASE_PATH = "api"; + private final String CITY = "Moscow"; + private final int CITY_LIMIT = 5; + + private RequestSpecification reqSpec; + + @Before + public void init() { + reqSpec = new RequestSpecBuilder().build() + .baseUri(MAIN_PAGE) + .basePath(BASE_PATH); + } + + @Test + @Title("Проверяем, что запрос обработан и город в ответе соответствует запрошенному") + public void shouldGetInfoForCityInRequest() throws IOException { + WeatherInfo response = given().spec(reqSpec) + .param("city", CITY) + .expect().statusCode(HttpStatus.SC_OK) + .get("weather") + .as(WeatherInfo.class); + assertThat("Город в ответе должен соответствовать запрошенному", response.getCity(), is(CITY)); + + } + + @Test + @Title("Запрос на /cities с параметром limit=CITY_LIMIT вернул указанное количество записей") + public void shouldGetExpectedCountOfCities() throws IOException { + Response response = given().spec(reqSpec) + .param("limit", 5) + .get("cities"); + response.then().assertThat() + .statusCode(HttpStatus.SC_OK); + City[] cities = response.as(City[].class); + assertThat("Количество городов должно соответствовать указанному лимиту", cities.length, is(CITY_LIMIT)); + } +} diff --git a/api-tests-module/src/test/java/ru/qatools/school/apitests/RetrofitAPITest.java b/api-tests-module/src/test/java/ru/qatools/school/apitests/RetrofitAPITest.java new file mode 100644 index 0000000..0d2f8eb --- /dev/null +++ b/api-tests-module/src/test/java/ru/qatools/school/apitests/RetrofitAPITest.java @@ -0,0 +1,56 @@ +package ru.qatools.school.apitests; + +import org.apache.http.HttpStatus; +import org.junit.Before; +import org.junit.Test; +import static org.junit.Assert.*; +import retrofit2.Response; +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; +import ru.qatools.school.apitests.data.City; +import ru.qatools.school.apitests.data.WeatherInfo; +import ru.qatools.school.apitests.interfaces.WeatherAPI; +import ru.yandex.qatools.allure.annotations.Title; + +import java.io.IOException; +import java.util.List; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.Is.is; + +/** + * @author Gavrilov_IS + */ +public class RetrofitAPITest { + private final String BASE_URL = "http://weather.lanwen.ru/api/"; + private WeatherAPI weather; + private final String CITY = "Moscow"; + private final int CITY_LIMIT = 5; + + Retrofit client = new Retrofit.Builder() + .baseUrl(BASE_URL) + .addConverterFactory(GsonConverterFactory.create()) + .build(); + + @Before + public void init() { + weather = client.create(WeatherAPI.class); + } + + @Test + @Title("Проверяем, что запрос обработан и город в ответе соответствует запрошенному") + public void shouldGetInfoForCityInRequest() throws IOException { + Response response = weather.getWeather(CITY).execute(); + assertThat("Успешная обработка запроса", response.code(), is(HttpStatus.SC_OK)); + assertThat("Город в ответе должен соответствовать запрошенному", response.body().getCity(), is(CITY)); + } + + @Test + @Title("Запрос на /cities с параметром limit=CITY_LIMIT вернул указанное количество записей") + public void shouldGetExpectedCountOfCities() throws IOException { + Response> response = weather.getCitiesWithLimit(CITY_LIMIT).execute(); + assertThat("Успешная обработка запроса", response.code(), is(HttpStatus.SC_OK)); + assertEquals("Город в ответе должен соответствовать запрошенному", response.body().size(), CITY_LIMIT); + } + +} diff --git a/api-tests-module/src/test/java/ru/qatools/school/apitests/data/City.java b/api-tests-module/src/test/java/ru/qatools/school/apitests/data/City.java new file mode 100644 index 0000000..dfe0cea --- /dev/null +++ b/api-tests-module/src/test/java/ru/qatools/school/apitests/data/City.java @@ -0,0 +1,30 @@ +package ru.qatools.school.apitests.data; + +/** + * Created by Gavrilov_IS on 11.05.2016. + */ +public class City { + private int UID; + private String name; + private String country; + + public String getName(){ + return name; + } + + public int getUID(){ + return UID; + } + + public String getCountry(){ + return country; + } + + public void setName(String name){ + this.name = name; + } + + public void setUID(int UID){ + this.UID = UID; + } +} diff --git a/api-tests-module/src/test/java/ru/qatools/school/apitests/data/Temperature.java b/api-tests-module/src/test/java/ru/qatools/school/apitests/data/Temperature.java new file mode 100644 index 0000000..2c0053f --- /dev/null +++ b/api-tests-module/src/test/java/ru/qatools/school/apitests/data/Temperature.java @@ -0,0 +1,24 @@ +package ru.qatools.school.apitests.data; + +/** + * @author Gavrilov_IS + */ +public class Temperature { + private String unit; + private double value; + + public String getUnit(){ + return unit; + } + + public double getValue(){ + return value; + } + + @Override + public String toString(){ + return "unit = " + unit + "; digit = " + value + "; \r\n"; + } + + +} diff --git a/api-tests-module/src/test/java/ru/qatools/school/apitests/data/WeatherInfo.java b/api-tests-module/src/test/java/ru/qatools/school/apitests/data/WeatherInfo.java new file mode 100644 index 0000000..1d32717 --- /dev/null +++ b/api-tests-module/src/test/java/ru/qatools/school/apitests/data/WeatherInfo.java @@ -0,0 +1,19 @@ +package ru.qatools.school.apitests.data; + +import java.util.List; + +/** + * @author Gavrilov_IS + */ +public class WeatherInfo { + private String city; + private List temperatures; + + public String getCity(){ + return city; + } + + public List getListOfTemperatures(){ + return temperatures; + } +} diff --git a/api-tests-module/src/test/java/ru/qatools/school/apitests/interfaces/WeatherAPI.java b/api-tests-module/src/test/java/ru/qatools/school/apitests/interfaces/WeatherAPI.java new file mode 100644 index 0000000..d8b7747 --- /dev/null +++ b/api-tests-module/src/test/java/ru/qatools/school/apitests/interfaces/WeatherAPI.java @@ -0,0 +1,28 @@ +package ru.qatools.school.apitests.interfaces; + +import retrofit2.Call; +import retrofit2.http.GET; +import retrofit2.http.Query; +import ru.qatools.school.apitests.data.City; +import ru.qatools.school.apitests.data.WeatherInfo; + +import java.util.List; + + +/** + * @author Gavrilov_IS + */ +public interface WeatherAPI { + @GET("cities") + Call> getCities(); + + @GET("cities") + Call> getCitiesWithLimit(@Query ("limit") int lim); + + @GET("suggest") + Call> getSuggest(@Query ("query") String str); + + @GET("weather") + Call getWeather(@Query("city") String city); +} + diff --git a/commons-module/pom.xml b/commons-module/pom.xml index b1372c7..123c6be 100644 --- a/commons-module/pom.xml +++ b/commons-module/pom.xml @@ -11,7 +11,7 @@ commons-module - jar + pom Commons Module diff --git a/commons-module/src/test/java/ru/qatools/school/MyFirstTest.java b/commons-module/src/test/java/ru/qatools/school/MyFirstTest.java deleted file mode 100644 index 7b9da2e..0000000 --- a/commons-module/src/test/java/ru/qatools/school/MyFirstTest.java +++ /dev/null @@ -1,53 +0,0 @@ -package ru.qatools.school; - -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.data.Place; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import static ru.qatools.school.steps.UserSteps.user; - - -/** - * @author gladnik (Nikolai Gladkov) - */ -@RunWith(DataProviderRunner.class) -public class MyFirstTest { - - @DataProvider - public static List places() { - List placesList - = new ArrayList(Arrays.asList(Place.values())); - placesList.add(null); - return placesList; - } - - @Test - public void shouldBeAtNullWhenDefault() { - user().shouldBeAtPlace(null); - } - - @Test - @UseDataProvider("places") - public void afterGoSomewhereShouldBeThere(Place place) { - user().goTo(place).shouldBeAtPlace(place); - } - - @Test - @UseDataProvider("places") - public void afterGoSomewhereTwiceShouldBeThere(Place place) { - user().goTo(place).goTo(place).shouldBeAtPlace(place); - } - - @Test - public void afterGoSomewhereElseShouldBeThere() { - user().goTo(Place.HOME).goTo(Place.AT_YANDEX) - .shouldBeAtPlace(Place.AT_YANDEX); - } -} 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..e1c3c35 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 @@ -14,8 +14,8 @@ public class ConnectedToTPTest { - @Rule - public TPInformerRule tms = new TPInformerRule("ruletest"); + /* @Rule + public TPInformerRule tms = new TPInformerRule("ruletest"); @Test @@ -44,5 +44,5 @@ public void shouldBroke() throws IOException, InterruptedException { public void shouldBeSkipped() throws IOException, InterruptedException { SECONDS.sleep(5); assumeThat(true, is(false)); - } + }*/ } 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..7cc73d4 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,34 +3,214 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; +import ru.qatools.school.data.FormatVerify; 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"; + public static final String OMSK = "Omsk"; + public static final String NEW_WIDGET_TITLE = "What a city?"; + public static final String CELSIUS = "°C"; + private DefaultSteps defaultSteps; @Rule public WebDriverRule webDriverRule = new WebDriverRule(); + @Rule + public TPInformerRule tms = new TPInformerRule("bahek091"); + @Before public void initSteps() { defaultSteps = new DefaultSteps(webDriverRule.getDriver()); } + + @Test + @TestCaseId("1") + @Title("Должны видеть главную страницу с кнопкой добавления виджета") + public void shouldOpenMainPage() { + defaultSteps.openMainPage(); + defaultSteps.shouldSee(onMainPage().getAddWidgetButton()); + defaultSteps.shouldBeEqualsCountOfWidgets(0); + } + @Test + @TestCaseId("2") @Title("Должны видеть виджет на главной странице") public void shouldSeeWidgetOnMainPage() { defaultSteps.openMainPageWithCity(MOSCOW); - defaultSteps.shouldSee(onMainPage().getWeatherWidget().get(0)); + defaultSteps.shouldSee(onMainPage().getWeatherWidgets().get(0)); + } + + @Test + @TestCaseId("3") + @Title("Должны видеть город {1} в элементе {2}") + public void shouldSeeCity() { + defaultSteps.openMainPageWithCity(MOSCOW); + defaultSteps.strShouldBeInElement(MOSCOW, onMainPage().getWeatherWidgets().get(0).widgetTitle().getCity()); + } + + @Test + @TestCaseId("4") + @Title("Поле с показанием температуры первого виджета на странице не должно быть пустым") + public void shoudBeTemperatureOnWidget(){ + defaultSteps.openMainPageWithCity(MOSCOW); + defaultSteps.shouldBeNotEmpty(onMainPage().getWeatherWidgets().get(0).widgetText().digitTemperature()); + } + + @Test + @TestCaseId("5") + @Title("Должны видеть у первого виджета кнопку удаления {0}") + public void shoudSeeRemoveWidgetButton(){ + defaultSteps.openMainPageWithCity(MOSCOW); + defaultSteps.shouldSee(onMainPage().getWeatherWidgets().get(0).getActions().removeBtn()); + } + + @Test + @TestCaseId("6") + @Title("Должны видеть на странице кнопку добавления виджета {0}") + public void shoudSeeAddWidgetButton(){ + defaultSteps.openMainPageWithCity(MOSCOW); + defaultSteps.shouldSee(onMainPage().getAddWidgetButton()); + } + + @TestCaseId("7") + @Test + @Title("Должен добавляться еще один виджет") + public void shouldBeAbleToAddWidget() { + defaultSteps.openMainPageWithCity(MOSCOW); + int numOfWidgets = onMainPage().getWeatherWidgets().size(); + defaultSteps.clickButton(onMainPage().getAddWidgetButton()); + defaultSteps.shouldBeEqualsCountOfWidgets(numOfWidgets + 1); + } + + @Test + @TestCaseId("8") + @Title("После удаления первого из пары виджетов должен остаться один") + public void shouldBeAbleToRemoveWidget() { + defaultSteps.openMainPageWithTwoCities(MOSCOW, OMSK); + int numOfWidgets = onMainPage().getWeatherWidgets().size(); + defaultSteps.clickButton(onMainPage().getWeatherWidgets().get(0).getActions().removeBtn()); + defaultSteps.shouldBeEqualsCountOfWidgets(numOfWidgets - 1); + } + + @Test + @TestCaseId("9") + @Title("Температура отображатся в допустимых пределах") + public void shouldBeCorrectTemperature() { + defaultSteps.openMainPageWithCity(MOSCOW); + defaultSteps.shouldBeBetweenMinAndMax(onMainPage().getWeatherWidgets().get(0).widgetText().digitTemperature(), -80, 80); + } + @Test + @TestCaseId("10") + @Title("Должны видеть 'What a city' в заголовке нового виджета") + public void shouldSeeNewCityTitle() { + defaultSteps.openMainPageWithCity(MOSCOW); + defaultSteps.clickButton(onMainPage().getAddWidgetButton()); + defaultSteps.strShouldBeInElement(NEW_WIDGET_TITLE, onMainPage().getWeatherWidgets().get(0).widgetTitle().getCity()); + } + + @Test + @TestCaseId("11") + @Title("Формат вывода температуры в градусах цельсия должен соответствовать заданному формату") + public void celsiusTemperatureShouldBeInCorrectFormat(){ + defaultSteps.openMainPageWithCity(MOSCOW); + defaultSteps.shouldMatchToRegExp(onMainPage().getWeatherWidgets().get(0).widgetText().temperature(), format.getRegExpForCelsius()); } + @Test + @TestCaseId("12") + @Title("Время и дата в заголовке соответствуют заданному формату") + public void dateShouldBeInCorrectFormat(){ + defaultSteps.openMainPageWithCity(MOSCOW); + defaultSteps.shouldMatchToRegExp(onMainPage().getWeatherWidgets().get(0).widgetTitle().getDate(), format.getRegExpForDate()); + } + + @Test + @TestCaseId("13") + @Title("Время восхода солнца в первом виджет соответствуют заданному формату") + public void sunriseTimeShouldBeInCorrectFormat(){ + defaultSteps.openMainPageWithCity(MOSCOW); + defaultSteps.shouldMatchToRegExp(onMainPage().getWeatherWidgets().get(0).widgetText().sunriseLine(), format.getRegExpForSunriseTime()); + } + + @Test + @TestCaseId("14") + @Title("Время захода солнца в первом виджет соответствуют заданному формату") + public void sunsetTimeShouldBeInCorrectFormat(){ + defaultSteps.openMainPageWithCity(MOSCOW); + defaultSteps.shouldMatchToRegExp(onMainPage().getWeatherWidgets().get(0).widgetText().sunsetLine(), format.getRegExpForSunsetTime()); + } + + @Test + @TestCaseId("15") + @Title("Скорость ветра в первом виджете соответствуют заданному формату") + public void windSpeedShouldBeInCorrectFormat(){ + defaultSteps.openMainPageWithCity(MOSCOW); + defaultSteps.shouldMatchToRegExp(onMainPage().getWeatherWidgets().get(0).widgetText().windLine(), format.getRegExpForWind()); + } + + @Test + @TestCaseId("16") + @Title("Влажность воздуха в первом виджете соответствуют заданному формату") + public void humiditySpeedShouldBeInCorrectFormat(){ + defaultSteps.openMainPageWithCity(MOSCOW); + defaultSteps.shouldMatchToRegExp(onMainPage().getWeatherWidgets().get(0).widgetText().humidityLine(), format.getRegExpForHumidity()); + } + + @Test + @TestCaseId("17") + @Title("Формат вывода температуры в градусах Кельвина должен соответствовать заданному формату") + public void kelvinTemperatureShouldBeInCorrectFormat(){ + defaultSteps.openMainPageWithCity(MOSCOW); + defaultSteps.clickButton(onMainPage().getWeatherWidgets().get(0).widgetText().temperature()); + defaultSteps.shouldMatchToRegExp(onMainPage().getWeatherWidgets().get(0).widgetText().temperature(), format.getRegExpForKelvin()); + } + + @Test + @TestCaseId("18") + @Title("Формат вывода температуры в градусах по-кайфу должен соответствовать заданному формату") + public void kaifTemperatureShouldBeInCorrectFormat(){ + defaultSteps.openMainPageWithCity(MOSCOW); + defaultSteps.clickButton(onMainPage().getWeatherWidgets().get(0).widgetText().temperature()); + defaultSteps.clickButton(onMainPage().getWeatherWidgets().get(0).widgetText().temperature()); + defaultSteps.clickButton(onMainPage().getWeatherWidgets().get(0).widgetText().temperature()); + defaultSteps.shouldMatchToRegExp(onMainPage().getWeatherWidgets().get(0).widgetText().temperature(), format.getRegExpForKaif()); + } + + @Test + @TestCaseId("19") + @Title("Формат вывода температуры в градусах Фаренгейта должен соответствовать заданному формату") + public void farenheitTemperatureShouldBeInCorrectFormat(){ + defaultSteps.openMainPageWithCity(MOSCOW); + defaultSteps.clickButton(onMainPage().getWeatherWidgets().get(0).widgetText().temperature()); + defaultSteps.clickButton(onMainPage().getWeatherWidgets().get(0).widgetText().temperature()); + defaultSteps.shouldMatchToRegExp(onMainPage().getWeatherWidgets().get(0).widgetText().temperature(), format.getRegExpForFarenheit()); + } + + @Test + @TestCaseId("20") + @Title("Новый виджет добавляется на первое место") + public void newWidgetShouldBeFirst(){ + defaultSteps.openMainPageWithCity(MOSCOW); + defaultSteps.clickButton(onMainPage().getAddWidgetButton()); + defaultSteps.strShouldBeInElement(NEW_WIDGET_TITLE,onMainPage().getWeatherWidgets().get(0).widgetTitle().getCity()); + } + + + + private MainPage onMainPage() { return new MainPage(webDriverRule.getDriver()); } + private FormatVerify format = new FormatVerify(); } diff --git a/pom.xml b/pom.xml index a32202a..bb2a6b9 100644 --- a/pom.xml +++ b/pom.xml @@ -15,6 +15,7 @@ steps-module commons-module + api-tests-module diff --git a/steps-module/src/main/java/ru/qatools/school/data/FormatVerify.java b/steps-module/src/main/java/ru/qatools/school/data/FormatVerify.java new file mode 100644 index 0000000..b92adcb --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/data/FormatVerify.java @@ -0,0 +1,58 @@ +package ru.qatools.school.data; + +import java.util.regex.Pattern; + +/** + * Created by Gavrilov_IS on 26.04.2016. + */ +public class FormatVerify { + private static String regDate = "(1[012]|[1-9])(\\s)?(AM|PM)(,\\s)([012]?[0-9]|3[01])(\\s)(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)(\\s)\\d{2}(\\s)(\\([+-]\\d{2}:\\d{2}\\))"; + private static String regCelsius = "-?\\d{1,2}\\.(\\d)(\\s)(°C)"; + private static String regKelvin = "\\d{1,3}\\.(\\d)(\\s)(°K)"; + private static String regForenheit = "-?\\d{1,2}\\.(\\d)(\\s)(°F)"; + private static String regKaif = "-?\\d{1,2}\\.(\\d)(\\s)(°Kaif)"; + private static String regSunriseTime = "Sunrise\\s\\d{2}:\\d{2}"; + private static String regSunsetTime = "Sunset\\s\\d{2}:\\d{2}"; + private static String regWind = "Wind\\s\\d{1,2}(\\.\\d{1,2})?\\s(m\\/s)"; + private static String regHumidity = "Humidity\\s\\d{1,2}?\\s(\\%)"; + + + public String getRegExpForDate(){ + return regDate; + } + + public String getRegExpForCelsius(){ + return regCelsius; + } + + public String getRegExpForKelvin(){ + return regKelvin; + } + + public String getRegExpForFarenheit(){ + return regForenheit; + } + + public String getRegExpForKaif(){ + return regKaif; + } + + public String getRegExpForSunriseTime(){ + return regSunriseTime; + } + + public String getRegExpForSunsetTime(){ + return regSunsetTime; + } + + public String getRegExpForWind(){ + return regWind; + } + + public String getRegExpForHumidity(){ + return regHumidity; + } + + + +} 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..dc991aa 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 @@ -5,6 +5,7 @@ import org.openqa.selenium.support.PageFactory; import ru.qatools.school.pages.blocks.WeatherWidget; import ru.yandex.qatools.htmlelements.annotations.Name; +import ru.yandex.qatools.htmlelements.element.HtmlElement; import ru.yandex.qatools.htmlelements.loader.decorator.HtmlElementDecorator; import ru.yandex.qatools.htmlelements.loader.decorator.HtmlElementLocatorFactory; @@ -21,10 +22,18 @@ public MainPage(WebDriver driver) { @Name("Список виджетов") @FindBy(css = ".card.card_md") - private List weatherWidget; + private List weatherWidgets; - public List getWeatherWidget() { - return weatherWidget; + @Name("Кнопка добавления виджета") + @FindBy(css = ".new-card") + private HtmlElement addWidgetButton; + + public List getWeatherWidgets() { + return weatherWidgets; + } + + public HtmlElement getAddWidgetButton() { + return addWidgetButton; } } diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/WeatherWidget.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/WeatherWidget.java index 3990d85..1b9a5a4 100644 --- a/steps-module/src/main/java/ru/qatools/school/pages/blocks/WeatherWidget.java +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/WeatherWidget.java @@ -3,6 +3,7 @@ import org.openqa.selenium.Rectangle; import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; +import ru.qatools.school.pages.blocks.widgetblocks.WidgetActions; import ru.qatools.school.pages.blocks.widgetblocks.WidgetText; import ru.qatools.school.pages.blocks.widgetblocks.WidgetTitle; import ru.yandex.qatools.htmlelements.annotations.Name; @@ -23,17 +24,17 @@ public class WeatherWidget extends HtmlElement { @Name("Панель управления виджетом") @FindBy(css = ".card-actions") - private WebElement actions; + private WidgetActions actions; - public WidgetText getWidgetText() { + public WidgetText widgetText() { return widgetText; } - public WidgetTitle getWidgetTitle() { + public WidgetTitle widgetTitle() { return widgetTitle; } - public WebElement getActions() { + public WidgetActions getActions() { return actions; } diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetActions.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetActions.java new file mode 100644 index 0000000..867d1b0 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetActions.java @@ -0,0 +1,27 @@ +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; + +/** + * Created by Gavrilov_IS on 23.04.2016. + */ +public class WidgetActions extends HtmlElement { + + @Name("Кнопка удаления виджета") + @FindBy(css = ".remove-card.btn") + private WebElement removeBtn; + + public WebElement removeBtn(){ + return this.removeBtn; + } + + @Override + 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..3b2ab20 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 @@ -6,6 +6,8 @@ import ru.yandex.qatools.htmlelements.annotations.Name; import ru.yandex.qatools.htmlelements.element.HtmlElement; +import java.util.List; + /** * Created by kurau. */ @@ -15,6 +17,49 @@ public class WidgetText extends HtmlElement { @FindBy(css = ".weather-image") private WebElement weatherImage; + @Name("Блок отображения температуры") + @FindBy(css = ".weather-temperature") + private WebElement temperature; + + @Name("Показание температуры") + @FindBy(css = ".weather-temperature__digit") + private WebElement digitTemperature; + + @Name("Единицы измерения температуры") + @FindBy(css = ".weather-temperature__unit") + private WebElement unitsTemperature; + + @Name("Список блоков infoline") + @FindBy(css = ".line.info-line") + private List infoLines; + + + public WebElement digitTemperature(){ + return this.digitTemperature; + } + + public WebElement unitsTemperature(){ + return this.unitsTemperature; + } + + public WebElement sunriseLine(){ + return this.infoLines.get(0); + } + public WebElement sunsetLine(){ + return this.infoLines.get(1); + } + public WebElement windLine(){ + return this.infoLines.get(2); + } + + public WebElement humidityLine(){ + return this.infoLines.get(3); + } + + public WebElement temperature(){ + return this.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..17ba1f6 100644 --- a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetTitle.java +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetTitle.java @@ -1,6 +1,9 @@ package ru.qatools.school.pages.blocks.widgetblocks; import org.openqa.selenium.Rectangle; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; +import ru.yandex.qatools.htmlelements.annotations.Name; import ru.yandex.qatools.htmlelements.element.HtmlElement; /** @@ -8,6 +11,22 @@ */ public class WidgetTitle extends HtmlElement { + @Name("Город в заголовке виджета") + @FindBy(css = ".inplace_displayed") + private WebElement weatherCity; + + @Name("Время, дата и часовой пояс в заголовке виджета") + @FindBy(css = ".card-title__secondary") + private WebElement weatherDate; + + public WebElement getCity(){ + return this.weatherCity; + } + + public WebElement getDate(){ + return this.weatherDate; + } + public Rectangle getRect() { return null; } 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 1425a42..5a3c612 100644 --- a/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java +++ b/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java @@ -1,20 +1,24 @@ package ru.qatools.school.steps.websteps; + import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import ru.qatools.school.pages.MainPage; import ru.yandex.qatools.allure.annotations.Step; +import java.util.regex.Pattern; + import static java.lang.String.format; -import static org.junit.Assert.assertThat; +import static org.hamcrest.Matchers.*; +import static org.hamcrest.core.Is.is; +import static org.junit.Assert.*; 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/#?cities=%s"; + public static final String EMPTY_MAIN_PAGE = "http://weather.lanwen.ru/"; private WebDriver driver; @@ -22,16 +26,60 @@ public DefaultSteps(WebDriver driver) { this.driver = driver; } + @Step("Открываем главную страницу") + public void openMainPage() { + driver.get(EMPTY_MAIN_PAGE); + } + @Step("Открываем главную страницу для города «{0}»") public void openMainPageWithCity(String city) { driver.get(format(MAIN_PAGE, city)); } + @Step("Открываем главную страницу для двух городов: «{0}» и «{1}»") + public void openMainPageWithTwoCities(String city1, String city2) { + driver.get(format(MAIN_PAGE, city1 + ","+city2)); + } + @Step("Должны видеть на странице «{0}»") public void shouldSee(WebElement element) { assertThat("Должны видеть элемент", element, isDisplayed()); } + @Step("Элемент «{1}» должен содержать строку «{0}»") + public void strShouldBeInElement(String str, WebElement currElement){ + assertThat("Строка в элементе должна совпадать с ожидаемой", currElement.getText(), is(str)); + } + + @Step("Клик на кнопку «{0}»") + public void clickButton(WebElement el){ + el.click(); + } + + @Step("Число «{0}» должно совпадать с количеством виджетов на странице") + public void shouldBeEqualsCountOfWidgets(int expectCount){ + assertEquals("Количество виджетов на странице должно совпадать с ожидаемым", expectCount, onMainPage().getWeatherWidgets().size()); + } + + @Step("Поле элемента «{0}» не должно быть пустым") + public void shouldBeNotEmpty(WebElement currElement){ + assertThat(currElement.getText(),not(isEmptyOrNullString())); + } + + @Step("Поле элемента «{0}» должно соответствовать регулярному выражению в «{1}»") + public void shouldMatchToRegExp(WebElement currElement, String regExp){ + System.out.println("Text = " + currElement.getText() + " result = " + Pattern.matches(regExp, currElement.getText())); + assertTrue("Содержиме элемента должно соответствовать шаблону", Pattern.matches(regExp, currElement.getText())); + } + + + @Step("Значение элемента «{0}» должно принадлежать интервалу «{1}» и «{2}»") + public void shouldBeBetweenMinAndMax(WebElement currElement, double d1, double d2){ + assertThat(Double.valueOf(currElement.getText()),greaterThanOrEqualTo(Math.min(d1, d2))); + assertThat(Double.valueOf(currElement.getText()),lessThanOrEqualTo(Math.max(d1, d2))); + } + + 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 index 62857d2..ad41456 100644 --- a/steps-module/src/main/java/ru/qatools/school/tp/TPInformerRule.java +++ b/steps-module/src/main/java/ru/qatools/school/tp/TPInformerRule.java @@ -14,7 +14,7 @@ */ public class TPInformerRule extends TestWatcher { - private String project; + private String project; private long start; public TPInformerRule(String project) { @@ -60,5 +60,4 @@ private void updateWithStatus(String status, Description description) { private String idFrom(Description description) { return description.getAnnotation(TestCaseId.class).value(); } - }