diff --git a/README.md b/README.md index 69e007d..cf0f045 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,7 @@ # Practice of automation school 2016 See all info in repo [autoschool/autoschool.github.io](https://github.com/autoschool/autoschool.github.io) + +HERE link for my repo with copy of Dockerfile + +https://github.com/theBaldSoprano/ubuntuWithCurlGit 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..19c2f12 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 @@ -23,10 +23,26 @@ public void initSteps() { } @Test - @Title("Должны видеть виджет на главной странице") + @Title("Widget on main page must be seen") public void shouldSeeWidgetOnMainPage() { defaultSteps.openMainPageWithCity(MOSCOW); - defaultSteps.shouldSee(onMainPage().getWeatherWidget().get(0)); + defaultSteps.shouldSeeWidget(onMainPage().getWeatherWidgetList().get(0)); + } + + @Test + @Title("City from widget must match city from URL") + public void shouldWidgetCityBeLinkCity() { + defaultSteps.openMainPageWithCity(MOSCOW); + defaultSteps.shouldBeWeatherOfLinkCity(MOSCOW, onMainPage().getWeatherWidgetList().get(0).getWidgetTitle().getWidgetCity()); + } + + @Test + @Title("Widget must be added after pushing \"add new widget\" button") + public void shouldWidgetBeAdded() { + defaultSteps.openMainPageWithCity(MOSCOW); + int buttonTimesPushed = 5; + defaultSteps.pushNewWeatherButtonNTimes(buttonTimesPushed); + defaultSteps.shouldSeeNumWidgets(buttonTimesPushed + 1, onMainPage().getWeatherWidgetList()); } private MainPage onMainPage() { diff --git a/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWidgetSmokeTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWidgetSmokeTest.java new file mode 100644 index 0000000..3f482cf --- /dev/null +++ b/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWidgetSmokeTest.java @@ -0,0 +1,78 @@ +package ru.qatools.school.webtests; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import ru.qatools.school.pages.MainPage; +import ru.qatools.school.rules.WebDriverRule; +import ru.qatools.school.steps.websteps.DefaultSteps; +import ru.qatools.school.tp.TPInformerRule; +import ru.yandex.qatools.allure.annotations.Title; +import ru.yandex.qatools.allure.annotations.TestCaseId; + + + +public class WeatherWidgetSmokeTest { + + public static final String CITY = "Winnipeg"; + + private MainPage onMainPage() { + return new MainPage(webDriverRule.getDriver()); + } + + private DefaultSteps defaultSteps; + + @Rule + public TPInformerRule tms = new TPInformerRule("thebaldsoprano"); + + @Rule + public WebDriverRule webDriverRule = new WebDriverRule(); + + @Before + public void initSteps() { defaultSteps = new DefaultSteps(webDriverRule.getDriver());} + + @Test + @Title("Should open main page with widget") + @TestCaseId("2") + public void shouldOpenMainPageWithWidget(){ + defaultSteps.openMainPageWithCity(CITY); + defaultSteps.shouldSeeWidget(onMainPage().getWeatherWidgetList().get(0)); + } + + @Test + @Title("Should see \"add new widget\" button") + @TestCaseId("3") + public void shouldSeeAddWidgetButton(){ + defaultSteps.openMainPageWithCity(CITY); + defaultSteps.shouldSeeAddWidgetButton(onMainPage().getNewWeatherWidgetCard().get(0)); + } + + @Test + @Title("Should see \"remove widget\" button") + @TestCaseId("4") + public void shouldSeeRemoveWidgetButton(){ + defaultSteps.openMainPageWithCity(CITY); + defaultSteps.shouldSeeRemoveWidgetButton(onMainPage().getWeatherWidgetList().get(0).getWidgetActions().getRemoveWidgetButton()); + } + + @Test + @Title("\"Add new widget\" button should add widget") + @TestCaseId("5") + public void shouldAddNewWidget(){ + defaultSteps.openMainPageWithCity(CITY); + int buttonPushes = 3; + defaultSteps.pushNewWeatherButtonNTimes(buttonPushes); + defaultSteps.shouldSeeNumWidgets(buttonPushes + 1, onMainPage().getWeatherWidgetList()); + } + + @Test + @Title("Should remove all widgets") + @TestCaseId("6") + public void shouldRemoveWidgets(){ + defaultSteps.openMainPageWithCity(CITY); + int buttonPushes = 1; //why not work on bigger clicks + defaultSteps.pushNewWeatherButtonNTimes(buttonPushes); + defaultSteps.removeNWidgets(buttonPushes+1); + defaultSteps.shouldBeNoWidgets(onMainPage().getWeatherWidgetList()); + } +} diff --git a/pom.xml b/pom.xml index a32202a..ee2a0ad 100644 --- a/pom.xml +++ b/pom.xml @@ -26,6 +26,19 @@ 1.8.5 + + + + + com.jayway.restassured + rest-assured + 2.9.0 + + + junit + junit + 4.12 + junit @@ -43,7 +56,7 @@ rest-assured 2.9.0 - + ru.yandex.qatools.allure allure-junit-adaptor 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..7a1d2a4 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 @@ -4,6 +4,7 @@ import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; import ru.qatools.school.pages.blocks.WeatherWidget; +import ru.qatools.school.pages.blocks.NewWeatherWidgetCard; import ru.yandex.qatools.htmlelements.annotations.Name; import ru.yandex.qatools.htmlelements.loader.decorator.HtmlElementDecorator; import ru.yandex.qatools.htmlelements.loader.decorator.HtmlElementLocatorFactory; @@ -19,12 +20,20 @@ public MainPage(WebDriver driver) { PageFactory.initElements(new HtmlElementDecorator(new HtmlElementLocatorFactory(driver)), this); } - @Name("Список виджетов") + @Name("Widgets list") @FindBy(css = ".card.card_md") - private List weatherWidget; + private List weatherWidgetList; - public List getWeatherWidget() { - return weatherWidget; + @Name("New weather widget card") + @FindBy(css = ".new-card") + private List newWeatherWidgetCard; + + public List getNewWeatherWidgetCard() { + return newWeatherWidgetCard; + } + + public List getWeatherWidgetList() { + return weatherWidgetList; } } diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/NewWeatherWidgetCard.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/NewWeatherWidgetCard.java new file mode 100644 index 0000000..d3912ef --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/NewWeatherWidgetCard.java @@ -0,0 +1,28 @@ +package ru.qatools.school.pages.blocks; + +import org.openqa.selenium.Rectangle; +import org.openqa.selenium.support.FindBy; +import ru.yandex.qatools.htmlelements.annotations.Name; +import ru.yandex.qatools.htmlelements.element.Button; +import ru.yandex.qatools.htmlelements.element.HtmlElement; + +/** + * Created by Gregory on 4/15/2016. + */ + + +public class NewWeatherWidgetCard extends HtmlElement { + + @Name("Add widget button") + @FindBy(css = ".new-card__symbol") + private Button addWidgetButton; + + public Button getAddWidgetButton() { + return addWidgetButton; + } + + + 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 index 3990d85..373ea3b 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; @@ -13,17 +14,17 @@ */ public class WeatherWidget extends HtmlElement { - @Name("Заголовок виджета") + @Name("Widget title") @FindBy(css = ".card-title") private WidgetTitle widgetTitle; - @Name("Текст виджета") + @Name("Widget text") @FindBy(css = ".card-text") private WidgetText widgetText; - @Name("Панель управления виджетом") + @Name("Widget actions") @FindBy(css = ".card-actions") - private WebElement actions; + private WidgetActions widgetActions; public WidgetText getWidgetText() { return widgetText; @@ -33,8 +34,8 @@ public WidgetTitle getWidgetTitle() { return widgetTitle; } - public WebElement getActions() { - return actions; + public WidgetActions getWidgetActions() { + return widgetActions; } public Rectangle getRect() { diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetActions.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetActions.java new file mode 100644 index 0000000..bb194ab --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetActions.java @@ -0,0 +1,23 @@ +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.Button; +import ru.yandex.qatools.htmlelements.element.HtmlElement; + +public class WidgetActions extends HtmlElement { + + @Name("Remove widget button") + @FindBy(css = ".remove-card.btn.btn-default") + private WebElement removeWidgetButton; + + public WebElement getRemoveWidgetButton() { + return removeWidgetButton; + } + + public Rectangle getRect() { + return null; + } +} \ No newline at end of file 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..fbf918e 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 @@ -11,7 +11,7 @@ */ public class WidgetText extends HtmlElement { - @Name("Картинка текущей погоды") + @Name("Current weather image") @FindBy(css = ".weather-image") private WebElement 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..d371988 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,12 @@ */ public class WidgetTitle extends HtmlElement { + @Name("Название города") + @FindBy(css = ".card-title__primary") + private WebElement widgetCity; + + public WebElement getWidgetCity() {return widgetCity;} + public Rectangle getRect() { return null; } 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..4d04a30 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,9 +3,18 @@ import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import ru.qatools.school.pages.MainPage; +import ru.qatools.school.pages.blocks.NewWeatherWidgetCard; +import ru.qatools.school.pages.blocks.WeatherWidget; import ru.yandex.qatools.allure.annotations.Step; +import ru.yandex.qatools.htmlelements.element.Button; + +import java.util.ArrayList; +import java.util.List; import static java.lang.String.format; +import static org.hamcrest.core.Every.everyItem; +import static org.hamcrest.core.Is.is; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import static ru.yandex.qatools.htmlelements.matchers.WebElementMatchers.isDisplayed; @@ -22,16 +31,72 @@ public DefaultSteps(WebDriver driver) { this.driver = driver; } - @Step("Открываем главную страницу для города «{0}»") + @Step("Open main page with weather of {0}") public void openMainPageWithCity(String city) { driver.get(format(MAIN_PAGE, city)); } - @Step("Должны видеть на странице «{0}»") - public void shouldSee(WebElement element) { - assertThat("Должны видеть элемент", element, isDisplayed()); + @Step("Should see weather widget") + public void shouldSeeWidget(WeatherWidget element) { + assertThat("Should see element", element, isDisplayed()); + } + + @Step("Should see \"add new widget\" button") + public void shouldSeeAddWidgetButton(NewWeatherWidgetCard element) { + assertThat("Should see button", element, isDisplayed()); + } + + @Step("Should see \"remove widget\" button") + public void shouldSeeRemoveWidgetButton(WebElement button) { + assertThat("Should see button", button, isDisplayed()); + } + + @Step("Should see all widgets") + public void shouldSeeWidget(List elements) { + assertThat("Should see elements", new ArrayList<>(elements), everyItem(isDisplayed())); + } + + @Step("Should see {0} widgets") + public void shouldSeeNumWidgets(int num, List elements) { + assertThat("Must be " + num + " elements", elements.size(), is(num)); + shouldSeeWidget(elements); + } + + @Step("Widget city should be {0}") + public void shouldBeWeatherOfLinkCity(String linkCity, WebElement widgetCity) { + assertThat("Should be same city, that was in URL", linkCity, is(widgetCity.getText())); } + @Step("Push \"add new weather widget\" button") + public void pushAddWidgetButton() { + onMainPage().getNewWeatherWidgetCard().get(0).getAddWidgetButton().click(); + } + + @Step("Push \"remove widget\" button") + public void pushRemoveWidgetButton() { + onMainPage().getWeatherWidgetList().get(0).getWidgetActions().getRemoveWidgetButton().click(); + } + + @Step("Remove {0} first widgets") + public void removeNWidgets(int n){ + for(int i=0;i widgets){ + assertEquals(0,widgets.size()); + } + + private MainPage onMainPage() { return new MainPage(driver); }