
core.uiCore.webElement.ImpEnhancedWebElement Maven / Gradle / Ivy
package core.uiCore.webElement;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.apache.commons.lang.StringUtils;
import org.openqa.selenium.By;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.NoSuchSessionException;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.Point;
import org.openqa.selenium.Rectangle;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebDriverException;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.Select;
import core.helpers.Element;
import core.helpers.Helper;
import core.support.logger.TestLog;
import core.uiCore.drivers.AbstractDriver;
import io.appium.java_client.MobileElement;
import io.appium.java_client.TouchAction;
import io.appium.java_client.touch.offset.PointOption;
public class ImpEnhancedWebElement implements EnhancedWebElement {
private final String elementName;
private final EnhancedBy element;
private By by;
private final WebDriver webDriver;
private final EnhancedBy parent;
private final int parentIndex;
private List parentElements;
private List current;
public Element.LocatorType locatorType;
public ImpEnhancedWebElement(EnhancedBy parent, int parentIndex, WebDriver webDriver, EnhancedBy element) {
this.elementName = element.name;
this.element = element;
this.webDriver = webDriver;
this.parent = parent;
this.parentIndex = parentIndex;
this.current = new ArrayList();
parentElements = new ArrayList();
}
@Override
public EnhancedWebElement findElement(EnhancedBy parentElement, int parentIndex, EnhancedBy element) {
return new ImpEnhancedWebElement(parentElement, parentIndex, webDriver, element);
}
@Override
public void clear() {
clear(0);
}
@Override
public void clear(int index) {
int retry = 1;
boolean success = false;
do {
retry--;
try {
isDisplayed(index);
if (isExist()) {
scrollToView_Web(index);
WebElement element = getElement(index);
element.clear();
success = true;
}
} catch (Exception e) {
resetElement();
e.getMessage();
}
} while (!success && retry > 0);
}
@Override
public String getCssValue(String arg0) {
return getCssValue(arg0, 0);
}
@Override
public String getCssValue(String arg0, int index) {
WebElement element = getElement(index);
return element.getCssValue(arg0);
}
@Override
public Point getLocation() {
return getLocation(0);
}
@Override
public Point getLocation(int index) {
WebElement element = getElement(index);
return element.getLocation();
}
@Override
public Dimension getSize() {
return getSize(0);
}
public Dimension getSize(int index) {
TestLog.ConsoleLog("getSize: " + elementName);
WebElement element = getElement(index);
return element.getSize();
}
@Override
public int count() {
List elements = getElements();
return elements.size();
}
@Override
public boolean isEmpty() {
return (count() == 0);
}
@Override
public String getTagName() {
return getTagName(0);
}
public String getTagName(int index) {
WebElement element = getElement(index);
return element.getTagName();
}
@Override
public boolean isDisplayed() {
return isDisplayed(0);
}
@Override
public boolean isDisplayed(int index) {
WebElement element = getElement(index);
return element.isDisplayed();
}
@Override
public boolean isEnabled() {
return isEnabled(0);
}
@Override
public boolean isEnabled(int index) {
WebElement element = getElement(index);
return element.isEnabled();
}
@Override
public void submit() {
submit(0);
}
public void submit(int index) {
WebElement element = getElement(index);
element.submit();
}
@Override
public void click() {
click(0);
}
@Override
public void click(int index) {
int retry = 3;
boolean success = false;
do {
retry--;
try {
scrollToView(index);
// highlight the element if enabled
Helper.highLightWebElement(element, index);
WebElement toClick = getElement(index);
toClick.click();
success = true;
} catch (Exception e) {
resetElement();
String cause = getCause(e);
if(!cause.isEmpty())
TestLog.ConsoleLog("click failed for element: " + elementName + ": " + cause);
Helper.page.printStackTrace(e);
}
} while (!success && retry > 0);
}
@Override
public void scrollToView() {
scrollToView(0);
}
@Override
public void scrollToView(int index) {
if(isElementFound(index))
scrollToView_Web(index);
// TODO: currently disable, since scroll is only from center
// mobileScroll(index);
}
/**
* @param element
*/
public void mobileScroll(int index) {
if (Helper.mobile_isMobile()) {
int scrollCount = 5;
while (!isExist() && scrollCount > 0) {
Helper.scrollDown();
Helper.refreshMobileApp();
scrollCount--;
}
}
}
@SuppressWarnings("rawtypes")
public void scrollTo_mobile(int index) {
if (Helper.mobile.isAndroid()) {
setTimeout(1, TimeUnit.MILLISECONDS);
WebElement element = getElement(index);
int x = element.getLocation().getX();
int y = element.getLocation().getY();
TouchAction action = new TouchAction(Helper.mobile.getAndroidDriver());
action.press(PointOption.point(x, y)).moveTo(PointOption.point(x + 90, y)).release().perform();
setTimeout(AbstractDriver.TIMEOUT_IMPLICIT_SECONDS, TimeUnit.SECONDS);
}
}
/**
* scroll to element on web
*/
public void scrollToView_Web(int index) {
if (!Helper.mobile.isWebDriver())
return;
// if visible in view, return
if (Helper.isVisibleInViewport(element, index))
return;
scrollToView_Web_Action(index);
// if visible in view, return
if (Helper.isVisibleInViewport(element, index))
return;
scrollToView_Web_JS(index);
}
/**
* scroll to web element using action
* @param index
*/
public void scrollToView_Web_Action(int index) {
if (!Helper.mobile.isWebDriver())
return;
// if visible in view, return
if (Helper.isVisibleInViewport(element, index))
return;
setTimeout(1, TimeUnit.MILLISECONDS);
WebElement element = getElement(index);
Actions action = new Actions(AbstractDriver.getWebDriver());
action.moveToElement(element);
setTimeout(AbstractDriver.TIMEOUT_IMPLICIT_SECONDS, TimeUnit.SECONDS);
}
/**
* scroll to web element using javascript
* @param index
*/
public void scrollToView_Web_JS(int index) {
if (!Helper.mobile.isWebDriver())
return;
// if visible in view, return
if (Helper.isVisibleInViewport(element, index))
return;
setTimeout(1, TimeUnit.MILLISECONDS);
WebElement element = getElement(index);
((JavascriptExecutor)AbstractDriver.getWebDriver()).executeScript("arguments[0].scrollIntoView();", element);
setTimeout(AbstractDriver.TIMEOUT_IMPLICIT_SECONDS, TimeUnit.SECONDS);
}
/**
* returns if element exists
*/
@Override
public boolean isExist(int... index) {
if(webDriver == null) return false;
boolean isExist = false;
try {
setTimeout(1, TimeUnit.MILLISECONDS);
if (index.length > 0) {
isExist = isElementExist(index[0]);
} else {
isExist = isListExist();
}
// reset element if no element found.
if (!isExist)
resetElement();
setTimeout(AbstractDriver.TIMEOUT_IMPLICIT_SECONDS, TimeUnit.SECONDS);
}catch(Exception e) {
return false;
}
return isExist;
}
/**
* returns if any element in a list is displayed
*/
public boolean isListExist() {
try {
List elements = getElements();
if (elements == null || elements.isEmpty())
return false;
int size = elements.size();
for (int i = 0; i < size; i++) {
if (isExist(i))
return true;
}
}catch(Exception e) {
return false;
}
return false;
}
/**
* returns true if element is displayed sets timeout to minimum to get the value
* quickly
*/
public boolean isElementExist(int index) {
boolean isElementExists = false;
try {
WebElement element = getElement(index);
if (element.isDisplayed()) {
isElementExists = true;
}
} catch (Exception e) {
isElementExists = false;
}
return isElementExists;
}
/**
* return if element is found in dom
* @param index
* @return
*/
public boolean isElementFound(int index) {
setTimeout(1, TimeUnit.MILLISECONDS);
boolean isFound = false;
try
{
WebElement element = getElement(index);
if(element != null)
isFound = true;
} catch (Exception e) {
isFound = false;
}
setTimeout(AbstractDriver.TIMEOUT_IMPLICIT_SECONDS, TimeUnit.SECONDS);
isFound = false;
return isFound;
}
@Override
public void moveMouse() {
moveMouse(0);
}
@Override
public void moveMouse(int index) {
WebElement element = getElement(index);
element.getLocation();
}
public By getBy() {
return by;
}
public String getCssSelectorValue() {
String byValue = by.toString();
return byValue.substring(byValue.indexOf(":") + 1);
}
@Override
public void setValue(int index, CharSequence... keysToSend) {
MobileElement element = (MobileElement) getElement(index);
String value = keysToSend[0].toString();
element.setValue(value);
}
@Override
public void sendKeys(CharSequence... keysToSend) {
sendKeys(0, keysToSend);
}
@Override
public void sendKeys(int index, CharSequence... keysToSend) {
int retry = 3;
List exception = new ArrayList();
boolean success = false;
do {
retry--;
try {
scrollToView(index);
isDisplayed(index);
Helper.highLightWebElement(element, index);
WebElement element = getElement(index);
element.sendKeys(keysToSend);
success = true;
} catch (Exception e) {
resetElement();
String cause = getCause(e);
exception.add(cause);
if(retry == 0)
TestLog.ConsoleLog("send keys failed for element: " + elementName + ": " + Arrays.toString(exception.toArray()));
}
} while (!success && retry > 0);
}
@Override
public void sendKeysByAction(int index, CharSequence... keysToSend) {
int retry = 3;
boolean success = false;
do {
retry--;
try {
scrollToView(index);
isDisplayed(index);
if (isExist()) {
sendKeyByAction(index, keysToSend);
success = true;
}
} catch (Exception e) {
resetElement();
String cause = getCause(e);
TestLog.ConsoleLog("sendkey failed: " + cause);
Helper.page.printStackTrace(e);
}
} while (!success && retry > 0);
Helper.assertTrue("send key was not successful", success);
}
@Override
public void sendKeyByJs(int index, CharSequence[] keysToSend) {
WebElement element = getElement(index);
Helper.executeJs("arguments[0].setAttribute('value', '" + String.valueOf(keysToSend[0]) + "')", element);
}
/*
* Enter text to an element by action
*/
public void sendKeyByAction(int index, CharSequence[] keysToSend) {
WebElement element = getElement(index);
Actions action = new Actions(webDriver);
action.moveToElement(element).click().sendKeys(keysToSend).build().perform();
}
@Override
public String getAttribute(String name) {
return getAttribute(name, 0);
}
@Override
public String getAttribute(String name, int index) {
int retry = 3;
String value = "";
boolean isSuccess = false;
do {
retry--;
try {
WebElement element = getElement(index);
value = element.getAttribute(name);
isSuccess = true;
} catch (Exception e) {
e.getMessage();
}
} while (!isSuccess && retry > 0);
return value;
}
@Override
public void setAttribute(String attribute, String value) {
setAttribute(attribute, 0, value);
}
public void setAttribute(String attribute, int index, String value) {
WebElement element = getElement(index);
Helper.executeJs("arguments[0].setAttribute('" + attribute + "', '" + value + "')", element);
}
@Override
public WebElement get(int index) {
return get(index, true);
}
@Override
public WebElement get(int index, boolean isFail) {
WebElement element = null;
try {
element = getElement(index);
}catch(Exception e) {
if(isFail)
Helper.assertFalse("element: " + getElementName() + " at index: " + index + " was not found");
}
return element;
}
@Override
public String getText() {
return getText(0);
}
@Override
public String getText(int index) {
scrollToView_Web(index);
int retry = 1;
String value = StringUtils.EMPTY;
boolean isSuccess = false;
do {
retry--;
try {
WebElement element = getElement(index);
value = element.getText();
if (value.isEmpty())
value = getAttribute("textContent", index);
if (value == null || value.isEmpty())
value = getAttribute("value", index);
if (value == null || value.isEmpty())
value = getAttribute("innerText", index);
if (!value.isEmpty())
isSuccess = true;
} catch (Exception e) {
e.getMessage();
value = StringUtils.EMPTY;
}
} while (!isSuccess && retry > 0);
return value;
}
@Override
public List getTextList() {
List stringList = new ArrayList();
List elementList = getElements();
if(elementList == null)
return stringList;
int listSize = elementList.size();
for (int i = 0; i < listSize; i++) {
stringList.add(getText(i).trim());
}
return stringList;
}
private void resetElement() {
this.current = new ArrayList();
}
@Override
public String getElementName() {
return elementName;
}
@Override
public Select getSelect(int index) {
scrollToView_Web(index);
int retry = 1;
Select selectElement = null;
boolean isSuccess = false;
do {
retry--;
try {
WebElement element = getElement(index);
selectElement = new Select(element);
} catch (Exception e) {
e.getMessage();
selectElement = null;
}
} while (!isSuccess && retry > 0);
return selectElement;
}
/**
* gets elements based on index location
*
* @param index
* @return
*/
public WebElement getElement(int index) {
WebElement element;
if (index == 0) {
element = getElement().get(0);
}else {
element = getElements().get(index);
}
return element;
}
/**
* gets parent elements and stores in parentElements list
*/
public void getParentElement() {
// if parent locator is not set, or parent elements have already been found, do
// not proceed
if (parent == null || !this.parentElements.isEmpty())
return;
for (ElementObject elementObject : this.parent.elementObject) {
this.by = elementObject.by;
this.locatorType = elementObject.locatorType;
try {
this.current = new ArrayList();
this.parentElements = webDriver.findElements(by);
// if no element found, go to next locator
if (this.parentElements.isEmpty())
continue;
} catch (Exception e) {
e.getMessage();
}
}
}
/**
* gets the list of elements, then selects the first visible element from the
* list in situation where the first elements are not visible, out of view
*
* @return
*/
public List getElement() {
List elements = new ArrayList();
if (current != null && !current.isEmpty())
return this.current;
// get parent elements if applicable
getParentElement();
// if multiple element objects, we need to iterate through them quickly
if (this.element.elementObject.size() > 1) {
setTimeout(1, TimeUnit.MILLISECONDS);
}
for (ElementObject elementObject : this.element.elementObject) {
this.by = elementObject.by;
this.locatorType = elementObject.locatorType;
try {
if (!this.parentElements.isEmpty()) {
this.current = new ArrayList();
elements = parentElements.get(parentIndex).findElements(by);
} else if (current == null || current.isEmpty()) {
this.current = new ArrayList();
elements = webDriver.findElements(by);
}
// if no element found, go to next locator
if (elements.isEmpty())
continue;
// get first visible element
WebElement element = getFirstVisibleElement(elements);
this.current.add(element);
} catch (Exception e) {
e.getMessage();
}
}
setTimeout(AbstractDriver.TIMEOUT_IMPLICIT_SECONDS, TimeUnit.SECONDS);
return this.current;
}
public List getElements() {
if (current != null && !current.isEmpty())
return this.current;
// get parent elements if applicable
getParentElement();
// if multiple element objects, we need to iterate through them quickly
if (this.element.elementObject.size() > 1) {
setTimeout(1, TimeUnit.MILLISECONDS);
}
for (ElementObject elementObject : this.element.elementObject) {
try {
this.by = elementObject.by;
this.locatorType = elementObject.locatorType;
if (!this.parentElements.isEmpty()) {
this.current = parentElements.get(parentIndex).findElements(by);
} else if (current == null || current.isEmpty()) {
this.current = webDriver.findElements(by);
}
// if element is found, exit loop
if (!this.current.isEmpty())
break;
} catch (Exception e) {
e.getMessage();
}
}
setTimeout(AbstractDriver.TIMEOUT_IMPLICIT_SECONDS, TimeUnit.SECONDS);
return this.current;
}
/**
* gets the first visible element filters hidden elements
*
* @param elements
* @return
*/
public WebElement getFirstVisibleElement(List elements) {
setTimeout(1, TimeUnit.MILLISECONDS);
WebElement element = null;
int count = elements.size();
if (count > 1) {
for (int i = 0; i < elements.size(); i++) {
if (elements.get(i).isDisplayed()) {
element = elements.get(i);
break;
}
}
} else {
element = elements.get(0);
}
setTimeout(AbstractDriver.TIMEOUT_IMPLICIT_SECONDS, TimeUnit.SECONDS);
return element;
}
@Override
public boolean isSelected() {
// TODO Auto-generated method stub
return false;
}
@Override
public By getElementCssSelector() {
// TODO Auto-generated method stub
return null;
}
@Override
public Rectangle getRect() {
// TODO Auto-generated method stub
return null;
}
@Override
public X getScreenshotAs(OutputType arg0) throws WebDriverException {
// TODO Auto-generated method stub
return null;
}
@Override
public List findElements(By by) {
// TODO Auto-generated method stub
return null;
}
@Override
public By getElementCssSelector(int index) {
// TODO Auto-generated method stub
return null;
}
@Override
public String getAttribute(int index, String name) {
// TODO Auto-generated method stub
return null;
}
@Override
public String getElementName(int index) {
// TODO Auto-generated method stub
return null;
}
@Override
public WebElement findElement(By arg0) {
// TODO Auto-generated method stub
return null;
}
private String getCause(Exception e) {
String cause = StringUtils.EMPTY;
try {
cause = e.getMessage().toString();
}catch(Exception ex) {
return cause;
}
return cause;
}
@SuppressWarnings("deprecation")
private void setTimeout(long time, TimeUnit unit) {
if(webDriver == null ) return;
try {
webDriver.manage().timeouts().implicitlyWait(time, unit);
}catch(NoSuchSessionException e) {
Helper.page.printStackTrace(e);
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy