/* * Copyright 2010 Selenium 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.client.waiter; import java.util.Set; import java.util.concurrent.Callable; import org.openqa.selenium.Alert; import org.openqa.selenium.By; import org.openqa.selenium.NoAlertPresentException; import org.openqa.selenium.Point; import org.openqa.selenium.StaleElementReferenceException; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; public class WaitingConditions { private WaitingConditions() { // utility class } public static Callable<WebElement> elementToExist(final WebDriver driver, final String elementId) { return new Callable<WebElement>() { public WebElement call() throws Exception { return driver.findElement(By.id(elementId)); } @Override public String toString() { return String.format("element with ID %s to exist", elementId); } }; } private static abstract class ElementTextComperator implements Callable<String> { private String lastText = ""; private WebElement element; private String expectedValue; ElementTextComperator(WebElement element, String expectedValue) { this.element = element; this.expectedValue = expectedValue; } public String call() throws Exception { lastText = element.getText(); if (compareText(expectedValue, lastText)) { return lastText; } return null; } abstract boolean compareText(String expectedValue, String actualValue); @Override public String toString() { return "Element text mismatch: expected: " + expectedValue + " but was: '" + lastText + "'"; } } public static Callable<String> elementTextToEqual(final WebElement element, final String value) { return new ElementTextComperator(element, value) { @Override boolean compareText(String expectedValue, String actualValue) { return expectedValue.equals(actualValue); } }; } public static Callable<String> trimmedElementTextToEqual(final WebElement element, final String value) { return new ElementTextComperator(element, value) { @Override boolean compareText(String expectedValue, String actualValue) { return expectedValue.trim().equals(actualValue.trim()); } }; } public static Callable<String> elementTextToContain(final WebElement element, final String value) { return new ElementTextComperator(element, value) { @Override boolean compareText(String expectedValue, String actualValue) { return actualValue.contains(expectedValue); } }; } public static Callable<String> elementTextToEqual(final WebDriver driver, final By locator, final String value) { return new Callable<String>() { public String call() throws Exception { String text = driver.findElement(locator).getText(); if (value.equals(text)) { return text; } return null; } @Override public String toString() { return "element text did not equal: " + value; } }; } public static Callable<String> elementValueToEqual(final WebElement element, final String expectedValue) { return new Callable<String>() { public String lastValue = ""; public String call() throws Exception { lastValue = element.getAttribute("value"); if (expectedValue.equals(lastValue)) { return lastValue; } return null; } @Override public String toString() { return "element value to equal: " + expectedValue + " was: " + lastValue; } }; } public static Callable<Boolean> elementToBeHidden(final WebElement element) { return new Callable<Boolean>() { public Boolean call() throws Exception { try { return !element.isDisplayed(); } catch (StaleElementReferenceException e) { return true; } } }; } public static Callable<String> pageSourceToContain(final WebDriver driver, final String expectedText) { return new Callable<String>() { public String call() throws Exception { String source = driver.getPageSource(); if (source.contains(expectedText)) { return source; } return null; } @Override public String toString() { return "Page source to contain: " + expectedText; } }; } public static Callable<String> pageTitleToBe(final WebDriver driver, final String expectedTitle) { return new Callable<String>() { public String call() throws Exception { String title = driver.getTitle(); if (expectedTitle.equals(title)) { return title; } return null; } @Override public String toString() { return "title to be: " + expectedTitle; } }; } public static Callable<String> driverUrlToBe(final WebDriver driver, final String expectedUrl) { return new Callable<String>() { public String call() throws Exception { String url = driver.getCurrentUrl(); if (expectedUrl.equals(url)) { return url; } return null; } @Override public String toString() { return "url to be: " + expectedUrl; } }; } public static Callable<Point> elementLocationToBe(final WebElement element, final Point expectedLocation) { return new Callable<Point>() { private Point currentLocation = new Point(0, 0); public Point call() throws Exception { currentLocation = element.getLocation(); if (currentLocation.equals(expectedLocation)) { return expectedLocation; } return null; } @Override public String toString() { return "location to be: " + expectedLocation + " is: " + currentLocation; } }; } public static Callable<WebElement> elementSelectionToBe(final WebElement element, final boolean selected) { return new Callable<WebElement>() { public WebElement call() throws Exception { if (element.isSelected() == selected) { return element; } return null; } }; } public static Callable<Set<String>> windowHandleCountToBe(final WebDriver driver, final int count) { return new Callable<Set<String>>() { public Set<String> call() throws Exception { Set<String> handles = driver.getWindowHandles(); if (handles.size() == count) { return handles; } return null; } }; } public static Callable<Alert> alertToBePresent(final WebDriver driver) { return new Callable<Alert>() { public Alert call() throws Exception { try { return driver.switchTo().alert(); } catch (NoAlertPresentException e) { return null; } } }; } }