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..62ddb1c 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 @@ -1,5 +1,6 @@ package ru.qatools.school.tp; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import ru.yandex.qatools.allure.annotations.TestCaseId; @@ -18,13 +19,14 @@ public class ConnectedToTPTest { public TPInformerRule tms = new TPInformerRule("ruletest"); + @Ignore @Test @TestCaseId("1") public void shouldMarkCaseStatusAsPassed() throws IOException, InterruptedException { SECONDS.sleep(15); } - + @Ignore @Test @TestCaseId("2") public void shouldFail() throws IOException, InterruptedException { @@ -32,6 +34,7 @@ public void shouldFail() throws IOException, InterruptedException { fail(); } + @Ignore @Test @TestCaseId("3") public void shouldBroke() throws IOException, InterruptedException { @@ -39,6 +42,7 @@ public void shouldBroke() throws IOException, InterruptedException { throw new RuntimeException(); } + @Ignore @Test @TestCaseId("4") public void shouldBeSkipped() throws IOException, InterruptedException { 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..b3ae94a 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 @@ -1,36 +1,117 @@ package ru.qatools.school.webtests; +/* @author arrumm (Arkhipov Roman) */ + import org.junit.Before; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; +import org.openqa.selenium.Keys; 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"; + private static final String CITY = "Tomsk"; private DefaultSteps defaultSteps; @Rule public WebDriverRule webDriverRule = new WebDriverRule(); + @Rule + public TPInformerRule tms = new TPInformerRule("arrumm"); + @Before public void initSteps() { defaultSteps = new DefaultSteps(webDriverRule.getDriver()); } + + @Test + @Title("Should see add widget button on the main page (URL without params)") + @TestCaseId("6") + public void shouldSeeAddWidgetButtonOnMainPageWithoutParams() { + defaultSteps.openMainPageWithoutParams(); + defaultSteps.shouldSee(onMainPage().newCardButton()); + } + @Test - @Title("Должны видеть виджет на главной странице") + @Title("Should see widget on the main page") + @TestCaseId("7") public void shouldSeeWidgetOnMainPage() { - defaultSteps.openMainPageWithCity(MOSCOW); - defaultSteps.shouldSee(onMainPage().getWeatherWidget().get(0)); + defaultSteps.openMainPageWithCity(null); + defaultSteps.shouldSee(onMainPage().getFirstWidget()); + } + + @Test + @Title("Should see picture on widget shows weather") + @TestCaseId("11") + public void shouldSeeWeatherPicture() { + defaultSteps.openMainPageWithCity(CITY); + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getWeatherImage()); + } + + + @Test + @Title("City name at widget title should match URL") + @TestCaseId("1") + public void shouldSeeWidgetWithCityInURL() { + defaultSteps.openMainPageWithCity(CITY); + defaultSteps.shouldSeeTextInElement( + onMainPage().getFirstWidget().getWidgetTitle().getCityNameElement(), + CITY); + } + + @Test + @Title("Should see one more widget on the main page after adding") + @TestCaseId("8") + public void shouldDetectOnceMoreWidget() { + defaultSteps.openMainPageWithCity(CITY); + int widgetsQ = onMainPage().widgets().size(); + defaultSteps.clickOn(onMainPage().newCardButton()); + defaultSteps.shouldBeWidgetsQuantityOnPage(onMainPage().widgets(), widgetsQ + 1); + defaultSteps.shouldSeeAllFrom(onMainPage().widgets()); + } + + //@Ignore + @Test + @Title("Should see widget title") + @TestCaseId("12") + public void shouldSeeWidgetTitle() { + defaultSteps.openMainPageWithCity(CITY); + defaultSteps.shouldSee(onMainPage().getFirstWidget()); + } + + @Test + @Title("Should see temperature on the widget") + @TestCaseId("10") + public void shouldSeeTemperatureOnWidget() { + defaultSteps.openMainPageWithCity(CITY); + defaultSteps.shouldSee(onMainPage().getFirstWidget().getWidgetText().getTemperature()); + } + + @Test + @Title("Should see same city in the title entered by keyboard") + @TestCaseId("9") + public void shouldSeeCityInputFromKeyboard() { + defaultSteps.openMainPageWithCity(null); + defaultSteps.clickOn(onMainPage().newCardButton()); + defaultSteps.clickOn(onMainPage().getFirstWidget().getWidgetTitle().getCityNameElement()); + defaultSteps.clearIt(onMainPage().getFirstWidget().getWidgetTitle().getCityNameElement()); + defaultSteps.sendKeysTo(onMainPage().getFirstWidget().getWidgetTitle().getCityNameElement(), CITY); + defaultSteps.sendKeysTo(onMainPage().getFirstWidget().getWidgetTitle().getCityNameElement(), Keys.ENTER); + defaultSteps.shouldSeeTextInElement( + onMainPage().getFirstWidget().getWidgetTitle().getCityNameElement(), + CITY); } private MainPage onMainPage() { return new MainPage(webDriverRule.getDriver()); } -} +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index a32202a..95a9647 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,9 @@ 2.53.0 1.15 1.8.5 + + UTF-8 + 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..16521e3 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 @@ -1,6 +1,7 @@ package ru.qatools.school.pages; import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; import ru.qatools.school.pages.blocks.WeatherWidget; @@ -12,6 +13,7 @@ /** * Created by kurau. + * edited by arrumm. */ public class MainPage { @@ -21,10 +23,21 @@ public MainPage(WebDriver driver) { @Name("Список виджетов") @FindBy(css = ".card.card_md") - private List weatherWidget; + private List widgets; - public List getWeatherWidget() { - return weatherWidget; + @Name("Кнопка добавления виджета на страницу") + @FindBy(css = ".new-card") + private WebElement newCardButton; + + public List widgets() { + return widgets; + } + + public WeatherWidget getFirstWidget() { + return widgets().get(0); } + public WebElement newCardButton() { + return newCardButton; + } } 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..0fd5f8a 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 @@ -6,6 +6,7 @@ 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.Button; import ru.yandex.qatools.htmlelements.element.HtmlElement; /** @@ -33,11 +34,8 @@ 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 index 510d070..a00b4d9 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 @@ -15,6 +15,14 @@ public class WidgetText extends HtmlElement { @FindBy(css = ".weather-image") private WebElement weatherImage; + @Name("Значение температуры") + @FindBy(css = ".weather-temperature__digit") + private WebElement temperature; + + public WebElement getTemperature() { + return 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..88253f4 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 @@ -2,12 +2,25 @@ import org.openqa.selenium.Rectangle; import ru.yandex.qatools.htmlelements.element.HtmlElement; +import org.openqa.selenium.support.FindBy; +import ru.yandex.qatools.htmlelements.annotations.Name; +import ru.yandex.qatools.htmlelements.element.HtmlElement; /** * Created by kurau. + * added by arrumm (Arkhipov Roman) */ public class WidgetTitle extends HtmlElement { + @Name("Название города в заголовке") + @FindBy(css = ".inplace") + private WidgetTitle cityNameElement; + + + public HtmlElement getCityNameElement() { + return cityNameElement; + } + 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 index 418c363..1573eef 100644 --- a/steps-module/src/main/java/ru/qatools/school/rules/WebDriverRule.java +++ b/steps-module/src/main/java/ru/qatools/school/rules/WebDriverRule.java @@ -2,16 +2,24 @@ import org.junit.rules.ExternalResource; import org.openqa.selenium.WebDriver; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.firefox.FirefoxBinary; import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.firefox.FirefoxProfile; + +import java.io.File; /** * Created by kurau. + * added by arrumm (Arkhipov Roman) */ public class WebDriverRule extends ExternalResource { private WebDriver driver; protected void before() throws Throwable { + + System.setProperty("webdriver.firefox.bin", "D:\\my Programs\\firefox\\firefox.exe"); this.driver = new FirefoxDriver(); } 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..3c162c2 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,18 +3,28 @@ import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import ru.qatools.school.pages.MainPage; +import ru.qatools.school.pages.blocks.WeatherWidget; import ru.yandex.qatools.allure.annotations.Step; +import java.util.List; + import static java.lang.String.format; +import static org.hamcrest.Matchers.both; +import static org.hamcrest.Matchers.hasSize; +import static org.hamcrest.core.Every.everyItem; import static org.junit.Assert.assertThat; -import static ru.yandex.qatools.htmlelements.matchers.WebElementMatchers.isDisplayed; +import static ru.yandex.qatools.htmlelements.matchers.WebElementMatchers.*; /** * Created by kurau. + * + * @author arrumm (Arkhipov Roman) */ public class DefaultSteps { - public static final String MAIN_PAGE = "http://weather.lanwen.ru/#?cities=%s"; + private static final String MAIN_PAGE = "http://weather.lanwen.ru/#?cities=%s"; + + private static final String MAIN_PAGE_WITHOUTPARAMETERS = "http://weather.lanwen.ru/"; private WebDriver driver; @@ -27,9 +37,44 @@ public void openMainPageWithCity(String city) { driver.get(format(MAIN_PAGE, city)); } + @Step("Открываем главную страницу как обычный пользователь") + public void openMainPageWithoutParams() { + driver.get(MAIN_PAGE_WITHOUTPARAMETERS ); + } + @Step("Должны видеть на странице «{0}»") public void shouldSee(WebElement element) { - assertThat("Должны видеть элемент", element, isDisplayed()); + assertThat("Должны видеть элемент", element, both(exists()).and(isDisplayed())); + } + + @Step("Должны видеть на странице все элементы списка «{0}»") + public void shouldSeeAllFrom(List widgets) { + assertThat("Видим не все элементы", (List) widgets, everyItem(both(exists()).and(isDisplayed()))); + } + + @Step("Текст «{0}» элемента должен быть «{1}»") + public void shouldSeeTextInElement(WebElement webElement, String text) { + assertThat("Текст элемента и ожидаемый не совпадают", webElement, hasText(text)); + } + + @Step("Должен кликнуться элемент «{0}»") + public void clickOn(WebElement element) { + element.click(); + } + + @Step("Количество виджетов на странице должно быть «{0}»") + public void shouldBeWidgetsQuantityOnPage(List widgets, int widgetsQuantity) { + assertThat("Количество виджетов на странице не равно ожидаемому", widgets, hasSize(widgetsQuantity)); + } + + @Step("Send keys to element «{0}»") + public void sendKeysTo(WebElement element, CharSequence ... keys) { + element.sendKeys(keys); + } + + @Step("Clear element «{0}»") + public void clearIt(WebElement element) { + element.clear(); } private MainPage onMainPage() {