/* * Copyright 2012-2014 eBay Software Foundation and selendroid committers. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package io.selendroid.webviewdrivertests; import io.selendroid.support.BaseAndroidTest; import org.junit.Assert; import org.junit.Test; import org.openqa.selenium.By; import org.openqa.selenium.Dimension; import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.Point; import org.openqa.selenium.WebElement; import org.openqa.selenium.remote.CapabilityType; import org.openqa.selenium.remote.DesiredCapabilities; import java.util.concurrent.TimeUnit; import static io.selendroid.client.waiter.TestWaiter.waitFor; import static io.selendroid.client.waiter.WaitingConditions.pageTitleToBe; public class WebElementInteractionTest extends BaseAndroidTest { @Test public void shouldGetTextOfElement() { openWebdriverTestPage(HtmlTestData.XHTML_TEST_PAGE); WebElement element = driver().findElements(By.name("nameTest")).get(0); Assert.assertEquals(element.getText(), "click me"); } @Test() public void shouldClickOnElement() { openWebdriverTestPage(HtmlTestData.FORM_PAGE); WebElement ckeckbox = driver().findElement(By.id("checkedchecky")); Assert.assertEquals(ckeckbox.isSelected(), true); ckeckbox.click(); Assert.assertEquals(ckeckbox.isSelected(), false); } @Test public void canClickOnLinkThatChangesUrlWithWebViewThatListensToShouldOverrideUrlLoading() { openWebdriverTestPage(HtmlTestData.TEST_CLICK_PAGE_1); driver().findElement(By.tagName("a")).click(); driver().context(NATIVE_APP); Assert.assertEquals("file:///android_asset/web/test_click_page2.html", driver().findElement(By.id("webviewLocation")).getText()); } @Test public void shouldGetAttributeOfTextField() { openWebdriverTestPage(HtmlTestData.FORM_PAGE); WebElement button = driver().findElement(By.cssSelector("input[id='inputWithText']")); Assert.assertEquals(button.getAttribute("value"), "Example text"); Assert.assertEquals(button.getAttribute("type"), "text"); } @Test public void shouldGetTagNameOfElement() { openWebdriverTestPage(HtmlTestData.FORM_PAGE); WebElement button = driver().findElement(By.cssSelector("input[id='inputWithText']")); Assert.assertEquals(button.getTagName(), "input"); //< Specs "dictate" the tag names to be lower-case } @Test public void shouldGetAttributeOfButton() { openWebdriverTestPage(HtmlTestData.FORM_PAGE); WebElement button = driver().findElement(By.cssSelector("input[id='submitButton']")); Assert.assertEquals(button.getAttribute("value"), "Hello there"); } @Test public void shouldSendKeysAndClearAnElement() { givenWebViewWithFormPageLoaded(); WebElement inputField = driver().findElement(By.id("email")); String text = "a.anyString@not.existent%.1.de"; inputField.sendKeys(text); Assert.assertEquals(inputField.getAttribute("value"), text); inputField.clear(); Assert.assertEquals(inputField.getAttribute("text"), null); } @Test public void shouldTriggerInputEventWhenSendTextWithNativeKeyboard() throws Exception { // ensure native keyboard is used // according to io.selendroid.server.handler.SendKeysToElement.safeHandle() Assert.assertTrue("Should use native keyboard", !hasNativeEventsDisabled()); givenWebViewWithFormPageLoaded(); whenSendingKeysToInputElement(); thenInputEventShouldBeTriggeredOnInputElement(); } @Test public void shouldTriggerInputEventWhenSendTextWithoutNativeKeyboard() throws Exception { givenWebDriverWithNativeEventsDisabled(); givenWebViewWithFormPageLoaded(); whenSendingKeysToInputElement(); thenInputEventShouldBeTriggeredOnInputElement(); } @Test public void shouldGetSelectedStateOfElement() { givenWebViewWithFormPageLoaded(); WebElement element = driver().findElement(By.id("checky")); Assert.assertEquals(element.isSelected(), false); element.click(); Assert.assertEquals(element.isSelected(), true); } /** * Based on the default test emulator used to verify build that has a resolution of 320x480 * pixels. */ @Test public void shouldGetSizeOfElement() { givenWebViewWithFormPageLoaded(); WebElement element = driver().findElement(By.id("checky")); Dimension size = element.getSize(); Assert.assertEquals(size.width, 19); Assert.assertEquals(size.height, 19); } /** * Based on the default test emulator used to verify build that has a resolution of 320x480 * pixels. */ @Test public void shouldGetLocationOfElement() { givenWebViewWithFormPageLoaded(); WebElement element = driver().findElement(By.id("checky")); Point location = element.getLocation(); Assert.assertTrue(location.x >= 120); Assert.assertTrue(location.y >= 100); } @Test public void shouldExecuteSimpleJavaScript() { givenWebViewWithFormPageLoaded(); String name = (String) executeJavaScript("return document.title"); Assert.assertEquals(name, "We Leave From Here"); } @Test public void shouldGetDisplayedStateOfElement() { givenWebViewWithFormPageLoaded(); WebElement element = driver().findElement(By.id("checky")); Assert.assertEquals(element.isDisplayed(), true); } @Test public void shouldGetEnbledStateOfElement() { givenWebViewWithFormPageLoaded(); WebElement element = driver().findElement(By.id("checky")); Assert.assertEquals(element.isEnabled(), true); } @Test() public void shouldSubmitAnElement() { openWebdriverTestPage(HtmlTestData.SAY_HELLO_DEMO); WebElement inputField = driver().findElement(By.id("name_input")); Assert.assertNotNull(inputField); inputField.clear(); inputField.sendKeys("Selendroid"); inputField.submit(); String name = (String) executeJavaScript("return document.title"); Assert.assertEquals(name, "Hello: Selendroid"); } private void givenWebDriverWithNativeEventsDisabled() throws Exception { closeDriver(); final DesiredCapabilities caps = getDefaultCapabilities(); caps.setCapability(CapabilityType.HAS_NATIVE_EVENTS, false); createDriver(caps); // ensure native keyboard is NOT used // according to io.selendroid.server.handler.SendKeysToElement.safeHandle() Assert.assertTrue("Should NOT use native keyboard", hasNativeEventsDisabled()); } protected void givenWebViewWithFormPageLoaded() { openWebdriverTestPage(HtmlTestData.FORM_PAGE); waitFor(pageTitleToBe(driver(), "We Leave From Here"), 10, TimeUnit.SECONDS); } protected Object executeJavaScript(String script) { return ((JavascriptExecutor) driver()).executeScript(script); } private boolean hasNativeEventsDisabled() { final Object capability = driver().getCapabilities().getCapability(CapabilityType.HAS_NATIVE_EVENTS); return Boolean.FALSE.equals(capability); } private void whenSendingKeysToInputElement() { executeJavaScript("window._input_event_triggered = false; " + "document.getElementById('email').addEventListener( " + " 'input', function(event){ " + " window._input_event_triggered = true; " + " } " + "); "); driver().findElement(By.id("email")).sendKeys("test"); } private void thenInputEventShouldBeTriggeredOnInputElement() { final Boolean isInputEventTriggered = (Boolean) executeJavaScript("return window._input_event_triggered;"); Assert.assertTrue("Input event must be triggered on sendKeys", isInputEventTriggered); } }