package integration; import com.codeborne.selenide.Configuration; import com.codeborne.selenide.ex.ElementNotFound; import com.codeborne.selenide.ex.ElementShould; import com.codeborne.selenide.ex.ElementShouldNot; import org.junit.Before; import org.junit.Test; import org.openqa.selenium.By; import org.openqa.selenium.InvalidSelectorException; import org.openqa.selenium.WebDriverException; import org.openqa.selenium.WebElement; import static com.codeborne.selenide.Condition.*; import static com.codeborne.selenide.Configuration.baseUrl; import static com.codeborne.selenide.Configuration.timeout; import static com.codeborne.selenide.Selectors.*; import static com.codeborne.selenide.Selenide.*; import static com.codeborne.selenide.WebDriverRunner.*; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.startsWith; import static org.junit.Assert.*; import static org.junit.Assume.assumeFalse; public class SelenideMethodsTest extends IntegrationTest { @Before public void openTestPageWithJQuery() { openFile("page_with_selects_without_jquery.html"); } @Test public void userCanCheckIfElementExists() { assertTrue($(By.name("domain")).exists()); assertTrue($("#theHiddenElement").exists()); assertFalse($(By.name("non-existing-element")).exists()); } @Test public void userCanCheckIfElementIsDisplayed() { assertTrue($(By.name("domain")).isDisplayed()); assertFalse($("#theHiddenElement").isDisplayed()); assertFalse($(By.name("non-existing-element")).isDisplayed()); } @Test public void userCanCheckIfElementExistsAndVisible() { assertTrue($(By.name("domain")).isDisplayed()); assertFalse($("#theHiddenElement").isDisplayed()); assertFalse($(By.name("non-existing-element")).isDisplayed()); $("#theHiddenElement").shouldBe(hidden); $("#theHiddenElement").should(disappear); $("#theHiddenElement").waitUntil(disappears, 1000); $("#theHiddenElement").should(exist); $("#theHiddenElement").shouldBe(present); $("#theHiddenElement").waitUntil(present, 1000); $(".non-existing-element").should(not(exist)); $(".non-existing-element").shouldNot(exist); $(".non-existing-element").shouldNotBe(present); $(".non-existing-element").waitUntil(not(present), 1000); $(".non-existing-element").waitWhile(present, 1000); } @Test public void userCanUseCustomPollingInterval() { $("#theHiddenElement").waitUntil(disappears, 1000, 10); $(".non-existing-element").waitWhile(present, 1000, 20); } @Test public void userCanCheckIfElementIsReadonly() { $(By.name("username")).shouldBe(readonly); $(By.name("password")).shouldNotBe(readonly); } @Test public void toStringMethodShowsElementDetails() { assertEquals("<h1>Page with selects</h1>", $("h1").toString()); assertEquals("<h2>Dropdown list</h2>", $("h2").toString()); assertEquals("<input name=\"rememberMe\" type=\"checkbox\" value=\"on\"></input>", $(By.name("rememberMe")).toString()); if (isHtmlUnit()) { assertEquals("<option value=\"livemail.ru\" selected:true>@livemail.ru</option>", $(By.name("domain")).find("option").toString()); } else { assertEquals("<option data-mailserverid=\"111\" value=\"livemail.ru\" selected:true>@livemail.ru</option>", $(By.name("domain")).find("option").toString()); } assertTrue($(byText("Want to see ajax in action?")).toString().contains("<a href=")); assertTrue($(byText("Want to see ajax in action?")).toString().contains(">Want to see ajax in action?</a>")); } @Test public void toStringShowsAllAttributesButStyleSortedAlphabetically() { if (isHtmlUnit()) { assertEquals("<div class=\"invisible-with-multiple-attributes\" id=\"gopher\" " + "onclick=\"void(0);\" onchange=\"console.log(this);\" placeholder=\"Животное\" " + "displayed:false></div>", $("#gopher").toString()); } else { assertEquals("<div class=\"invisible-with-multiple-attributes\" " + "data-animal-id=\"111\" id=\"gopher\" ng-class=\"widget\" ng-click=\"none\" " + "onchange=\"console.log(this);\" onclick=\"void(0);\" placeholder=\"Животное\" " + "displayed:false></div>", $("#gopher").toString()); } } @Test public void toStringShowsValueAttributeThatHasBeenUpdatedDynamically() { $("#age").clear(); $("#age").sendKeys("21"); if (isHtmlUnit()) { assertEquals("<input id=\"age\" name=\"age\" value=\"21\"></input>", $("#age").toString()); } else { assertEquals("<input id=\"age\" name=\"age\" type=\"text\" value=\"21\"></input>", $("#age").toString()); } } @Test public void userCanGetInnerHtmlOfElement() { assertEquals("@livemail.ru", $(byValue("livemail.ru")).innerHtml()); assertEquals("@myrambler.ru", $(byText("@myrambler.ru")).innerHtml()); assertEquals("@мыло.ру", $(byText("@мыло.ру")).innerHtml()); assertEquals("Dropdown list", $("h2").innerHtml()); if (isHtmlUnit()) { assertEquals("<span></span> L'a\n Baskerville", $("#baskerville").innerHtml().trim()); assertEquals("Username: <span class=\"name\">Bob Smith</span> Last login: <span class=\"last-login\">01.01.1970</span>", $("#status").innerHtml().trim()); } else { assertEquals("<span></span> L'a\n Baskerville", $("#baskerville").innerHtml().trim()); assertEquals("Username: " + "<span class=\"name\">Bob Smith</span> " + "Last login: <span class=\"last-login\">01.01.1970</span>", $("#status").innerHtml().trim()); } } @Test public void userCanGetTextAndHtmlOfHiddenElement() { assertEquals("видишь суслика? и я не вижу. <b>а он есть</b>!", $("#theHiddenElement").innerHtml().trim().toLowerCase()); assertEquals("Видишь суслика? И я не вижу. А он есть!", $("#theHiddenElement").innerText().trim()); } @Test public void userCanSetValueToTextfield() { $(By.name("password")).setValue("john"); $(By.name("password")).val("sherlyn"); // $(By.name("password")).shouldBe(focused); $(By.name("password")).shouldHave(value("sherlyn")); $(By.name("password")).waitUntil(hasValue("sherlyn"), 1000); assertEquals("sherlyn", $(By.name("password")).val()); } @Test public void userCanSetValueToTextArea() { Configuration.fastSetValue = false; $("#empty-text-area").val("text for textarea"); $("#empty-text-area").shouldHave(value("text for textarea")); Configuration.fastSetValue = true; $("#empty-text-area").val("another text"); $("#empty-text-area").shouldHave(value("another text")); } @Test public void userCannotSetValueLongerThanMaxLength() { $(By.name("password")).shouldHave(attribute("maxlength", "24")); $(By.name("password")).val("123456789_123456789_123456789_"); $(By.name("password")).shouldHave(value("123456789_123456789_1234")); } @Test public void valueCheckIgnoresDifferenceInInvisibleCharacters() { $(By.name("password")).setValue("john \u00a0 Malkovich"); $(By.name("password")).shouldHave(value("john Malkovich")); $("#text-area").setValue("john \u00a0 \r\nMalkovich\n"); $("#text-area").shouldHave(value("john Malkovich")); } @Test public void userCanAppendValueToTextfield() { $(By.name("password")).val("Sherlyn"); $(By.name("password")).append(" theron"); $(By.name("password")).shouldHave(value("Sherlyn theron")); assertEquals("Sherlyn theron", $(By.name("password")).val()); } @Test public void userCanPressEnter() { assertEquals(-1, url().indexOf("#submitted-form")); $(By.name("password")).val("Going to press ENTER").pressEnter(); sleep(500); assertThat(url(), containsString("#submitted-form")); } @Test public void userCanPressTab() { $("#username-blur-counter").shouldHave(text("___")); $("#username").sendKeys(" x "); $("#username").pressTab(); if (!isHtmlUnit() && !isChrome() && !isFirefox()) { // fails in HtmlUnit and Chrome for unknown reason. In Firefox, it's just unstable. $("#password").shouldBe(focused); $("#username-mirror").shouldHave(text(" x ")); $("#username-blur-counter").shouldHave(text("blur: ")); } } @Test public void userCanCheckIfElementContainsText() { assertEquals("Page with selects", $("h1").text()); assertEquals("Dropdown list", $("h2").text()); assertEquals("@livemail.ru", $(By.name("domain")).find("option").text()); if (isHtmlUnit()) { assertEquals("Radio buttons\n" + "uncheckedМастер " + "uncheckedМаргарита " + "uncheckedКот \"Бегемот\" " + "uncheckedTheodor Woland", $("#radioButtons").text()); } else { assertEquals("Radio buttons\nМастер Маргарита Кот \"Бегемот\" Theodor Woland", $("#radioButtons").text()); } $("h1").shouldHave(text("Page ")); $("h2").shouldHave(text("Dropdown list")); $(By.name("domain")).find("option").shouldHave(text("vemail.r")); $("#radioButtons").shouldHave(text("buttons"), text("Мастер"), text("Маргарита")); } @Test public void userCanCheckIfElementHasExactText() { $("h1").shouldHave(exactText("Page with selects")); $("h2").shouldHave(exactText("Dropdown list")); $(By.name("domain")).find("option").shouldHave(text("@livemail.ru")); if (isHtmlUnit()) { $("#radioButtons").shouldHave(text("Radio buttons\n" + "uncheckedМастер uncheckedМаргарита uncheckedКот \"Бегемот\" uncheckedTheodor Woland")); } else { $("#radioButtons").shouldHave(text("Radio buttons\n" + "Мастер Маргарита Кот \"Бегемот\" Theodor Woland")); } } @Test public void elementIsEmptyIfTextAndValueAreBothEmpty() { $("br").shouldBe(empty); $("h2").shouldNotBe(empty); $(By.name("password")).shouldBe(empty); $("#login").shouldNotBe(empty); $("#empty-text-area").shouldBe(empty); $("#text-area").shouldNotBe(empty); } @Test public void canUseHaveWrapper() { $("#username-blur-counter").should(have(text("___"))); } @Test public void canUseHaveWrapper_errorMessage() { thrown.expect(ElementShould.class); thrown.expectMessage(startsWith("Element should have text 'wrong-text' {#username-blur-counter}")); $("#username-blur-counter").should(have(text("wrong-text"))); } @Test public void canUseBeWrapper() { $("br").should(be(empty)); } @Test public void canUseBeWrapper_errorMessage() { thrown.expect(ElementShould.class); thrown.expectMessage(startsWith("Element should be disabled {#username-blur-counter}")); $("#username-blur-counter").should(be(disabled)); } @Test public void userCanGetOriginalWebElement() { WebElement selenideElement = $(By.name("domain")).toWebElement(); WebElement seleniumElement = getWebDriver().findElement(By.name("domain")); assertSame(seleniumElement.getClass(), selenideElement.getClass()); assertEquals(seleniumElement.getTagName(), selenideElement.getTagName()); assertEquals(seleniumElement.getText(), selenideElement.getText()); } @Test public void userCanFollowLinks() { $(By.linkText("Want to see ajax in action?")).followLink(); assertTrue("Actual URL is: " + url(), url().contains("long_ajax_request.html")); } @Test public void userCanUseSeleniumActions() { $(By.name("rememberMe")).shouldNotBe(selected); actions().click($(By.name("rememberMe"))).build().perform(); $(By.name("rememberMe")).shouldBe(selected); } @Test public void shouldNotThrowsElementNotFound() { thrown.expect(ElementNotFound.class); thrown.expectMessage("Element not found {by text: Unexisting text}"); $(byText("Unexisting text")).shouldNotBe(hidden); } @Test public void shouldNotThrowsElementMatches() { thrown.expect(ElementShouldNot.class); thrown.expectMessage("Element should not have css class 'firstname' {by text: Bob}"); $(byText("Bob")).shouldNotHave(cssClass("firstname")); } @Test public void userCanCheckCssClass() { $(byText("Bob")).shouldHave(cssClass("firstname")); $(byText("Dilan")).shouldHave(cssClass("lastname")); $(byText("25")).shouldHave(cssClass("age")); $(byText("First name")).shouldNotHave(cssClass("anything")); } @Test public void userCanGetPageTitle() { assertEquals("Test page :: with selects, but withour JQuery", title()); } @Test public void userCanCheckElementId() { $("#multirowTable").shouldHave(id("multirowTable")); $("#login").shouldHave(id("login")); $(By.id("theHiddenElement")).shouldHave(id("theHiddenElement")); $("h3").shouldHave(id("username-mirror")); } @Test public void userCanCheckElementName() { $("select").shouldHave(name("domain")); $(by("type", "radio")).shouldHave(name("me")); $(by("type", "checkbox")).shouldHave(name("rememberMe")); $("#username").shouldHave(name("username")); } @Test public void userCanCheckElementType() { $("#login").shouldHave(type("submit")); $(By.name("me")).shouldHave(type("radio")); $(By.name("rememberMe")).shouldHave(type("checkbox")); } @Test public void userCanFindFirstMatchingSubElement() { $(By.name("domain")).find("option").shouldHave(value("livemail.ru")); $(By.name("domain")).$("option").shouldHave(value("livemail.ru")); } @Test public void findWaitsUntilParentAppears() { $("#container").find("#dynamic-content2").shouldBe(visible); } @Test public void findWaitsUntilElementMatchesCondition() { $("#dynamic-content-container").find("#dynamic-content2").shouldBe(visible); } @Test public void userCanListMatchingSubElements() { $("#multirowTable").findAll(byText("Chack")).shouldHaveSize(2); $("#multirowTable").$$(byText("Chack")).shouldHaveSize(2); $("#multirowTable tr").findAll(byText("Chack")).shouldHaveSize(1); $("#multirowTable tr").$$(byText("Chack")).shouldHaveSize(1); } @Test public void errorMessageShouldContainUrlIfBrowserFailedToOpenPage() { try { baseUrl = "http://localhost:8080"; open("www.yandex.ru"); } catch (WebDriverException e) { assertTrue(e.getAdditionalInformation().contains("selenide.baseUrl: http://localhost:8080")); assertTrue(e.getAdditionalInformation().contains("selenide.url: http://localhost:8080www.yandex.ru")); } } @Test public void userCanRightClickOnElement() { $(By.name("password")).contextClick(); $("#login").contextClick().click(); $(By.name("domain")).find("option").click(); $(By.name("domain")).find("option").contextClick(); } @Test public void userCanDoubleClickOnElement() { openFile("page_with_jquery.html"); $("#double-clickable-button") .shouldHave(value("double click me")) .shouldBe(enabled); $("#double-clickable-button") .doubleClick() .shouldHave(value("do not click me anymore")) .shouldBe(disabled); $("h2").shouldHave(text("Double click worked")); } @Test public void toStringShowsCurrentValue_evenIfItWasDynamicallyChanged() { openFile("page_with_jquery.html"); assertThat($("#double-clickable-button").toString(), containsString("value=\"double click me\"")); $("#double-clickable-button").doubleClick(); assertThat($("#double-clickable-button").toString(), containsString("value=\"do not click me anymore\"")); } @Test public void userCanCheckConditions() { assertTrue($("#login").is(visible)); assertTrue($("#multirowTable").has(text("Chack"))); assertFalse($(".non-existing-element").has(text("Ninja"))); assertFalse($("#multirowTable").has(text("Ninja"))); } @Test(expected = InvalidSelectorException.class) public void checkFailsForInvalidSelector() { $(By.xpath("//input[:attr='al]")).is(visible); } @Test public void shouldMethodsMayContainOptionalMessageThatIsPartOfErrorMessage_1() { timeout = 100L; thrown.expect(ElementShould.class); thrown.expectMessage("because it's wrong text"); $("h1").should(text("Some wrong test").because("it's wrong text")); } @Test public void shouldMethodsMayContainOptionalMessageThatIsPartOfErrorMessage_2() { timeout = 100L; thrown.expect(ElementShould.class); thrown.expectMessage("because it's wrong text"); $("h1").shouldHave(text("Some wrong test").because("it's wrong text")); } @Test public void shouldMethodsMayContainOptionalMessageThatIsPartOfErrorMessage_3() { timeout = 100L; thrown.expect(ElementShould.class); thrown.expectMessage("because it's wrong text"); $("h1").shouldBe(text("Some wrong test").because("it's wrong text")); } @Test public void shouldNotMethodsMayContainOptionalMessageThatIsPartOfErrorMessage() { timeout = 100L; thrown.expect(ElementShouldNot.class); thrown.expectMessage("because it's wrong text"); $("h1").shouldNot(text("Page with selects").because("it's wrong text")); try { $("h1").shouldNotHave(text("Page with selects").because("it's wrong text")); fail("exception expected"); } catch (ElementShouldNot expected) { assertTrue(expected.getMessage().contains("because it's wrong text")); } try { $("h1").shouldNotBe(text("Page with selects").because("it's wrong text")); fail("exception expected"); } catch (ElementShouldNot expected) { assertTrue(expected.getMessage().contains("because it's wrong text")); } } @Test public void waitWhileMethodMayContainOptionalMessageThatIsPartOfErrorMessage() { try { $("h1").waitWhile(visible.because("we expect it do disappear"), 100); fail("exception expected"); } catch (ElementShouldNot expected) { assertTrue("Actual error: " + expected.getMessage(), expected.getMessage().contains("because we expect it do disappear")); } } @Test public void waitUntilMethodMayContainOptionalMessageThatIsPartOfErrorMessage() { try { $("h1").waitUntil(hidden.because("it's sensitive information"), 100); fail("exception expected"); } catch (ElementShould expected) { assertTrue("Actual error: " + expected.getMessage(), expected.getMessage().contains("because it's sensitive information")); } } @Test public void canZoomInAndOut() { assumeFalse(isPhantomjs()); int initialX = $(By.name("domain")).getLocation().getX(); zoom(1.1); assertBetween("", $(By.name("domain")).getLocation().getY(), 140, 160); assertEquals(initialX, $(By.name("domain")).getLocation().getX()); zoom(2.0); assertBetween("", $(By.name("domain")).getLocation().getY(), 240, 260); assertEquals(initialX, $(By.name("domain")).getLocation().getX()); zoom(0.5); assertBetween("", $(By.name("domain")).getLocation().getY(), 70, 80); assertEquals(initialX, $(By.name("domain")).getLocation().getX()); } static void assertBetween(String message, int n, int lower, int upper) { if (!isHtmlUnit()) { assertTrue(message + n + " should be between " + lower + " and " + upper, n >= lower); assertTrue(message + n + " should be between " + lower + " and " + upper, n <= upper); } } }