Appium Wrapper for Java
来源:互联网 发布:御彩轩计划软件 编辑:程序博客网 时间:2024/05/17 19:16
基于Appium的移动测试框架,Appium的Wrapper很关键。Talk is cheap, Java版本代码如下:
package com.ctrip.cap.lanucher;/** * A service wrapper for Appium Server * * @author ltyao * */public class AppiumServer { private static final Logger logger = LoggerFactory .getLogger(AppiumServer.class); private static final long START_TIMEOUT_MILLISECONDS = 30000; private static final HttpClient httpClient = HttpClients.createDefault(); private static final String STATUS_PATH = "/wd/hub/status"; private static final String PATH = "/wd/hub"; private String ip = "localhost"; // private volatile boolean started = false; private Process process; private int appiumPort = -1; private int bootstrapPort = -1; private int selendroidPort = -1; private int chromeDriverPort = -1; private int robotPort = -1; private String appiumLog; private AndroidDevice device; public AppiumServer() { } public AppiumServer(AndroidDevice device) { this.device = device; } public void stopAppium() { try { WinProcess winp = new WinProcess(process); logger.warn("try to kill process {} Recursively", winp.getPid()); winp.killRecursively(); } catch (Exception e) { logger.warn("stopAppium", e); } } public void startAppium() { startAppium(START_TIMEOUT_MILLISECONDS); } public void startAppium(long milliseconds) { List<String> cmds = buildCmds(); final ProcessBuilder pb = new ProcessBuilder(cmds) .redirectErrorStream(true); logger.debug("start appium with {}", cmds.toString()); new Thread(new Runnable() { @Override public void run() { try { process = pb.start(); int exitvalue = process.waitFor(); logger.warn("appium server exitvalue {}", exitvalue); } catch (Exception e) { logger.warn("startAppium", e); } } }).start(); long start = System.currentTimeMillis(); boolean state = isRunning(); while (!state) { long end = System.currentTimeMillis(); if (end - start > milliseconds) { this.stopAppium(); throw new AppiumTimeoutException("Appium can't be lanuched in " + milliseconds + " seconds"); } state = isRunning(); } logger.warn("started appium server {}", this); } public void restartAppium() { this.stopAppium(); this.startAppium(); } public boolean isRunning() { try { URI uri = new URIBuilder().setScheme("http").setHost(ip) .setPort(appiumPort).setPath(STATUS_PATH).build(); HttpGet httpget; HttpResponse response; httpget = new HttpGet(uri); response = httpClient.execute(httpget); HttpEntity entity = response.getEntity(); String rs = EntityUtils.toString(entity); JsonElement json = new JsonParser().parse(rs); int status = json.getAsJsonObject().get("status").getAsInt(); return status == 0; } catch (Exception e) { // logger.warn("isRunning", e); return false; } } public URL getURL() { URI uri; try { uri = new URIBuilder().setScheme("http").setHost(ip) .setPort(appiumPort).setPath(PATH).build(); return uri.toURL(); } catch (URISyntaxException | MalformedURLException e) { throw new CapException("getURL", e); } } public int getPid() { try { WinProcess winp = new WinProcess(process); return winp.getPid(); } catch (Exception e) { logger.warn("", e); return -1; } } /** * need to be checked * * @return */ private List<String> buildCmds() { appiumPort = AvailablePortFinder.getNextAvailable(); chromeDriverPort = AvailablePortFinder.getNextAvailable(); bootstrapPort = AvailablePortFinder.getNextAvailable(); selendroidPort = AvailablePortFinder.getNextAvailable(); List<String> cmds = new LinkedList<>(); cmds.add("appium.cmd"); cmds.add(String.format("--port=%d", appiumPort)); cmds.add(String.format("--chromedriver-port=%d", chromeDriverPort)); cmds.add(String.format("--selendroid-port=%d", selendroidPort)); cmds.add(String.format("--bootstrap-port=%d", bootstrapPort)); this.appiumLog = Environment.appiumLog(device.getSerialNumber()); String qappiumLog = StringUtils.quoteArgument(this.appiumLog); cmds.add(String.format("--log=%s", qappiumLog)); cmds.add("--log-timestamp"); // switch (config.getDriverType()) { // case Selendroid: // selendroidPort = AvailablePortFinder.getNextAvailable(); // cmds.add(String.format("--selendroid-port=%d", selendroidPort)); // // break; // case ChromeDriver: // chromeDriverPort = AvailablePortFinder.getNextAvailable(); // cmds.add(String.format("--chromedriver-port=%d", chromeDriverPort)); // // default: // break; // } return cmds; } public int getAppiumPort() { return appiumPort; } public void setAppiumPort(int appiumPort) { this.appiumPort = appiumPort; } public int getBootstrapPort() { return bootstrapPort; } public void setBootstrapPort(int bootstrapPort) { this.bootstrapPort = bootstrapPort; } public int getSelendroidPort() { return selendroidPort; } public void setSelendroidPort(int selendroidPort) { this.selendroidPort = selendroidPort; } public int getChromeDriverPort() { return chromeDriverPort; } public void setChromeDriverPort(int chromeDriverPort) { this.chromeDriverPort = chromeDriverPort; } public int getRobotPort() { return robotPort; } public void setRobotPort(int robotPort) { this.robotPort = robotPort; } public String getAppiumLog() { return appiumLog; } public Device getDevice() { return device; } public void setDevice(AndroidDevice device) { this.device = device; } @Override public String toString() { return "AppiumServer [pid=" + getPid() + ",ip=" + ip + ", appiumPort=" + appiumPort + ", bootstrapPort=" + bootstrapPort + ", selendroidPort=" + selendroidPort + ", chromeDriverPort=" + chromeDriverPort + ", appiumLog=" + appiumLog + "]"; }}
0 0
- Appium Wrapper for Java
- Appium Wrapper for Java
- Appium for java API
- Appium For Android and IOS By Java
- JNI wrapper for x264
- Python Wrapper for FaceRecognizer
- Appium :Windows 平台上的使用 Java 语言实现 appium 自动化程序 for Android
- CppSQLite - C++ Wrapper for SQLite
- My C++ Wrapper for FreeTDS
- CppSQLite - C++ Wrapper for SQLite
- CppSQLite - C++ Wrapper for SQLite
- cdev wrapper for block rw
- Appium_Automators' Cafe Appium android example program for windows using java
- Java + testng +maven + appium for IOS 自动化测试
- Android自动化测试appium for java环境搭建实操
- wrapper.java.additional
- wrapper 搭建java 服务
- Java Service Wrapper 使用
- Convert Sorted List to Binary Search Tree
- 一位ACMer过来人的心得
- print与flush
- FPGA芯片结构
- try...except遇到的问题
- Appium Wrapper for Java
- Lex与Yacc学习(五)之正则表达式篇
- Maximum Gap
- 静思语
- 引用计数
- 使用Cocos Code IDE设置Quick-Cocos2d-x 3.2-RC1版本语法提示的方法
- 数据挖掘之部分监督学习
- 【分享】Genymotion 性能完爆安卓模拟器,可取而代之.
- 培训的第一天