All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.qmetry.qaf.automation.ui.webdriver.QAFExtendedWebElement Maven / Gradle / Ivy

Go to download

Functional test automation framework for web, mobile-web, mobile native and web-service

There is a newer version: 4.0.0-RC3
Show newest version
/*******************************************************************************
 * QMetry Automation Framework provides a powerful and versatile platform to author 
 * Automated Test Cases in Behavior Driven, Keyword Driven or Code Driven approach
 *                
 * Copyright 2016 Infostretch Corporation
 *
 * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
 *
 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
 * OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
 *
 * You should have received a copy of the GNU General Public License along with this program in the name of LICENSE.txt in the root folder of the distribution. If not, see https://opensource.org/licenses/gpl-3.0.html
 *
 * See the NOTICE.TXT file in root folder of this source files distribution 
 * for additional information regarding copyright ownership and licenses
 * of other open source software / files used by QMetry Automation Framework.
 *
 * For any inquiry or need additional information, please contact [email protected]
 *******************************************************************************/

package com.qmetry.qaf.automation.ui.webdriver;

import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.json.JSONException;
import org.openqa.selenium.By;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.Point;
import org.openqa.selenium.StaleElementReferenceException;
import org.openqa.selenium.WebDriverException;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.remote.RemoteWebElement;
import org.openqa.selenium.remote.Response;
import org.openqa.selenium.remote.internal.JsonToWebElementConverter;
import org.testng.SkipException;

import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.qmetry.qaf.automation.core.AutomationError;
import com.qmetry.qaf.automation.core.ConfigurationManager;
import com.qmetry.qaf.automation.core.MessageTypes;
import com.qmetry.qaf.automation.core.QAFListener;
import com.qmetry.qaf.automation.keys.ApplicationProperties;
import com.qmetry.qaf.automation.ui.WebDriverCommandLogger;
import com.qmetry.qaf.automation.ui.WebDriverTestBase;
import com.qmetry.qaf.automation.ui.util.QAFWebElementExpectedConditions;
import com.qmetry.qaf.automation.ui.util.QAFWebElementWait;
import com.qmetry.qaf.automation.ui.webdriver.CommandTracker.Stage;
import com.qmetry.qaf.automation.util.JSONUtil;
import com.qmetry.qaf.automation.util.LocatorUtil;
import com.qmetry.qaf.automation.util.StringMatcher;

/**
 * com.qmetry.qaf.automation.ui.webdriver.extended.QAFExtendedWebElement.java
 * 
 * @see ElementMetaDataListener 
 * @see ApplicationProperties#ELEMENT_GLOBAL_METADATA
 * @see ApplicationProperties#ELEMENT_ATTACH_DEFAULT_LISTENER 
 * @see ApplicationProperties#QAF_LISTENERS
 * @author chirag.jayswal
 */
public class QAFExtendedWebElement extends RemoteWebElement implements QAFWebElementCommandListener, QAFWebElement {
	private static final Map GLOBAL_METADATA = JSONUtil
			.toMap(ApplicationProperties.ELEMENT_GLOBAL_METADATA.getStringVal("{'scroll':'OnFail'}"));
	protected final Log logger = LogFactory.getLog(getClass());
	transient protected By by;
	protected QAFExtendedWebElement parentElement;
	protected String locator;
	private Map metaData;
	protected boolean cacheable = false;
	private Set listners = new LinkedHashSet();
	private String description;

	protected QAFExtendedWebElement(QAFExtendedWebDriver driver) {
		setParent(driver);
		id = "-1";
		metaData = new TreeMap(String.CASE_INSENSITIVE_ORDER);// new HashMap();
		metaData.putAll(GLOBAL_METADATA);
		
		//default value true to avoid issue for direct initialization by driver.
		cacheable = metaData.containsKey("cacheable") ? (Boolean) metaData.get("cacheable") : true;
		listners.add(driver.getReporter());
		if(ApplicationProperties.ELEMENT_ATTACH_DEFAULT_LISTENER.getBoolenVal(true)){
			listners.add(new ElementMetaDataListener());
		}

		try {
			setFileDetector(parent.getFileDetector());

		} catch (Exception e) {
			logger.debug("FileDetector not found!", e);
		}
		String[] listners = ConfigurationManager.getBundle()
				.getStringArray(ApplicationProperties.WEBELEMENT_COMMAND_LISTENERS.key);
		for (String listenr : listners) {
			registerListeners(listenr);
		}
		listners = ConfigurationManager.getBundle().getStringArray(ApplicationProperties.QAF_LISTENERS.key);
		for (String listener : listners) {
			try {
				QAFListener cls = (QAFListener) Class.forName(listener).newInstance();
				if (QAFWebElementCommandListener.class.isAssignableFrom(cls.getClass()))
					this.listners.add((QAFWebElementCommandListener) cls);
			} catch (Exception e) {
				logger.error("Unable to register class as element listener:  " + listener, e);
			}
		}
	}

	/**
	 * 
	 * @param by
	 */
	public QAFExtendedWebElement(By by) {
		this(new WebDriverTestBase().getDriver(), by);
	}

	/**
	 * @param locator
	 *            : locator or json string in {locator:'id=eleId';desc:'sample
	 *            element'} format. locator can be selenium-1 style, for ex:
	 *            id=eleId or name=eleName ...
	 */
	public QAFExtendedWebElement(String locator) {
		this((By) null);
		initLoc(locator);
	}

	/**
	 * 
	 * @param parentElement
	 * @param locator
	 */
	public QAFExtendedWebElement(QAFExtendedWebElement parentElement, String locator) {
		this(parentElement, (By) null);
		initLoc(locator);
	}

	/**
	 * 
	 * @param driver
	 * @param by
	 */
	public QAFExtendedWebElement(QAFExtendedWebDriver driver, By by) {
		this(driver, by, false);
	}

	/**
	 * 
	 * @param driver
	 * @param by
	 * @param cacheable
	 */
	public QAFExtendedWebElement(QAFExtendedWebDriver driver, By by, boolean cacheable) {
		this(driver);
		this.by = by;
		this.cacheable = cacheable;
	}

	public QAFExtendedWebElement(QAFExtendedWebElement parentElement, By by) {
		this(parentElement.getWrappedDriver(), by, parentElement.cacheable);
		this.parentElement = parentElement;
	}

	protected void setBy(By by) {
		this.by = by;
	}

	protected By getBy() {
		if ((null == by) && StringUtils.isNotBlank(locator)) {
			by = LocatorUtil.getBy(locator);
		}

		return by;
	}

	/**
	 * @return
	 */

	/**
	 * @param label
	 *            optional element description
	 * @return description of the element that is provided as optional argument
	 *         of method or with locator string otherwise. For ex:
	 *         {locator:'id=eleId';desc:'sample element'} it will consider desc
	 *         as element description
	 */
	public String getDescription(String... label) {
		return (label != null) && (label.length > 0) ? label[0]
				: StringUtils.isBlank(description) ? this.toString() : description;
	}

	public void setDescription(String description) {
		if (JSONUtil.isValidJsonString(description)) {
			try {
				Map map = JSONUtil.toMap(description);
				this.description = map.containsKey("desc") ? (String) map.get("desc")
						: map.containsKey("description") ? (String) map.get("description") : "";
			} catch (JSONException e) {
				logger.error(e.getMessage());
			}
		} else {
			this.description = description;
		}
	}

	protected void initLoc(String locator) {
		this.locator = ConfigurationManager.getBundle().getString(locator, locator);
		this.locator = ConfigurationManager.getBundle().getSubstitutor().replace(this.locator);
		if (JSONUtil.isValidJsonString(this.locator)) {
			try {
				metaData.putAll(JSONUtil.toMap(this.locator));

				description = metaData.containsKey("desc") ? (String) metaData.get("desc")
						: metaData.containsKey("description") ? (String) metaData.get("description") : "";
				cacheable = metaData.containsKey("cacheable") ? (Boolean) metaData.get("cacheable") : false;
				if (metaData.containsKey("child") && !(Boolean) metaData.get("child")) {
					parentElement = null;
				}
			} catch (JSONException e) {
				logger.error(e.getMessage());
			}
		}
	}

	@SuppressWarnings({ "unchecked" })
	@Override
	protected Response execute(String command, Map parameters) {
		CommandTracker commandTracker = new CommandTracker(command, parameters);
		try {
			load();
			@SuppressWarnings("rawtypes")
			Map m = new HashMap();
			m.putAll(parameters);
			m.put("id", id);
			commandTracker.setParameters(m);
			beforeCommand(this, commandTracker);
			// already handled in before command?
			if (commandTracker.getResponce() == null) {
				commandTracker.setStartTime(System.currentTimeMillis());
				commandTracker.setResponce(((QAFExtendedWebDriver) parent).executeWitoutLog(commandTracker.getCommand(),
						commandTracker.getParameters()));
				commandTracker.setEndTime(System.currentTimeMillis());

			}
			afterCommand(this, commandTracker);
			
			if ((null != getBy()) && !cacheable) {
				id = "-1";
			}
		} catch (RuntimeException e) {
			commandTracker.setException(e);
			onFailure(this, commandTracker);
		}

		if (commandTracker.hasException()) {
			if (commandTracker.retry) {
				commandTracker.setResponce(((QAFExtendedWebDriver) parent).executeWitoutLog(commandTracker.getCommand(),
						commandTracker.getParameters()));
				commandTracker.setException(null);
				commandTracker.setEndTime(System.currentTimeMillis());
			} else {
				throw commandTracker.getException();
			}
		}
		return commandTracker.getResponce();
	}

	protected Response executeWitoutLog(String command, Map parameters){
		return ((QAFExtendedWebDriver) parent).executeWitoutLog(command,
				parameters);
	}
	@Override
	public void setId(String id) {
		super.setId(id);
	}

	private void load() {
		if ((id == "-1")) {
			if (parentElement == null) {
				((QAFExtendedWebDriver) parent).load(this);
			} else {
				setId(parentElement.findElement(getBy()).id);
			}
		}
	}

	@Override
	public String getId() {
		if ((id == null) || (id == "-1")) {
			load();
		}
		return id;
	}

	@Override
	public Point getLocation() {
		id = getId();
		return super.getLocation();
	}

	@Override
	public String getCssValue(String propertyName) {
		Response response = execute("getElementValueOfCssProperty",
				ImmutableMap.of("id", id, "propertyName", propertyName));
		return ((String) response.getValue());
	}

	@Override
	public boolean isDisplayed() {
		id = getId();
		return super.isDisplayed();
	}

	@Override
	public Dimension getSize() {
		id = getId();
		return super.getSize();
	}

	public boolean isPresent() {
		if (StringUtils.isNotBlank(id) && id != "-1" && cacheable) {
			return true;
		}
		try {
			List eles = null;
			if ((parentElement != null)) {
				if (!parentElement.isPresent()) {
					return false;
				}
				eles = parentElement.findElements(getBy());

			} else {
				eles = getWrappedDriver().findElements(getBy());
			}
			if ((eles != null) && (eles.size() > 0)) {
				if (StringUtils.isBlank(id)) {
					id = ((QAFExtendedWebElement) eles.get(0)).id;
				}
				return true;
			}
			return false;
		} catch (WebDriverException e) {
			return false;
		}
	}

	@Override
	public int hashCode() {
		return getId().hashCode();
	}

	@Override
	public String toString() {
		return null == getBy() ? id != "-1" ? "id: " + id : "New WebElement" : getBy().toString();
	}

	public WebDriverCommandLogger getReporter() {
		return getWrappedDriver().getReporter();
	}

	@Override
	public QAFExtendedWebDriver getWrappedDriver() {

		return (QAFExtendedWebDriver) parent;
	}

	public static class JsonConvertor extends JsonToWebElementConverter {
		private final RemoteWebDriver driver;

		public JsonConvertor(QAFExtendedWebDriver driver) {
			super(driver);
			this.driver = driver;
		}

		@SuppressWarnings("unchecked")
		@Override
		public Object apply(Object result) {
			if (result instanceof Collection) {
				Collection results = (Collection) result;
				return Lists.newArrayList(Iterables.transform(results, this));
			}

			result = super.apply(result);
			if (result instanceof RemoteWebElement) {
				if (!(result instanceof QAFExtendedWebElement)) {
					QAFExtendedWebElement ele = newRemoteWebElement();
					ele.setId(((RemoteWebElement) result).getId());
					return ele;
				}
			}
			return result;
		}

		@Override
		protected QAFExtendedWebElement newRemoteWebElement() {
			String elemImpl = ConfigurationManager.getBundle().getString("default.element.impl");
			if(StringUtils.isBlank(elemImpl)){
				QAFExtendedWebElement toReturn = new QAFExtendedWebElement((QAFExtendedWebDriver) driver);
				return toReturn;
			}
			try {
				Class cls = Class.forName(ConfigurationManager.getBundle().getString("default.element.impl", QAFExtendedWebElement.class.getCanonicalName()));
				Constructor con = cls.getDeclaredConstructor(QAFExtendedWebDriver.class);
				con.setAccessible(true);
				Object toReturn = con.newInstance(driver);
				return (QAFExtendedWebElement) toReturn;
			} catch (ClassNotFoundException e) {
				throw new AutomationError("Unable to find class "+elemImpl+" to create element. ", e);
			} catch (Exception e) {
				throw new AutomationError("Unable to create element using "+elemImpl+". Make sure it is subclass of QAFExtendedWebElement and has consrtuctor excepting QAFExtendedWebDriver argument", e);
			}
		}
	}

	@Override
	public QAFExtendedWebElement findElement(By by) {
		load();
		QAFExtendedWebElement ele = (QAFExtendedWebElement) super.findElement(by);
		ele.parentElement = this;
		return ele;
	}

	public QAFExtendedWebElement findElement(String loc) {
		QAFExtendedWebElement ele = findElement(LocatorUtil.getBy(loc));
		ele.initLoc(loc);
		return ele;
	}

	public List findElements(By by) {
		try {
			return super.findElements(by);
		} catch (Exception e) {
			// may be this element present earlier and now not present so
			// returning element not found exception instead of returning empty
			// array.
			return new ArrayList();
		}
	}

	@SuppressWarnings("unchecked")
	public List findElements(String loc) {
		return (List) (List) findElements(LocatorUtil.getBy(loc));
	}
	
	@SuppressWarnings("unchecked")
	public  List findElements(String loc, Class t) {
		List eles = findElements(loc);
		List objs = new ArrayList();
		for (QAFWebElement ele : eles) {
			T obj = (T) ComponentFactory.getObject(t, loc, this, this);
			obj.setId(((QAFExtendedWebElement) ele).getId());
			obj.parentElement = this;
			obj.cacheable = true;
			objs.add(obj);
		}
		return objs;
	}

	@SuppressWarnings("unchecked")
	public  T findElement(String loc, Class t) {
		T obj = (T) ComponentFactory.getObject(t, loc, this, this);
		obj.parentElement = this;
		obj.getId();
		return obj;
	}

	@Override
	public void afterCommand(QAFExtendedWebElement element, CommandTracker commandTracker) {
		commandTracker.setStage(Stage.executingAfterMethod);

		for (QAFWebElementCommandListener listener : listners) {
			listener.afterCommand(element, commandTracker);
		}
	}

	@Override
	public void beforeCommand(QAFExtendedWebElement element, CommandTracker commandTracker) {
		commandTracker.setStage(Stage.executingBeforeMethod);
		for (QAFWebElementCommandListener listener : listners) {
			listener.beforeCommand(element, commandTracker);
		}

	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	@Override
	public void onFailure(QAFExtendedWebElement element, CommandTracker commandTracker) {
		commandTracker.setStage(Stage.executingOnFailure);
		commandTracker.setEndTime(System.currentTimeMillis());

		if (commandTracker.getException() instanceof StaleElementReferenceException) {
			logger.warn(commandTracker.getException().getMessage());
			element.setId("-1");
			Map parameters = commandTracker.getParameters();
			parameters.put("id", element.getId());
			commandTracker.setException(null);
			commandTracker.setStage(Stage.executingMethod);
			element.execute(commandTracker.command, parameters);
			commandTracker.setEndTime(System.currentTimeMillis());
		}
		for (QAFWebElementCommandListener listener : listners) {
			// whether handled previous listener
			if (!commandTracker.hasException()) {
				break;
			}
			logger.debug("Executing listener " + listener.getClass().getName());
			listener.onFailure(element, commandTracker);
		}
	}

	// Wait service
	public void waitForVisible(long... timeout) {
		new QAFWebElementWait(this, timeout)
				.ignoring(RuntimeException.class, NoSuchElementException.class, StaleElementReferenceException.class)
				.withMessage("Wait time out for " + getDescription() + " to be visible")
				.until(QAFWebElementExpectedConditions.elementVisible());
	}

	public void waitForNotVisible(long... timeout) {
		new QAFWebElementWait(this, timeout).ignoring(RuntimeException.class)
				.until(QAFWebElementExpectedConditions.elementNotVisible());

	}

	public void waitForDisabled(long... timeout) {
		new QAFWebElementWait(this, timeout).ignoring(RuntimeException.class, NoSuchElementException.class)
				.withMessage("Wait time out for " + getDescription() + " to be disabled")
				.until(QAFWebElementExpectedConditions.elementDisabled());
	}

	public void waitForEnabled(long... timeout) {
		new QAFWebElementWait(this, timeout).ignoring(NoSuchElementException.class, RuntimeException.class)
				.withMessage("Wait time out for " + getDescription() + " to be enabled")
				.until(QAFWebElementExpectedConditions.elementEnabled());
	}

	public void waitForPresent(long... timeout) {
		new QAFWebElementWait(this, timeout).ignoring(NoSuchElementException.class, RuntimeException.class)
				.withMessage("Wait time out for " + getDescription() + " to be present")
				.until(QAFWebElementExpectedConditions.elementPresent());
	}

	public void waitForNotPresent(long... timeout) {
		new QAFWebElementWait(this, timeout).withMessage("Wait time out for " + getDescription() + " to not be present")
				.until(QAFWebElementExpectedConditions.elementNotPresent());
	}

	@Override
	public void waitForText(StringMatcher matcher, long... timeout) {
		new QAFWebElementWait(this, timeout).ignoring(NoSuchElementException.class, RuntimeException.class)
				.withMessage("Wait time out for " + getDescription() + " text " + matcher.toString())
				.until(QAFWebElementExpectedConditions.elementTextEq(matcher));
	}

	public void waitForText(String text, long... timeout) {
		new QAFWebElementWait(this, timeout).ignoring(NoSuchElementException.class, RuntimeException.class)
				.withMessage("Wait time out for " + getDescription() + " text " + text)
				.until(QAFWebElementExpectedConditions.elementTextEq(text));
	}

	public void waitForNotText(StringMatcher matcher, long... timeout) {
		new QAFWebElementWait(this, timeout).ignoring(NoSuchElementException.class, RuntimeException.class)
				.withMessage("Wait time out for " + getDescription() + " text not: " + matcher.toString())
				.until(QAFWebElementExpectedConditions.elementTextNotEq(matcher));
	}

	public void waitForNotText(String text, long... timeout) {
		new QAFWebElementWait(this, timeout).ignoring(NoSuchElementException.class, RuntimeException.class)
				.withMessage("Wait time out for " + getDescription() + " text not: " + text)
				.until(QAFWebElementExpectedConditions.elementTextNotEq(text));
	}

	public void waitForValue(Object value, long... timeout) {
		new QAFWebElementWait(this, timeout).ignoring(NoSuchElementException.class, RuntimeException.class)
				.withMessage("Wait time out for " + getDescription() + " value" + value)
				.until(QAFWebElementExpectedConditions.elementValueEq(value));
	}

	public void waitForNotValue(Object value, long... timeout) {
		new QAFWebElementWait(this, timeout).ignoring(NoSuchElementException.class, RuntimeException.class)
				.withMessage("Wait time out for " + getDescription() + " value not " + value)
				.until(QAFWebElementExpectedConditions.elementValueNotEq(value));
	}

	public void waitForSelected(long... timeout) {
		new QAFWebElementWait(this, timeout).ignoring(NoSuchElementException.class, RuntimeException.class)
				.withMessage("Wait time out for " + getDescription() + " to be selected")
				.until(QAFWebElementExpectedConditions.elementSelected());
	}

	public void waitForNotSelected(long... timeout) {
		new QAFWebElementWait(this, timeout).ignoring(NoSuchElementException.class, RuntimeException.class)
				.withMessage("Wait time out for " + getDescription() + " to not selected")
				.until(QAFWebElementExpectedConditions.elementNotSelected());
	}

	public void waitForAttribute(String name, String value, long... timeout) {
		new QAFWebElementWait(this, timeout).ignoring(NoSuchElementException.class, RuntimeException.class)
				.withMessage("Wait time out for " + getDescription() + " " + name + " = " + value)
				.until(QAFWebElementExpectedConditions.elementAttributeValueEq(name, value));
	}

	@Override
	public void waitForAttribute(String attr, StringMatcher value, long... timeout) {
		new QAFWebElementWait(this, timeout).ignoring(NoSuchElementException.class, RuntimeException.class)
				.withMessage("Wait time out for " + getDescription() + " " + attr + " = " + value)
				.until(QAFWebElementExpectedConditions.elementAttributeValueEq(attr, value));
	}

	public void waitForNotAttribute(String name, String value, long... timeout) {
		new QAFWebElementWait(this, timeout).ignoring(NoSuchElementException.class, RuntimeException.class)
				.withMessage("Wait time out for " + getDescription() + " " + name + "!=" + value)
				.until(QAFWebElementExpectedConditions.elementAttributeValueNotEq(name, value));
	}

	@Override
	public void waitForNotAttribute(String attr, StringMatcher value, long... timeout) {
		new QAFWebElementWait(this, timeout).ignoring(NoSuchElementException.class, RuntimeException.class)
				.withMessage("Wait time out for " + getDescription() + " " + attr + " = " + value)
				.until(QAFWebElementExpectedConditions.elementAttributeValueNotEq(attr, value));
	}

	public void waitForCssClass(String name, long... timeout) {
		new QAFWebElementWait(this, timeout).ignoring(NoSuchElementException.class, RuntimeException.class)
				.withMessage("Wait time out for " + getDescription() + " have css class " + name)
				.until(QAFWebElementExpectedConditions.elementHasCssClass(name));
	}

	public void waitForNotCssClass(String name, long... timeout) {
		new QAFWebElementWait(this, timeout).ignoring(NoSuchElementException.class, RuntimeException.class)
				.withMessage("Wait time out for " + getDescription() + " have not css class" + name)
				.until(QAFWebElementExpectedConditions.elementHasNotCssClass(name));
	}

	public void waitForCssStyle(String name, String value, long... timeout) {
		new QAFWebElementWait(this, timeout).ignoring(NoSuchElementException.class, RuntimeException.class)
				.withMessage("Wait time out for " + getDescription() + " have css style " + name + "=" + value)
				.until(QAFWebElementExpectedConditions.elementCssPropertyValueEq(name, value));
	}

	public void waitForNotCssStyle(String name, String value, long... timeout) {
		new QAFWebElementWait(this, timeout).ignoring(NoSuchElementException.class, RuntimeException.class)
				.withMessage("Wait time out for " + getDescription() + " have css style " + name + "!=" + value)
				.until(QAFWebElementExpectedConditions.elementCssPropertyValueNotEq(name, value));
	}

	public void waitForCssStyleColor(String name, String value, long... timeout) {
		new QAFWebElementWait(this, timeout).ignoring(NoSuchElementException.class, RuntimeException.class)
				.withMessage("Wait time out for " + getDescription() + " have css style " + name + "=" + value)
				.until(QAFWebElementExpectedConditions.elementCssColorPropertyValueEq(name, value));
	}

	public void waitForNotCssStyleColor(String name, String value, long... timeout) {
		new QAFWebElementWait(this, timeout).ignoring(NoSuchElementException.class, RuntimeException.class)
				.withMessage("Wait time out for " + getDescription() + " have css style " + name + "!=" + value)
				.until(QAFWebElementExpectedConditions.elementCssColorPropertyValueNotEq(name, value));
	}
	/**
	 * will only report if failed
	 * 
	 * @param label
	 * @return
	 */
	private boolean ensurePresent(String... label) {
		boolean outcome = true;
		String msgFor = getDescription(label);
		try {
			waitForPresent();
		} catch (Exception e) {
			outcome = false;
			report("present", outcome, msgFor);
		}

		return outcome;
	}

	// verifications
	public boolean verifyPresent(String... label) {
		boolean outcome = ensurePresent(label);

		if (outcome) {
			// Success message
			String msgFor = getDescription(label);
			report("present", outcome, msgFor);
		}

		return outcome;
	}

	/**
	 * @param label
	 *            to provide in message
	 * @return outcome of verification
	 */
	public boolean verifyNotPresent(String... label) {
		boolean outcome = true;
		String msgFor = getDescription(label);
		try {
			waitForNotPresent();
		} catch (Exception e) {
			outcome = false;

		}
		report("notpresent", outcome, msgFor);
		return outcome;
	}

	public boolean verifyVisible(String... label) {
		boolean outcome = true;
		String msgFor = getDescription(label);
		try {
			waitForVisible();
		} catch (Exception e) {
			outcome = false;

		}
		report("visible", outcome, msgFor);
		return outcome;
	}

	public boolean verifyNotVisible(String... label) {
		boolean outcome = true;
		String msgFor = getDescription(label);
		try {
			waitForNotVisible();
		} catch (Exception e) {
			outcome = false;

		}
		report("notvisible", outcome, msgFor);
		return outcome;
	}

	public boolean verifyEnabled(String... label) {
		boolean outcome = true;
		String msgFor = getDescription(label);
		try {
			waitForEnabled();
		} catch (Exception e) {
			outcome = false;

		}
		report("enabled", outcome, msgFor);
		return outcome;
	}

	public boolean verifyDisabled(String... label) {

		boolean outcome = true;
		String msgFor = getDescription(label);
		try {
			waitForDisabled();
		} catch (Exception e) {
			outcome = false;

		}
		report("disabled", outcome, msgFor);
		return outcome;
	}

	public boolean verifyText(String text, String... label) {
		if (!ensurePresent(label))
			return false;
		boolean outcome = true;
		String msgFor = getDescription(label);

		try {
			waitForText(text);
		} catch (Exception e) {
			outcome = false;

		}
		report("text", outcome, msgFor, text, getText());
		return outcome;
	}

	public boolean verifyNotText(String text, String... label) {
		if (!ensurePresent(label))
			return false;

		boolean outcome = true;
		String msgFor = getDescription(label);
		try {
			waitForNotText(text);
		} catch (Exception e) {
			outcome = false;

		}
		report("nottext", outcome, msgFor, text, getText());
		return outcome;
	}

	@Override
	public boolean verifyNotText(StringMatcher matcher, String... label) {
		if (!ensurePresent(label))
			return false;

		boolean outcome = true;
		String msgFor = getDescription(label);
		try {
			waitForNotText(matcher);
		} catch (Exception e) {
			outcome = false;

		}
		report("nottext", outcome, msgFor, matcher.toString(), getText());
		return outcome;
	}

	@Override
	public boolean verifyText(StringMatcher matcher, String... label) {
		if (!ensurePresent(label))
			return false;

		boolean outcome = true;
		String msgFor = getDescription(label);
		try {
			waitForText(matcher);
		} catch (Exception e) {
			outcome = false;

		}
		report("text", outcome, msgFor, matcher.toString(), getText());
		return outcome;
	}

	public  boolean verifyValue(T value, String... label) {
		if (!ensurePresent(label))
			return false;

		boolean outcome = true;
		String msgFor = getDescription(label);
		try {
			waitForValue(value);
		} catch (Exception e) {
			outcome = false;

		}
		report("value", outcome, msgFor, value, getAttribute("value"));
		return outcome;
	}

	public  boolean verifyNotValue(T value, String... label) {
		if (!ensurePresent(label))
			return false;

		boolean outcome = true;
		String msgFor = getDescription(label);
		try {
			waitForNotValue(value);
		} catch (Exception e) {
			outcome = false;

		}
		report("notvalue", outcome, msgFor, value, getAttribute("value"));
		return outcome;
	}

	public boolean verifySelected(String... label) {
		boolean outcome = true;
		String msgFor = getDescription(label);
		try {
			waitForSelected();
		} catch (Exception e) {
			outcome = false;

		}
		report("selected", outcome, msgFor);
		return outcome;
	}

	public boolean verifyNotSelected(String... label) {

		boolean outcome = true;
		String msgFor = getDescription(label);
		try {
			waitForNotSelected();
		} catch (Exception e) {
			outcome = false;

		}
		report("notselected", outcome, msgFor);
		return outcome;
	}

	public boolean verifyAttribute(String name, String value, String... label) {
		if (!ensurePresent(label))
			return false;

		boolean outcome = true;
		String msgFor = getDescription(label);
		try {
			waitForAttribute(name, value);
		} catch (Exception e) {
			outcome = false;

		}
		report("attribute", outcome, msgFor, value, getAttribute(name));
		return outcome;
	}

	@Override
	public boolean verifyAttribute(String attr, StringMatcher matcher, String... label) {
		if (!ensurePresent(label))
			return false;

		boolean outcome = true;
		String msgFor = getDescription(label);
		try {
			waitForAttribute(attr, matcher);
		} catch (Exception e) {
			outcome = false;

		}
		report("attribute", outcome, msgFor, matcher, getAttribute(attr));
		return outcome;
	}

	public boolean verifyNotAttribute(String name, String value, String... label) {
		if (!ensurePresent(label))
			return false;

		boolean outcome = true;
		String msgFor = getDescription(label);
		try {
			waitForNotAttribute(name, value);
		} catch (Exception e) {
			outcome = false;

		}
		report("notattribute", outcome, msgFor, value, getAttribute(name));
		return outcome;
	}

	@Override
	public boolean verifyNotAttribute(String attr, StringMatcher matcher, String... label) {
		if (!ensurePresent(label))
			return false;

		boolean outcome = true;
		String msgFor = getDescription(label);
		try {
			waitForNotAttribute(attr, matcher);
		} catch (Exception e) {
			outcome = false;

		}
		report("notattribute", outcome, msgFor, matcher, getAttribute(attr));
		return outcome;
	}

	public boolean verifyCssClass(String name, String... label) {
		if (!ensurePresent(label))
			return false;

		boolean outcome = true;
		String msgFor = getDescription(label);
		try {
			waitForCssClass(name);
		} catch (Exception e) {
			outcome = false;

		}
		report("cssclass", outcome, msgFor, name, getAttribute("class"));
		return outcome;
	}

	public boolean verifyNotCssClass(String name, String... label) {
		if (!ensurePresent(label))
			return false;

		boolean outcome = true;
		String msgFor = getDescription(label);
		try {
			waitForNotCssClass(name);
		} catch (Exception e) {
			outcome = false;

		}
		report("notcssclass", outcome, msgFor, name, getAttribute("class"));
		return outcome;
	}

	public boolean verifyCssStyle(String name, String value, String... label) {
		if (!ensurePresent(label))
			return false;

		boolean outcome = true;
		String msgFor = getDescription(label);
		try {
			waitForCssStyle(name, value);
		} catch (Exception e) {
			outcome = false;

		}
		report("cssstyle", outcome, msgFor, value, getCssValue(name));
		return outcome;
	}

	public boolean verifyNotCssStyle(String name, String value, String... label) {
		if (!ensurePresent(label))
			return false;

		boolean outcome = true;
		String msgFor = getDescription(label);
		try {
			waitForNotCssStyle(name, value);
		} catch (Exception e) {
			outcome = false;

		}
		report("notcssstyle", outcome, msgFor, value, getCssValue(name));
		return outcome;
	}

	@Override
	public boolean verifyCssStyleColor(String prop, String value, String... label) {
		if (!ensurePresent(label))
			return false;

		boolean outcome = true;
		String msgFor = getDescription(label);
		try {
			waitForCssStyleColor(prop, value);
		} catch (Exception e) {
			outcome = false;

		}
		report("cssstyle", outcome, msgFor, value, getCssValue(prop));
		return outcome;
	}

	@Override
	public boolean verifyNotCssStyleColor(String prop, String value, String... label) {
		if (!ensurePresent(label))
			return false;

		boolean outcome = true;
		String msgFor = getDescription(label);
		try {
			waitForNotCssStyleColor(prop, value);
		} catch (Exception e) {
			outcome = false;

		}
		report("notcssstyle", outcome, msgFor, value, getCssValue(prop));
		return outcome;
	}

	// preconditions
	public void givenPresent() {
		if (!verifyPresent()) {
			throw new SkipException("Precondition failed:" + getDescription() + " should be present");
		}
	}

	public void givenNotPresent(String... label) {
		if (!verifyNotPresent(label)) {
			throw new SkipException("Precondition failed:"
					+ WebDriverCommandLogger.getMsgForElementOp("notpresent", false, getDescription(label)));
		}
	}

	// assertions
	public void assertPresent(String... label) {
		if (!verifyPresent(label)) {
			throw new AssertionError();
		}
	}

	public void assertNotPresent(String... label) {
		if (!verifyNotPresent(label)) {
			throw new AssertionError();
		}
	}

	public void assertVisible(String... label) {
		if (!verifyVisible(label)) {
			throw new AssertionError();
		}
	}

	public void assertNotVisible(String... label) {
		if (!verifyNotVisible(label)) {
			throw new AssertionError();
		}
	}

	public void assertEnabled(String... label) {
		if (!verifyEnabled(label)) {
			throw new AssertionError();
		}
	}

	public void assertDisabled(String... label) {
		if (!verifyDisabled(label)) {
			throw new AssertionError();
		}
	}

	public void assertText(String text, String... label) {
		if (!verifyText(text, label)) {
			throw new AssertionError();
		}
	}

	public void assertNotText(String text, String... label) {
		if (!verifyNotText(text, label)) {
			throw new AssertionError();
		}
	}

	@Override
	public void assertText(StringMatcher matcher, String... label) {
		if (!verifyText(matcher, label)) {
			throw new AssertionError();
		}
	}

	@Override
	public void assetNotText(StringMatcher matcher, String... label) {
		if (!verifyNotText(matcher, label)) {
			throw new AssertionError();
		}
	}

	public  void assertValue(T value, String... label) {
		if (!verifyValue(value, label)) {
			throw new AssertionError();
		}
	}

	public  void assertNotValue(T value, String... label) {
		if (!verifyNotValue(value, label)) {
			throw new AssertionError();
		}
	}

	public void assertSelected(String... label) {
		if (!verifySelected(label)) {
			throw new AssertionError();
		}
	}

	public void assertNotSelected(String... label) {
		if (!verifyNotSelected(label)) {
			throw new AssertionError();
		}
	}

	public void assertAttribute(String name, String value, String... label) {
		if (!verifyAttribute(name, value, label)) {
			throw new AssertionError();
		}
	}

	@Override
	public void assertAttribute(String attr, StringMatcher matcher, String... label) {
		if (!verifyAttribute(attr, matcher, label)) {
			throw new AssertionError();
		}
	}

	public void assertNotAttribute(String name, String value, String... label) {
		if (!verifyNotAttribute(name, value, label)) {
			throw new AssertionError();
		}
	}

	@Override
	public void assertNotAttribute(String attr, StringMatcher matcher, String... label) {
		if (!verifyNotAttribute(attr, matcher, label)) {
			throw new AssertionError();
		}
	}

	public void assertCssClass(String name, String... label) {
		if (!verifyCssClass(name, label)) {
			throw new AssertionError();
		}
	}

	public void assertNotCssClass(String name, String... label) {
		if (!verifyNotCssClass(name, label)) {
			throw new AssertionError();
		}
	}

	public void assertCssStyle(String name, String value, String... label) {
		if (!verifyCssStyle(name, value, label)) {
			throw new AssertionError();
		}
	}

	public void assertNotCssStyle(String name, String value, String... label) {
		if (!verifyNotCssStyle(name, value, label)) {
			throw new AssertionError();
		}
	}

	@Override
	public void assertCssStyleColor(String prop, String value, String... label) {
		if (!verifyCssStyleColor(prop, value, label)) {
			throw new AssertionError();
		}		
	}

	@Override
	public void assertNotCssStyleColor(String prop, String value, String... label) {
		if (!verifyNotCssStyleColor(prop, value, label)) {
			throw new AssertionError();
		}		
	}

	@SuppressWarnings("unchecked")
	public  T executeScript(String js) {
		JavascriptExecutor executor = getWrappedDriver();
		return (T) executor.executeScript("arguments[0]." + js, this);
	}

	@SuppressWarnings("unchecked")
	public  T executeAsyncScript(String js) {
		JavascriptExecutor executor = getWrappedDriver();
		return (T) executor.executeAsyncScript("arguments[0]." + js, this);
	}

	public void setAttribute(String name, String value) {
		executeScript(name + "=" + value);
	}

	public void registerListeners(QAFWebElementCommandListener listener) {
		listners.add(listener);

	}

	protected void report(String op, boolean outcome, Object... args) {
		getReporter().addMessage(WebDriverCommandLogger.getMsgForElementOp(op, outcome, args),
				(outcome ? MessageTypes.Pass : MessageTypes.Fail));
	}

	private void registerListeners(String className) {
		try {
			QAFWebElementCommandListener cls = (QAFWebElementCommandListener) Class.forName(className).newInstance();
			listners.add(cls);
		} catch (Exception e) {
			logger.error("Unable to register listener class " + className, e);
		}
	}

	@Override
	public void setParent(RemoteWebDriver parent) {
		if (null == parent) {
			parent = new WebDriverTestBase().getDriver();
		}
		super.setParent(parent);
	}

	public Map getMetaData() {
		return metaData;
	}

	public QAFWebElement findElementByCustomStretegy(String strategy, String loc) {
		return (QAFWebElement) findElement(strategy, loc);
	}

	@SuppressWarnings("unchecked")
	public List findElementsByCustomStretegy(String strategy, String loc) {
		return (List) (List) findElements(strategy, loc);
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy