diff --git a/README.md b/README.md index 69e007d..1a14a9f 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ # Practice of automation school 2016 See all info in repo [autoschool/autoschool.github.io](https://github.com/autoschool/autoschool.github.io) +Ссылка на репозиторий с Dockerfile: https://github.com/chibert/DockerUbuntuCurlGit \ No newline at end of file diff --git a/commons-module/pom.xml b/commons-module/pom.xml new file mode 100644 index 0000000..b1372c7 --- /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.0 + + + + + diff --git a/commons-module/src/test/java/ru/qatools/school/MyFirstTest.java b/commons-module/src/test/java/ru/qatools/school/MyFirstTest.java new file mode 100644 index 0000000..7b9da2e --- /dev/null +++ b/commons-module/src/test/java/ru/qatools/school/MyFirstTest.java @@ -0,0 +1,53 @@ +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/webtests/WeatherWebTest.java b/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java new file mode 100644 index 0000000..a4c5a40 --- /dev/null +++ b/commons-module/src/test/java/ru/qatools/school/webtests/WeatherWebTest.java @@ -0,0 +1,36 @@ +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.yandex.qatools.allure.annotations.Title; + +public class WeatherWebTest { + + public static final String MOSCOW = "Moscow"; + + private DefaultSteps defaultSteps; + + @Rule + public WebDriverRule webDriverRule = new WebDriverRule(); + + @Before + public void initSteps() { + defaultSteps = new DefaultSteps(webDriverRule.getDriver()); + } + + @Test + @Title("Должны видеть виджет на главной странице") + public void shouldSeeWidgetOnMainPage() { + defaultSteps.openMainPageWithCity(MOSCOW); + defaultSteps.shouldSee(onMainPage().getWeatherWidget().get(0)); + } + + private MainPage onMainPage() { + return new MainPage(webDriverRule.getDriver()); + } + +} diff --git a/pom.xml b/pom.xml index 206b663..208222f 100644 --- a/pom.xml +++ b/pom.xml @@ -1,23 +1,112 @@ - 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 + + + + + + + + + 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..37efd44 100644 --- a/steps-module/pom.xml +++ b/steps-module/pom.xml @@ -1,18 +1,45 @@ - + 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 + + - \ No newline at end of file + 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..4d75376 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/pages/MainPage.java @@ -0,0 +1,30 @@ +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.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 { + + public MainPage(WebDriver driver) { + PageFactory.initElements(new HtmlElementDecorator(new HtmlElementLocatorFactory(driver)), this); + } + + @Name("Список виджетов") + @FindBy(css = ".card.card_md") + private List weatherWidget; + + public List getWeatherWidget() { + return weatherWidget; + } + +} 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..3990d85 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/WeatherWidget.java @@ -0,0 +1,43 @@ +package ru.qatools.school.pages.blocks; + +import org.openqa.selenium.Rectangle; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.FindBy; +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 WebElement actions; + + public WidgetText getWidgetText() { + return widgetText; + } + + public WidgetTitle getWidgetTitle() { + return widgetTitle; + } + + public WebElement getActions() { + return actions; + } + + public Rectangle getRect() { + return null; + } +} diff --git a/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetText.java b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetText.java new file mode 100644 index 0000000..510d070 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetText.java @@ -0,0 +1,25 @@ +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 kurau. + */ +public class WidgetText extends HtmlElement { + + @Name("Картинка текущей погоды") + @FindBy(css = ".weather-image") + private WebElement weatherImage; + + public WebElement getWeatherImage() { + return weatherImage; + } + + 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..8a88782 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/pages/blocks/widgetblocks/WidgetTitle.java @@ -0,0 +1,14 @@ +package ru.qatools.school.pages.blocks.widgetblocks; + +import org.openqa.selenium.Rectangle; +import ru.yandex.qatools.htmlelements.element.HtmlElement; + +/** + * Created by kurau. + */ +public class WidgetTitle extends HtmlElement { + + 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 index 043ad54..f22648c 100644 --- a/steps-module/src/main/java/ru/qatools/school/steps/UserSteps.java +++ b/steps-module/src/main/java/ru/qatools/school/steps/UserSteps.java @@ -2,11 +2,16 @@ 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() { @@ -15,9 +20,14 @@ 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 new file mode 100644 index 0000000..1425a42 --- /dev/null +++ b/steps-module/src/main/java/ru/qatools/school/steps/websteps/DefaultSteps.java @@ -0,0 +1,38 @@ +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 static java.lang.String.format; +import static org.junit.Assert.assertThat; +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"; + + private WebDriver driver; + + public DefaultSteps(WebDriver driver) { + this.driver = driver; + } + + @Step("Открываем главную страницу для города «{0}»") + public void openMainPageWithCity(String city) { + driver.get(format(MAIN_PAGE, city)); + } + + @Step("Должны видеть на странице «{0}»") + public void shouldSee(WebElement element) { + assertThat("Должны видеть элемент", element, isDisplayed()); + } + + private MainPage onMainPage() { + return new MainPage(driver); + } +}