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

org.phoenix.action.WebElementAction Maven / Gradle / Ivy

package org.phoenix.action;

import static com.codeborne.selenide.Selenide.actions;
import static com.codeborne.selenide.Selenide.close;
import static com.codeborne.selenide.Selenide.open;
import static com.codeborne.selenide.WebDriverRunner.getAndCheckWebDriver;
import static com.codeborne.selenide.WebDriverRunner.getWebDriver;
import static com.codeborne.selenide.WebDriverRunner.setWebDriver;
import io.selendroid.client.DriverCommand;
import io.selendroid.client.MultiTouchAction;
import io.selendroid.client.MultiTouchScreen;
import io.selendroid.client.ScreenBrightness;
import io.selendroid.client.SelendroidDriver;
import io.selendroid.client.TouchAction;
import io.selendroid.client.TouchActionBuilder;
import io.selendroid.client.adb.AdbConnection;
import io.selendroid.common.SelendroidCapabilities;
import io.selendroid.server.common.utils.CallLogEntry;
import io.selendroid.standalone.SelendroidConfiguration;
import io.selendroid.standalone.SelendroidLauncher;

import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.logging.Level;

import javax.imageio.ImageIO;

import org.openqa.selenium.By;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.Point;
import org.openqa.selenium.Proxy;
import org.openqa.selenium.ScreenOrientation;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.interactions.Keyboard;
import org.openqa.selenium.interactions.TouchScreen;
import org.openqa.selenium.interactions.touch.TouchActions;
import org.openqa.selenium.os.WindowsUtils;
import org.openqa.selenium.phantomjs.PhantomJSDriver;
import org.openqa.selenium.phantomjs.PhantomJSDriverService;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.phoenix.aop.CheckPointInvocationHandler;
import org.phoenix.aop.PhoenixLogger;
import org.phoenix.aop.WebApiInvocationHandler;
import org.phoenix.api.action.APIAction;
import org.phoenix.api.action.WebAPIAction;
import org.phoenix.api.utils.JsonPaser;
import org.phoenix.dao.InterfaceBatchDataDao;
import org.phoenix.dao.InterfaceDataDao;
import org.phoenix.dao.LocatorDao;
import org.phoenix.enums.LocatorType;
import org.phoenix.mobile.powertools.GetXml;
import org.phoenix.model.CaseLogBean;
import org.phoenix.model.InterfaceBatchDataBean;
import org.phoenix.model.InterfaceDataBean;
import org.phoenix.model.LocatorBean;
import org.phoenix.model.UnitLogBean;
import org.phoenix.plugins.IFtpClient;
import org.phoenix.plugins.IImageReader;
import org.phoenix.plugins.ISvnClient;
import org.phoenix.plugins.ITelnetClient;
import org.phoenix.utils.SystemInfo;

import com.codeborne.selenide.Condition;
import com.codeborne.selenide.ElementsCollection;
import com.codeborne.selenide.Selenide;
import com.codeborne.selenide.SelenideElement;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.google.common.io.Files;

/**
 * 元素的操作类,包括对Android和WEB元素
 * @author mengfeiyang
 *
 */
public class WebElementAction extends WebElementLocator implements ElementAction{
	private LocatorBean locatorBean;
	private LinkedList unitLog;
	private ElementAction webProxy;
	private SelendroidConfiguration config;
	private SelendroidLauncher selendroidServer;
	private SelendroidCapabilities capa;
	private SelendroidDriver selendroidDriver;
	private LocatorDao locatorDao = new LocatorDao();
	private InterfaceBatchDataDao ibatchDao = new InterfaceBatchDataDao();
	private InterfaceDataDao idataDao = new InterfaceDataDao();
	private HashMap locators;
	private CaseLogBean caseLogBean;
	private String ChromeDriverPath;
	private String FirefoxPath;
	private ICheckPoint checkPoint;

	public WebElementAction(LinkedList unitLog) {
		this.unitLog = unitLog;
		new PhoenixLogger();
		new LoadPhoenixPlugins();
		checkPoint = (ICheckPoint)new CheckPointInvocationHandler(new CheckPoint(),unitLog,caseLogBean).getProxy();
	}
	
	/*
	 * (non-Javadoc)
	 * @see org.phoenix.action.ElementAction#loadWebCaseDatas(int)
	 */
	@Override
	public HashMap> loadWebCaseDatas(int caseId){
		HashMap> webDatas = new HashMap>();
		LinkedHashMap> datas = this.loadInterfaceDatas(caseId);
		for(Entry> data : datas.entrySet()){
			HashMap dataBlocks = new HashMap();
			for(InterfaceDataBean idata : data.getValue()){
				dataBlocks.put(idata.getDataName(), idata.getDataContent());
			}
			webDatas.put(data.getKey(), dataBlocks);
		}
		return webDatas;
	}
	/*
	 * (non-Javadoc)
	 * @see org.phoenix.action.ElementAction#loadWebCaseDatas(java.lang.String)
	 */
	@Override
	public HashMap> loadWebCaseDatas(String caseName){
		HashMap> webDatas = new HashMap>();
		LinkedHashMap> datas = this.loadInterfaceDatas(caseName);
		for(Entry> data : datas.entrySet()){
			HashMap dataBlocks = new HashMap();
			for(InterfaceDataBean idata : data.getValue()){
				dataBlocks.put(idata.getDataName(), idata.getDataContent());
			}
			webDatas.put(data.getKey(), dataBlocks);
		}
		return webDatas;
	}
	/*
	 * (non-Javadoc)
	 * @see org.phoenix.action.ElementAction#addLocator(int, org.phoenix.model.CaseLogBean)
	 */
	@Override
	public void addLocator(int caseId,CaseLogBean caseLogBean){
		setCaseLogBean(caseLogBean);
		locators = new HashMap();
		List llist = locatorDao.getModelList(caseId);
		for(LocatorBean locatorBean : llist){
			locators.put(locatorBean.getLocatorDataName(), locatorBean);
		}
	}
	
	/*
	 * (non-Javadoc)
	 * @see org.phoenix.action.ElementAction#addLocator(java.lang.String, org.phoenix.model.CaseLogBean)
	 */
	@Override
	public void addLocator(String caseName,CaseLogBean caseLogBean){
		setCaseLogBean(caseLogBean);
		locators = new HashMap();
		List list = locatorDao.getModelList(caseName);
		for(LocatorBean locatorBean : list){
			locators.put(locatorBean.getLocatorDataName(), locatorBean);
		}
	}
	
	/*
	 * (non-Javadoc)
	 * @see org.phoenix.action.ElementAction#loadInterfaceDatas(int)
	 */
	@Override
	public LinkedHashMap> loadInterfaceDatas(int caseId){
		List iBatchList = ibatchDao.getModelList(caseId);
		LinkedHashMap> iBatchDataMap = new LinkedHashMap>();
		for(InterfaceBatchDataBean iBatch : iBatchList){
			iBatchDataMap.put(iBatch, idataDao.getModelList(iBatch.getId()));
		}
		return iBatchDataMap;
	}
	/**
	 * 根据给定的用例的name,获取该用例下所有的数据
	 */
	@Override
	public LinkedHashMap> loadInterfaceDatas(String caseName){
		List iBatchList = ibatchDao.getModelList(caseName);
		LinkedHashMap> iBatchDataMap = new LinkedHashMap>();
		for(InterfaceBatchDataBean iBatch : iBatchList){
			iBatchDataMap.put(iBatch, idataDao.getModelList(iBatch.getId()));
		}
		return iBatchDataMap;
	}
	/**
	 * 添加聚合用例。根据用例的名称
* 聚合用例用于执行当前用例中嵌入的外部用例,仅支持一级调用 */ @Override public void addAggregateCase(String caseName){ } /** * 添加聚合用例。根据用例的id
* 聚合用例用于执行当前用例中嵌入的外部用例,仅支持一级调用 */ @Override public void addAggregateCase(int caseId){ } public CaseLogBean getCaseLogBean() { return caseLogBean; } public void setCaseLogBean(CaseLogBean caseLogBean) { this.caseLogBean = caseLogBean; } @Override public ElementAction webElement(){ return webProxy; } /** * 直接使用定位信息而无需将其先录入数据库 * @param locatorData * @param locatorType 如果为null,则默认为locatorType 为CSS。Class和id可直接作为Css定位 * @return */ @Override public ElementAction webElement(String locatorData,LocatorType locatorType){ if(locatorType == null)locatorBean = new LocatorBean(locatorData); else locatorBean = new LocatorBean(locatorData,locatorType); return webProxy; } /** * 链式查询方法,直接调用了SelenideElement,调用了此方法后,后续的操作将不会被记录日志 */ @Override public SelenideElement webElementLinkFinder(String locatorDataName){ LocatorBean locatorBean = locators.get(locatorDataName); return WebElement(locatorBean.getLocatorData(),locatorBean.getLocatorType()); } /** * 链式查询方法,直接调用了SelenideElement,调用了此方法后,后续的操作将不会被记录日志 */ @Override public SelenideElement webElementLinkFinder(String locatorData,LocatorType locatorType){ if(locatorType == null)locatorType = LocatorType.CSS; return WebElement(locatorData,locatorType); } /** * 指定一个定位信息的标识,需要先将其录入数据库之后才会有该标识 */ @Override public ElementAction webElement(String name){ locatorBean = locators.get(name); return webProxy; } /** * 不使用任何定位信息时,如close方法 * @return */ public ElementAction getWebProxy() { return webProxy; } @Override public void setWebProxy(ElementAction webProxy) { this.webProxy = webProxy; } /* * (non-Javadoc) * @see org.phoenix.action.ElementAction#saveImgToLocal(com.codeborne.selenide.SelenideElement, java.lang.String, java.lang.String) */ @Override public boolean saveImgToLocal(SelenideElement element,String engine,String localFilePath){ try{ Point selenPoint = element.getLocation(); Dimension selenDim = element.getSize(); Robot r = new Robot(); Rectangle rt = new Rectangle(); switch (engine) { case "IEDriver": rt.setBounds(selenPoint.getX() - 1, selenPoint.getY() + 55, selenDim.getWidth(), selenDim.getHeight()); break; case "FirefoxDriver": rt.setBounds(selenPoint.getX(), selenPoint.getY() + 64, selenDim.getWidth(), selenDim.getHeight()); break; case "ChromeDriver": rt.setBounds(selenPoint.getX(), selenPoint.getY(), selenDim.getWidth(), selenDim.getHeight()); break; default:; } BufferedImage bfi = r.createScreenCapture(rt); File f = new File(localFilePath); ImageIO.write(bfi, Files.getFileExtension(localFilePath), f); return f.exists(); }catch(Exception e){ e.printStackTrace(); return false; } } /* * (non-Javadoc) * @see org.phoenix.action.ElementAction#saveImgToLocal(int, int, int, int, java.lang.String) */ @Override public boolean saveImgToLocal(int x,int y,int picWidth,int picHeight,String savePath){ try{ Robot r = new Robot(); Rectangle rt = new Rectangle(); rt.setBounds(x,y,picWidth, picHeight); BufferedImage bfi = r.createScreenCapture(rt); File f = new File(savePath); ImageIO.write(bfi, Files.getFileExtension(savePath), f); return f.exists(); }catch(Exception e){ e.printStackTrace(); return false; } } /** * 产生检查点代理 */ @Override public ICheckPoint checkPoint(){ return checkPoint; } /** * 产生webAPI接口代理 */ @Override public APIAction webAPIAction(){ APIAction webAPIAction = (APIAction) new WebApiInvocationHandler(new WebAPIAction(),unitLog,caseLogBean).getProxy(); return webAPIAction; } /** * svn客户端,用于对svn做操作。如获取提交日志,提交文件,更新文件等等。 * @return */ @Override public ITelnetClient telnetClient(){ return (ITelnetClient) LoadPhoenixPlugins.getPlugin("TelnetClient"); } /** * svn客户端,用于对svn做操作。如获取提交日志,提交文件,更新文件等等。 * @return */ @Override public ISvnClient svnClient(){ return (ISvnClient) LoadPhoenixPlugins.getPlugin("SvnClient"); } /** * 图片解析,用于识别图片上的字符。可直接对网络图片或本地图片进行读取 * @return */ @Override public IImageReader imageReader(){ return (IImageReader) LoadPhoenixPlugins.getPlugin("ImgReader"); } /** * ftp客户端,用于操作ftp服务器,如从ftp服务器下载文件和上传本地文件到服务器等操作。 * @return */ @Override public IFtpClient ftpClient(){ return (IFtpClient) LoadPhoenixPlugins.getPlugin("FtpClient"); } @Override public WebDriver getCurrentDriver(){ return getWebDriver(); } /* * (non-Javadoc) * @see org.phoenix.action.ElementAction#openNewWindowByHttpUnit(java.lang.String) */ public void openNewWindowByHtmlUnit(String url,boolean jsEnable,BrowserVersion version){ caseLogBean.setEngineType("HttpUnitDriver"); HtmlUnitDriver htmlUnit = new HtmlUnitDriver(version); htmlUnit.setJavascriptEnabled(jsEnable); setWebDriver(htmlUnit); open(url); } /* * (non-Javadoc) * @see org.phoenix.action.ElementAction#openNewWindowByHttpUnit(java.lang.String, java.lang.String, int) */ public void openNewWindowByHtmlUnit(String url,boolean jsEnable,BrowserVersion version,String hostIP,int hostPort){ caseLogBean.setEngineType("HttpUnitDriver with Proxy "+hostIP+":"+hostPort); HtmlUnitDriver htmlUnit = new HtmlUnitDriver(version); htmlUnit.setProxy(hostIP, hostPort); htmlUnit.setJavascriptEnabled(jsEnable); setWebDriver(htmlUnit); open(url); } @Override public void openNewWindowByPhantomJs(String url,String hostIP,int hostPort){ caseLogBean.setEngineType("PhantomJsDriver with proxy "+hostIP+":"+hostPort); DesiredCapabilities sCaps = new DesiredCapabilities(); sCaps.setJavascriptEnabled(true); if(SystemInfo.isWindows()){ sCaps.setCapability(PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY, WebElementAction.class.getResource("/").getPath().replace("%20", " ")+"drivers/phantomjs.exe"); sCaps.setCapability(PhantomJSDriverService.PHANTOMJS_GHOSTDRIVER_PATH_PROPERTY, WebElementAction.class.getResource("/").getPath().replace("%20", " ")+"drivers/js/main.js"); PhoenixLogger.info("Use Driver:"+WebElementAction.class.getResource("/").getPath().replace("%20", " ")+"drivers/phantomjs.exe"); } else { sCaps.setCapability(PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY, WebElementAction.class.getResource("/").getPath().replace("%20", " ")+"drivers/phantomjs"); PhoenixLogger.info("Use Driver:"+WebElementAction.class.getResource("/").getPath().replace("%20", " ")+"drivers/phantomjs"); } ArrayList cliArgsCap = new ArrayList(); cliArgsCap.add("--web-security=false"); cliArgsCap.add("--ssl-protocol=any"); cliArgsCap.add("--ignore-ssl-errors=true"); sCaps.setCapability(PhantomJSDriverService.PHANTOMJS_CLI_ARGS, cliArgsCap); sCaps.setCapability(PhantomJSDriverService.PHANTOMJS_GHOSTDRIVER_CLI_ARGS, new String[]{"--logLevel=INFO"}); Proxy proxy = new Proxy(); proxy.setHttpProxy(hostIP+":"+hostPort); sCaps.setCapability(CapabilityType.ForSeleniumServer.AVOIDING_PROXY, true); sCaps.setCapability(CapabilityType.ForSeleniumServer.ONLY_PROXYING_SELENIUM_TRAFFIC, true); System.setProperty("http.nonProxyHosts", "localhost"); sCaps.setCapability(CapabilityType.PROXY, proxy); setWebDriver(new PhantomJSDriver(sCaps)); open(url); } @Override public void openNewWindowByPhantomJs(String url){ caseLogBean.setEngineType("PhantomJsDriver"); DesiredCapabilities sCaps = new DesiredCapabilities(); sCaps.setJavascriptEnabled(true); if(SystemInfo.isWindows()){ sCaps.setCapability(PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY, WebElementAction.class.getResource("/").getPath().replace("%20", " ")+"drivers/phantomjs.exe"); sCaps.setCapability(PhantomJSDriverService.PHANTOMJS_GHOSTDRIVER_PATH_PROPERTY, WebElementAction.class.getResource("/").getPath().replace("%20", " ")+"drivers/js/main.js"); PhoenixLogger.info("Use Driver:"+WebElementAction.class.getResource("/").getPath().replace("%20", " ")+"drivers/phantomjs.exe"); } else { sCaps.setCapability(PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY, WebElementAction.class.getResource("/").getPath().replace("%20", " ")+"drivers/phantomjs"); PhoenixLogger.info("Use Driver:"+WebElementAction.class.getResource("/").getPath().replace("%20", " ")+"drivers/phantomjs"); } ArrayList cliArgsCap = new ArrayList(); cliArgsCap.add("--web-security=false"); cliArgsCap.add("--ssl-protocol=any"); cliArgsCap.add("--ignore-ssl-errors=true"); sCaps.setCapability(PhantomJSDriverService.PHANTOMJS_CLI_ARGS, cliArgsCap); sCaps.setCapability(PhantomJSDriverService.PHANTOMJS_GHOSTDRIVER_CLI_ARGS, new String[]{"--logLevel=INFO"}); setWebDriver(new PhantomJSDriver(sCaps)); open(url); } //WebElementAction.class.getResource("/").getPath().replace("%20", " ") /** * 此方法不适用于Linux */ @Override public void openNewWindowByIE(String url){ caseLogBean.setEngineType("IEDriver"); System.setProperty("webdriver.ie.driver", WebElementAction.class.getResource("/").getPath().replace("%20", " ")+"drivers/IEDriverServer"+SystemInfo.getArch()+".exe"); setWebDriver(new InternetExplorerDriver()); open(url); } /* * (non-Javadoc) * @see org.phoenix.action.ElementAction#openNewWindowByIE(java.lang.String, java.lang.String, int) */ @Override public void openNewWindowByIE(String url,String hostIP,int hostPort){ caseLogBean.setEngineType("IEDriver with proxy "+hostIP+":"+hostPort); System.setProperty("webdriver.ie.driver", WebElementAction.class.getResource("/").getPath().replace("%20", " ")+"drivers/IEDriverServer"+SystemInfo.getArch()+".exe"); setWebDriver(new InternetExplorerDriver(getProxyCap(hostIP,hostPort))); open(url); } /* * (non-Javadoc) * @see org.phoenix.action.ElementAction#setChromeDriverExePath(java.lang.String) */ @Override public void setChromeDriverExePath(String path){ ChromeDriverPath = path; } /** * 如果打不开Chrome浏览器或或者报异常,应先使用 setChromeDriverExePath(String path)方法指定chromedriver.exe路径
* Linux环境下无需设置chrome的安装路径。建议chrome安装在默认路径下
* 该程序的路径必须和Chrome.exe在同一目录下 */ @Override public void openNewWindowByChrome(String url) { caseLogBean.setEngineType("ChromeDriver"); if(SystemInfo.isWindows())System.setProperty("webdriver.chrome.driver",ChromeDriverPath); else System.setProperty("webdriver.chrome.driver", WebElementAction.class.getResource("/").getPath().replace("%20", " ")+"drivers/chromedriver"); setWebDriver(new ChromeDriver()); open(url); } /* * (non-Javadoc) * @see org.phoenix.action.ElementAction#openNewWindowByChrome(java.lang.String, java.lang.String, int) */ @Override public void openNewWindowByChrome(String url,String hostIP,int hostPort) { caseLogBean.setEngineType("ChromeDriver with proxy "+hostIP+":"+hostPort); if(SystemInfo.isWindows())System.setProperty("webdriver.chrome.driver",ChromeDriverPath); else System.setProperty("webdriver.chrome.driver", WebElementAction.class.getResource("/").getPath().replace("%20", " ")+"drivers/chromedriver"); setWebDriver(new ChromeDriver(getProxyCap(hostIP,hostPort))); open(url); } /* * (non-Javadoc) * @see org.phoenix.action.ElementAction#getProxyCap(java.lang.String, java.lang.String) */ @Override public DesiredCapabilities getProxyCap(String hostIP,int hostPort){ DesiredCapabilities cap = new DesiredCapabilities(); Proxy proxy = new Proxy(); proxy.setHttpProxy(hostIP+":"+hostPort); cap.setCapability(CapabilityType.ForSeleniumServer.AVOIDING_PROXY, true); cap.setCapability(CapabilityType.ForSeleniumServer.ONLY_PROXYING_SELENIUM_TRAFFIC, true); System.setProperty("http.nonProxyHosts", "localhost"); cap.setCapability(CapabilityType.PROXY, proxy); return cap; } @Override public void setFirefoxExePath(String path){ FirefoxPath = path; } /** * 如果打不开Firefox浏览器或或者报异常,应先使用 setFirefoxExePath(String path)方法指定Firefox主程序路径 */ @Override public void openNewWindowByFirefox(String url,String hostIP,int hostPort) { caseLogBean.setEngineType("FirefoxDriver with proxy "+hostIP+":"+hostPort); if(SystemInfo.isWindows())System.setProperty("webdriver.firefox.bin", FirefoxPath); setWebDriver(new FirefoxDriver(getProxyCap(hostIP,hostPort))); open(url); } /* * (non-Javadoc) * @see org.phoenix.action.ElementAction#openNewWindowByFirefox(java.lang.String) */ @Override public void openNewWindowByFirefox(String url) { caseLogBean.setEngineType("FirefoxDriver"); if(SystemInfo.isWindows())System.setProperty("webdriver.firefox.bin", FirefoxPath); setWebDriver(new FirefoxDriver()); open(url); } @Override public void closeWindow() { close(); } /* * (non-Javadoc) * @see org.phoenix.action.ElementAction#closeWindowAndDriverExe() */ @Override public void closeWindowAndDriverExe(){ close(); closeDriverExe(); } /* * (non-Javadoc) * @see org.phoenix.action.ElementAction#closeDriverExe() */ @Override public void closeDriverExe(){ WindowsUtils.tryToKillByName("phantomjs.exe"); WindowsUtils.tryToKillByName("IEDriverServer64.exe"); WindowsUtils.tryToKillByName("IEDriverServer32.exe"); WindowsUtils.tryToKillByName("chromedriver.exe"); } /* * (non-Javadoc) * @see org.phoenix.action.ElementAction#killProcess(java.lang.String[]) */ @Override public void killProcess(String[] cmdArray){ try { WindowsUtils.kill(cmdArray); } catch (Exception e) { //e.printStackTrace(); } } @Override public void click(){ WebElement(locatorBean.getLocatorData(),locatorBean.getLocatorType()).click(); } @Override public String getText() { return WebElement(locatorBean.getLocatorData(),locatorBean.getLocatorType()).getText(); } @Override public String innerText() { return WebElement(locatorBean.getLocatorData(),locatorBean.getLocatorType()).innerText(); } @Override public String innerHtml() { return WebElement(locatorBean.getLocatorData(),locatorBean.getLocatorType()).innerHtml(); } @Override public String name() { return WebElement(locatorBean.getLocatorData(),locatorBean.getLocatorType()).name(); } @Override public boolean exists() { return WebElement(locatorBean.getLocatorData(),locatorBean.getLocatorType()).exists(); } /* @Override public SelenideElement $(String cssSelector) { return WebElement(locatorBean.getLocatorData(),locatorBean.getLocatorType()).$(cssSelector); } @Override public SelenideElement $(String cssSelector, int index) { return WebElement(locatorBean.getLocatorData(),locatorBean.getLocatorType()).$(cssSelector, index); } @Override public SelenideElement $(By selector) { return WebElement(locatorBean.getLocatorData(),locatorBean.getLocatorType()).$(selector); } @Override public SelenideElement $(By selector, int index) { return WebElement(locatorBean.getLocatorData(),locatorBean.getLocatorType()).$(selector, index); } @Override public ElementsCollection $$(String cssSelector) { return WebElement(locatorBean.getLocatorData(),locatorBean.getLocatorType()).$$(cssSelector); }*/ /* * 根据定位信息获取对象列表 * @see org.phoenix.action.ElementAction#getElements() */ @Override public ElementsCollection getElements() { return WebElements(locatorBean.getLocatorData(),locatorBean.getLocatorType()); } @Override public void selectOption(String text) { WebElement(locatorBean.getLocatorData(),locatorBean.getLocatorType()).selectOption(text); } @Override public void selectOptionByValue(String value) { WebElement(locatorBean.getLocatorData(),locatorBean.getLocatorType()).selectOptionByValue(value); } @Override public String getSelectedValue() { String str = WebElement(locatorBean.getLocatorData(),locatorBean.getLocatorType()).getSelectedValue(); return str; } @Override public String getSelectedText() { String str = WebElement(locatorBean.getLocatorData(),locatorBean.getLocatorType()).getSelectedText(); return str; } @Override public File download() throws FileNotFoundException { return WebElement(locatorBean.getLocatorData(),locatorBean.getLocatorType()).download(); } @Override public SelenideElement contextClick() { return WebElement(locatorBean.getLocatorData(),locatorBean.getLocatorType()).contextClick(); } @Override public SelenideElement hover() { return WebElement(locatorBean.getLocatorData(),locatorBean.getLocatorType()).hover(); } @Override public SelenideElement dragAndDropTo(String targetCssSelector) { return WebElement(locatorBean.getLocatorData(),locatorBean.getLocatorType()).dragAndDropTo(targetCssSelector); } @Override public boolean isImage() { return WebElement(locatorBean.getLocatorData(),locatorBean.getLocatorType()).isImage(); } @Override public SelenideElement parent() { return WebElement(locatorBean.getLocatorData(),locatorBean.getLocatorType()).parent(); } @Override public SelenideElement waitWhile(Condition condition, long timeoutMilliseconds) { return WebElement(locatorBean.getLocatorData(),locatorBean.getLocatorType()).waitWhile(condition, timeoutMilliseconds); } @Override public boolean isDisplayed() { return WebElement(locatorBean.getLocatorData(),locatorBean.getLocatorType()).isDisplayed(); } @Override public void submit() { WebElement(locatorBean.getLocatorData(),locatorBean.getLocatorType()).submit(); } @Override public void sendKeys(String str) { WebElement(locatorBean.getLocatorData(),locatorBean.getLocatorType()).sendKeys(str); } @Override public void clear() { WebElement(locatorBean.getLocatorData(),locatorBean.getLocatorType()).clear(); } @Override public String getTagName() { return WebElement(locatorBean.getLocatorData(),locatorBean.getLocatorType()).getTagName(); } @Override public String getAttribute(String name) { return WebElement(locatorBean.getLocatorData(),locatorBean.getLocatorType()).getAttribute(name); } @Override public boolean isSelected() { return WebElement(locatorBean.getLocatorData(),locatorBean.getLocatorType()).isSelected(); } @Override public boolean isEnabled() { return WebElement(locatorBean.getLocatorData(),locatorBean.getLocatorType()).isEnabled(); } @Override public String getCssValue(String propertyName) { return WebElement(locatorBean.getLocatorData(),locatorBean.getLocatorType()).getCssValue(propertyName); } @Override public SelenideElement getSelectedOption() { return WebElement(locatorBean.getLocatorData(),locatorBean.getLocatorType()).getSelectedOption(); } @Override public SelenideElement scrollTo() { return WebElement(locatorBean.getLocatorData(),locatorBean.getLocatorType()).scrollTo(); } @Override public void setText(String text) { WebElement(locatorBean.getLocatorData(),locatorBean.getLocatorType()).setValue(text);; } @Override public String getAttrValue(String attr) { return WebElement(locatorBean.getLocatorData(),locatorBean.getLocatorType()).getAttribute(attr); } @Override public void sleep(long ms) { Selenide.sleep(ms);; } @Override public void append(String str) { WebElement(locatorBean.getLocatorData(),locatorBean.getLocatorType()).append(str); } @Override public void pressEnter() { WebElement(locatorBean.getLocatorData(),locatorBean.getLocatorType()).pressEnter(); } @Override public void pressTab() { WebElement(locatorBean.getLocatorData(),locatorBean.getLocatorType()).pressTab(); } @Override public void setSelected(boolean selected) { WebElement(locatorBean.getLocatorData(),locatorBean.getLocatorType()).setSelected(selected); } @Override public void waitUntil(Condition condition, long timeoutMilliseconds) { WebElement(locatorBean.getLocatorData(),locatorBean.getLocatorType()).waitUntil(condition, timeoutMilliseconds); } @Override public File uploadFile(String filePath) { return WebElement(locatorBean.getLocatorData(),locatorBean.getLocatorType()).uploadFile(new File(filePath)); } @Override public void switchToWindow(String title) { Selenide.switchToWindow(title); } @Override public void switchToWindow(int index) { Selenide.switchToWindow(index); } @Override public void switchToFrame(String nameOrId){ getWebDriver().switchTo().frame(nameOrId); } public void switchToParent(){ getAndCheckWebDriver().switchTo().parentFrame(); } @Override public String getPageSource(){ return getAndCheckWebDriver().getPageSource(); } @Override public String screenshot(String fileName){ return Selenide.screenshot(fileName); } @Override public void back() { Selenide.back(); } @Override public void forward() { Selenide.forward(); } @Override public String title() { return Selenide.title(); } @Override public void refresh(){ Selenide.refresh(); } public void doubleClick(){ actions().doubleClick(WebElement(locatorBean.getLocatorData(),locatorBean.getLocatorType())); } @Override public void confirm(String expectedDialogText) { Selenide.confirm(expectedDialogText); } @Override public SelenideElement selectRadio(String value) { return Selenide.selectRadio(by(locatorBean.getLocatorData(),locatorBean.getLocatorType()), value); } @Override public SelenideElement getSelectedRadio() { return Selenide.getSelectedRadio(by(locatorBean.getLocatorData(),locatorBean.getLocatorType())); } @Override public void dismiss(String expectedDialogText) { Selenide.dismiss(expectedDialogText); } @Override public List getJavascriptErrors() { return Selenide.getJavascriptErrors(); } @Override public List getWebDriverLogs(String logType, Level logLevel) { return getWebDriverLogs(logType, logLevel); } // ---------------------- android 操作部分 ---------------------- // /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#getTouch() */ @Override public TouchScreen getTouch() { return selendroidDriver.getTouch(); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#touchAction(org.openqa.selenium.WebElement, int, int, int) */ public TouchAction touchAction(WebElement element,int ms,int x,int y){ TouchAction finger = new TouchActionBuilder().pointerDown(element).pause(ms). pointerMove(x, y).pointerUp().build(); return finger; } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#flickElement(org.openqa.selenium.WebElement, int, int, int) */ public void flickElement(WebElement onElement, int xOffset, int yOffset, int speed){ new TouchActions(getWebDriver()).flick(onElement, xOffset, yOffset, speed).perform(); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#getTouchActions() */ public TouchActions getTouchActions(){ return new TouchActions(getWebDriver()); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#multiTouchElement(io.selendroid.client.TouchAction[]) */ public void multiTouchElement(TouchAction...touchAction){ new MultiTouchAction(touchAction).perform(getWebDriver()); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#roll(int, int) */ @Override public void roll(int dimensionX, int dimensionY) { selendroidDriver.roll(dimensionX, dimensionY); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#getMultiTouchScreen() */ @Override public MultiTouchScreen getMultiTouchScreen() { return selendroidDriver.getMultiTouchScreen(); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#getScreenshotAs(org.openqa.selenium.OutputType) */ @Override public X getScreenshotAs(OutputType target) { return selendroidDriver.getScreenshotAs(target); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#getBrightness() */ @Override public int getBrightness() { return ((ScreenBrightness)selendroidDriver).getBrightness(); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#setBrightness(int) */ @Override public void setBrightness(int desiredBrightness) { ((ScreenBrightness)selendroidDriver).setBrightness(desiredBrightness); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#rotate(org.openqa.selenium.ScreenOrientation) */ @Override public void rotate(ScreenOrientation orientation) { selendroidDriver.rotate(orientation); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#getOrientation() */ @Override public ScreenOrientation getOrientation() { return selendroidDriver.getOrientation(); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#setConfiguration(io.selendroid.client.DriverCommand, java.lang.String, java.lang.Object) */ @Override public void setConfiguration(DriverCommand command, String key, Object value) { selendroidDriver.setConfiguration(command, key, value); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#getConfiguration(io.selendroid.client.DriverCommand) */ @Override public Map getConfiguration(DriverCommand command) { return selendroidDriver.getConfiguration(command); } @Override public AdbConnection getAdbConnection() { return selendroidDriver.getAdbConnection(); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#isAirplaneModeEnabled() */ @Override public boolean isAirplaneModeEnabled() { return selendroidDriver.isAirplaneModeEnabled(); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#setAirplaneMode(boolean) */ @Override public void setAirplaneMode(boolean enabled) { selendroidDriver.setAirplaneMode(enabled); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#tap(int, int) */ @Override public void tap(int x, int y) { getAdbConnection().tap(x, y); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#sendText(java.lang.String) */ @Override public void appTextFieldSendTextByAdb(String text) { getAdbConnection().sendText(text); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#sendKeyEvent(int) */ @Override public void sendKeyEvent(int keyCode) { getAdbConnection().sendKeyEvent(keyCode); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#executeShellCommand(java.lang.String) */ @Override public String executeShellCommand(String command) { return getAdbConnection().executeShellCommand(command); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#getContextHandles() */ @Override public Set getContextHandles() { return selendroidDriver.getContextHandles(); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#getContext() */ @Override public String getContext() { return selendroidDriver.getContext(); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#backgroundApp() */ @Override public void backgroundApp() { selendroidDriver.backgroundApp(); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#resumeApp() */ @Override public void resumeApp() { selendroidDriver.resumeApp(); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#addCallLog(io.selendroid.server.common.utils.CallLogEntry) */ @Override public void addCallLog(CallLogEntry log) { selendroidDriver.addCallLog(log); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#readCallLog() */ @Override public List readCallLog() { return selendroidDriver.readCallLog(); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#callExtension(java.lang.String) */ @Override public Object callExtension(String extensionMethod) { return selendroidDriver.callExtension(extensionMethod); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#callExtension(java.lang.String, java.util.Map) */ @Override public Object callExtension(String extensionMethod, Map parameters) { return selendroidDriver.callExtension(extensionMethod, parameters); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#setSystemProperty(java.lang.String, java.lang.String) */ @Override public void setSystemProperty(String propertyName, String value) { selendroidDriver.setSystemProperty(propertyName, value); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#gc() */ @Override public void gc() { selendroidDriver.gc(); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#luncherSelendroidServer(java.lang.String) */ @Override public void luncherSelendroidServer(String appPath){ this.closeSelendroidServer(); config = new SelendroidConfiguration(); config.addSupportedApp(appPath); selendroidServer = new SelendroidLauncher(config); selendroidServer.launchSelendroid(); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#closeSelendroidServer() */ @Override public void closeSelendroidServer(){ if(selendroidDriver != null)selendroidDriver.quit(); if(selendroidServer != null)selendroidServer.stopSelendroid(); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#openAndroidAppBySelendroidWidthEmulator(java.lang.String) */ @Override public void openAndroidAppBySelendroidWithEmulator(String appPath) { luncherSelendroidServer(appPath); try{ capa = SelendroidCapabilities.emulator(getTargetAppId()); caseLogBean.setEngineType("AndroidEmulator "+capa.getVersion()); selendroidDriver = new SelendroidDriver(capa); setWebDriver(selendroidDriver); }catch(Exception e){ e.printStackTrace(); } } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#openAndroidAppBySelendroidWidthDevice(java.lang.String) */ @Override public void openAndroidAppBySelendroidWithDevice(String appPath) { this.luncherSelendroidServer(appPath); capa = SelendroidCapabilities.device(getTargetAppId()); caseLogBean.setEngineType("AndroidDevice "+capa.getVersion()); try { selendroidDriver = new SelendroidDriver(capa); setWebDriver(selendroidDriver); } catch (Exception e) { e.printStackTrace(); } } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#openAndroidBrowserBySelendroid(java.lang.String) */ @Override public void openAndroidBrowserBySelendroid(String url) { caseLogBean.setEngineType("AndroidBrowser"); luncherSelendroidServer(url); setWebDriver(new RemoteWebDriver(DesiredCapabilities.android())); open(url); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#getAndroidStatus() */ @Override public String getAndroidStatus() { try { return GetXml.getResponseByGet("http://localhost:4444/wd/hub/status"); } catch (Exception e) { e.printStackTrace(); return null; } } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#getTargetAppId() */ @Override public String getTargetAppId() { try { return JsonPaser.getNodeValue(getAndroidStatus(), "JSON.value.supportedApps[0].appId"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#getSelendroidDriver() */ @Override public SelendroidDriver getSelendroidDriver() { return selendroidDriver; } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#pressKeyByKeyboard(java.lang.String) */ @Override public void pressKeyByKeyboard(String keyCode) { selendroidDriver.getKeyboard().pressKey(keyCode); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#releaseKeyByKeyboard(java.lang.String) */ public void releaseKeyByKeyboard(String keyCode){ selendroidDriver.getKeyboard().releaseKey(keyCode); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#getAPITargetType() */ @Override public String getAPITargetType() { return capa.getAPITargetType(); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#getScreenSize() */ @Override public String getScreenSize() { return capa.getScreenSize(); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#getKeyboard() */ @Override public Keyboard getKeyboard() { return selendroidDriver.getKeyboard(); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#appElementSetText(java.lang.String) */ @Override public void appElementSetText(String text) { selendroidDriver.findElement(by(locatorBean.getLocatorData(),locatorBean.getLocatorType())).sendKeys(text);; } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#appElementClear() */ @Override public void appElementClear() { selendroidDriver.findElement(by(locatorBean.getLocatorData(),locatorBean.getLocatorType())).clear(); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#appElementIsDisplayed() */ @Override public boolean appElementIsDisplayed() { return selendroidDriver.findElement(by(locatorBean.getLocatorData(),locatorBean.getLocatorType())).isDisplayed(); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#appElementIsEnabled() */ @Override public boolean appElementIsEnabled() { return selendroidDriver.findElement(by(locatorBean.getLocatorData(),locatorBean.getLocatorType())).isEnabled(); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#appElementIsSelected() */ @Override public boolean appElementIsSelected() { return selendroidDriver.findElement(by(locatorBean.getLocatorData(),locatorBean.getLocatorType())).isSelected(); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#appElementClick() */ @Override public void appElementClick() { selendroidDriver.findElement(by(locatorBean.getLocatorData(),locatorBean.getLocatorType())).click(); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#appElementDoubleClick() */ @Override public void appElementDoubleClick() { new Actions(selendroidDriver).doubleClick(selendroidDriver.findElement(by(locatorBean.getLocatorData(),locatorBean.getLocatorType()))); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#getAppElementTagName() */ @Override public String getAppElementTagName() { return selendroidDriver.findElement(by(locatorBean.getLocatorData(),locatorBean.getLocatorType())).getTagName(); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#getAppAttribute(java.lang.String) */ @Override public String getAppAttribute(String name) { return selendroidDriver.findElement(by(locatorBean.getLocatorData(),locatorBean.getLocatorType())).getAttribute(name); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#getAppCssValue(java.lang.String) */ @Override public String getAppCssValue(String propertyName) { return selendroidDriver.findElement(by(locatorBean.getLocatorData(),locatorBean.getLocatorType())).getCssValue(propertyName); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#getAppLocation() */ @Override public Point getAppLocation() { return selendroidDriver.findElement(by(locatorBean.getLocatorData(),locatorBean.getLocatorType())).getLocation(); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#getAppDimension() */ @Override public Dimension getAppDimension() { return selendroidDriver.findElement(by(locatorBean.getLocatorData(),locatorBean.getLocatorType())).getSize(); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#getAppElements() */ @Override public List getAppElements() { return selendroidDriver.findElements(by(locatorBean.getLocatorData(),locatorBean.getLocatorType())); } /* * (non-Javadoc) * @see org.phoenix.mobile.android.action.AndroidAction#appElementClickAndHold() */ @Override public void appElementClickAndHold() { new Actions(selendroidDriver).clickAndHold(selendroidDriver.findElement(by(locatorBean.getLocatorData(),locatorBean.getLocatorType()))); } @Override public ElementAction appElement() { return webProxy; } @Override public ElementAction appElement(String name) { locatorBean = locators.get(name); return webProxy; } @Override public ElementAction appElement(String locatorData, LocatorType locatorType) { if(locatorType == null){ if(locatorData.startsWith("#"))locatorBean = new LocatorBean(locatorData,LocatorType.ID); if(locatorData.startsWith("."))locatorBean = new LocatorBean(locatorData,LocatorType.CLASS); }else locatorBean = new LocatorBean(locatorData,locatorType); return webProxy; } @Override public org.openqa.selenium.WebElement appElementLinkFinder(String locatorData, LocatorType locatorType) { By by = null; if(locatorType == null){ if(locatorData.startsWith("#"))by = by(locatorData,LocatorType.ID); if(locatorData.startsWith("."))by = by(locatorData,LocatorType.CLASS); }else by = by(locatorData,locatorType); return selendroidDriver.findElement(by); } @Override public org.openqa.selenium.WebElement appElementLinkFinder(String locatorData) { LocatorBean locatorBean = locators.get(locatorData); return selendroidDriver.findElement(by(locatorBean.getLocatorData(),locatorBean.getLocatorType())); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy