51Testing软件测试论坛
标题:
Appium自动化测试框架
[打印本页]
作者:
小小糖
时间:
2018-3-14 14:32
标题:
Appium自动化测试框架
[attach]111945[/attach]
1.在utils包中创建一个AppiumUtil类,这个类是对appium api进行封装的。
代码如下:
1 package utils;
2
3 import java.net.MalformedURLException;
4 import java.net.URL;
5 import java.util.List;
6 import java.util.Set;
7 import java.util.concurrent.TimeUnit;
8
9 import org.apache.log4j.Logger;
10 import org.openqa.selenium.By;
11 import org.openqa.selenium.JavascriptExecutor;
12 import org.openqa.selenium.NoSuchElementException;
13 import org.openqa.selenium.TimeoutException;
14 import org.openqa.selenium.WebDriver;
15 import org.openqa.selenium.WebElement;
16 import org.openqa.selenium.remote.DesiredCapabilities;
17 import org.openqa.selenium.support.ui.ExpectedCondition;
18 import org.openqa.selenium.support.ui.WebDriverWait;
19 import org.testng.Assert;
20 import org.testng.ITestResult;
21
22 import io.appium.java_client.AppiumDriver;
23 import io.appium.java_client.MultiTouchAction;
24 import io.appium.java_client.NoSuchContextException;
25 import io.appium.java_client.TouchAction;
26 import io.appium.java_client.android.AndroidDriver;
27 import io.appium.java_client.ios.IOSDriver;
28
29 /**
30 * [url=home.php?mod=space&uid=267564]@Author[/url] young
31 * @description appium api封装
32 * */
33
34 public class AppiumUtil {
35
36 public AppiumDriver<WebElement> driver;
37 public ITestResult it;
38 /**定义日志输出对象*/
39 public static Logger logger = Logger.getLogger(AppiumUtil.class);
40
41 /**获取driver
42 * @throws */
43 public AppiumDriver<WebElement> getDriver(String url,DesiredCapabilities capabilities,String platform){
44
45 if(platform.equalsIgnoreCase("android")){
46 try {
47 driver = new AndroidDriver<WebElement>(new URL(url), capabilities);
48 } catch (MalformedURLException e) {
49 e.printStackTrace();
50 }
51 }else if(platform.equalsIgnoreCase("ios")){
52 try {
53 driver = new IOSDriver<WebElement> (new URL(url),capabilities);
54 } catch (MalformedURLException e) {
55 e.printStackTrace();
56 }
57 }else{
58
59 }
60 return driver;
61
62 }
63
64 /**退出app*/
65 public void closeApp(String appName){
66 driver.closeApp();
67 logger.info(appName+"已经关闭");
68 }
69
70 /**退出移动浏览器*/
71 public void quit(){
72 driver.quit();
73 logger.info("driver已被清理");
74 }
75 /**通过By对象 去查找某个元素*/
76 public WebElement findElement(By by){
77 return driver.findElement(by);
78 }
79
80 /**
81 * 通过By对象 去查找一组元素
82 * */
83 public List<WebElement> findElements(By by) {
84 return driver.findElements(by);
85 }
86
87 /**清空元素内容*/
88 public void clear(By byElement){
89 WebElement element = findElement(byElement);
90 element.clear();
91 logger.info("清空元素:"+getLocatorByElement(element, ">")+"上的内容");
92 }
93
94 /**输入内容*/
95 public void typeContent(By byElement,String str){
96 WebElement element = findElement(byElement);
97 element.sendKeys(str);
98 logger.info("在元素:"+getLocatorByElement(element, ">")+"输入内容:"+str);
99 }
100 /**点击*/
101 public void click(By byElement){
102 WebElement element = findElement(byElement);
103 try{
104 element.click();
105 logger.info("点击元素:"+getLocatorByElement(element, ">"));
106 }catch(Exception e){
107 logger.error("点击元素:"+getLocatorByElement(element, ">")+"失败", e);
108 Assert.fail("点击元素:"+getLocatorByElement(element, ">")+"失败", e);
109 }
110
111 }
112
113 /**查找一个元素 - appium新增的查找元素方法*/
114 public WebElement findElement(String locateWay,String locateValue){
115 WebElement element = null;
116 switch(locateWay){
117
118 case "AccessibilityId":
119 element = driver.findElementByAccessibilityId(locateValue);
120 break;
121 // case "AndroidUIAutomator":
122 // element = driver.findElementByAndroidUIAutomator(locateValue);
123 // break;
124 case "ClassName":
125 element = driver.findElementByClassName(locateValue);
126 break;
127 case "CSS":
128 element = driver.findElementByCssSelector(locateValue);
129 break;
130 case "ID":
131 element = driver.findElementById(locateValue);
132 break;
133 case "LinkText":
134 element = driver.findElementByLinkText(locateValue);
135 break;
136 case "Name":
137 element = driver.findElementByName(locateValue);
138 break;
139 case "PartialLinkText":
140 element = driver.findElementByPartialLinkText(locateValue);
141 break;
142 case "TagName":
143 element = driver.findElementByTagName(locateValue);
144 break;
145 case "Xpath":
146 element = driver.findElementByXPath(locateValue);
147 break;
148 default:
149 logger.error("定位方式:"+locateWay+"不被支持");
150 Assert.fail("定位方式:"+locateWay+"不被支持");
151
152 }
153 return element;
154
155 }
156
157 /**查找一组元素 - appium新增的查找元素方法*/
158 public List<?> findElements(String locateWay,String locateValue){
159 List<?> element=null;
160 switch(locateWay){
161
162 case "AccessibilityId":
163 element = driver.findElementsByAccessibilityId(locateValue);
164 break;
165 // case "AndroidUIAutomator":
166 // element = driver.findElementsByAndroidUIAutomator(locateValue);
167 // break;
168 case "ClassName":
169 element = driver.findElementsByClassName(locateValue);
170 break;
171 case "CSS":
172 element = driver.findElementsByCssSelector(locateValue);
173 break;
174 case "ID":
175 element = driver.findElementsById(locateValue);
176 break;
177 case "LinkText":
178 element = driver.findElementsByLinkText(locateValue);
179 break;
180 case "Name":
181 element = driver.findElementsByName(locateValue);
182 break;
183 case "PartialLinkText":
184 element = driver.findElementsByPartialLinkText(locateValue);
185 break;
186 case "TagName":
187 element = driver.findElementsByTagName(locateValue);
188 break;
189 case "Xpath":
190 element = driver.findElementsByXPath(locateValue);
191 break;
192 default:
193 logger.error("定位方式:"+locateWay+"不被支持");
194 Assert.fail("定位方式:"+locateWay+"不被支持");
195
196 }
197 return element;
198
199 }
200
201 /**获取文本1*/
202 public String getText(By by){
203 return findElement(by).getText().trim();
204 }
205
206
207 /**获取文本2*/
208 public String getText(String locateWay,String locateValue){
209 String str="";
210 switch(locateWay){
211
212 case "AccessibilityId":
213 str = driver.findElementByAccessibilityId(locateValue).getText().trim();
214 break;
215 // case "AndroidUIAutomator":
216 // str = driver.findElementByAndroidUIAutomator(locateValue).getText().trim();
217 // break;
218 case "ClassName":
219 str = driver.findElementByClassName(locateValue).getText().trim();
220 break;
221 case "CSS":
222 str = driver.findElementByCssSelector(locateValue).getText().trim();
223 break;
224 case "ID":
225 str = driver.findElementById(locateValue).getText().trim();
226 break;
227 case "LinkText":
228 str = driver.findElementByLinkText(locateValue).getText().trim();
229 break;
230 case "Name":
231 str = driver.findElementByName(locateValue).getText().trim();
232 break;
233 case "PartialLinkText":
234 str = driver.findElementByPartialLinkText(locateValue).getText().trim();
235 break;
236 case "TagName":
237 str = driver.findElementByTagName(locateValue).getText().trim();
238 break;
239 case "Xpath":
复制代码
作者:
小小糖
时间:
2018-3-14 14:33
240 str = driver.findElementByXPath(locateValue).getText().trim();
241 break;
242 default:
243 logger.error("定位方式:"+locateWay+"不被支持");
244 Assert.fail("定位方式:"+locateWay+"不被支持");
245
246 }
247 return str;
248
249 }
250
251 /**提交*/
252 public void submit(By by){
253 WebElement element=findElement(by);
254 try{
255 element.submit();
256 }catch(Exception e){
257 logger.error("在元素:"+getLocatorByElement(element, ">")+"做的提交操作失败",e);
258 Assert.fail("在元素:"+getLocatorByElement(element, ">")+"做的提交操作失败",e);
259 }
260 logger.info("在元素:"+getLocatorByElement(element, ">")+"做了提交操作");
261 }
262
263 /**
264 * 获得webview页面的标题
265 * */
266 public String getTitle() {
267 return driver.getTitle();
268 }
269
270 /**
271 * 获得元素 属性的文本
272 * */
273 public String getAttributeText(By elementLocator, String attribute) {
274 return findElement(elementLocator).getAttribute(attribute).trim();
275 }
276
277 /**
278 * 在给定的时间内去查找元素,如果没找到则超时,抛出异常
279 * */
280 public void waitForElementToLoad(int elementTimeOut, final By By) {
281 logger.info("开始查找元素[" + By + "]");
282 try {
283 (new WebDriverWait(driver, elementTimeOut)).until(new ExpectedCondition<Boolean>() {
284
285 public Boolean apply(WebDriver driver) {
286 WebElement element = driver.findElement(By);
287 return element.isDisplayed();
288 }
289 });
290 } catch (TimeoutException e) {
291 logger.error("超时!! " + elementTimeOut + " 秒之后还没找到元素 [" + By + "]");
292 Assert.fail("超时!! " + elementTimeOut + " 秒之后还没找到元素 [" + By + "]");
293
294 }
295 logger.info("找到了元素 [" + By + "]");
296 }
297
298 /**
299 * 判断文本是不是和需求要求的文本一致
300 * **/
301 public void isTextCorrect(String actual, String expected) {
302 try {
303 Assert.assertEquals(actual, expected);
304 } catch (AssertionError e) {
305 logger.error("期望的文字是 [" + expected + "] 但是找到了 [" + actual + "]");
306 Assert.fail("期望的文字是 [" + expected + "] 但是找到了 [" + actual + "]");
307
308 }
309 logger.info("找到了期望的文字: [" + expected + "]");
310
311 }
312
313 /**
314 * 暂停当前用例的执行,暂停的时间为:sleepTime
315 * */
316 public void pause(int sleepTime) {
317 if (sleepTime <= 0) {
318 return;
319 }
320 try {
321 TimeUnit.SECONDS.sleep(sleepTime);
322 logger.info("暂停:"+sleepTime+"秒");
323 } catch (InterruptedException e) {
324 e.printStackTrace();
325 }
326
327 }
328
329
330
331 /** 根据元素来获取此元素的定位值 */
332 public String getLocatorByElement(WebElement element, String expectText) {
333 String text = element.toString();
334 String expect = null;
335 try {
336 expect = text.substring(text.indexOf(expectText) + 1, text.length() - 1);
337 } catch (Exception e) {
338 e.printStackTrace();
339 logger.error("failed to find the string [" + expectText + "]");
340
341 }
342
343 return expect;
344
345 }
346
347
348 /**
349 * 判断实际文本时候包含期望文本
350 *
351 * @param actual
352 * 实际文本
353 * @param expect
354 * 期望文本
355 */
356 public void isContains(String actual, String expect) {
357 try {
358 Assert.assertTrue(actual.contains(expect));
359 } catch (AssertionError e) {
360 logger.error("The [" + actual + "] is not contains [" + expect + "]");
361 Assert.fail("The [" + actual + "] is not contains [" + expect + "]");
362 }
363 logger.info("The [" + actual + "] is contains [" + expect + "]");
364 }
365
366 /**跳转到webview页面*/
367 public void switchWebview(int index){
368 Set<String> contexts = driver.getContextHandles();
369 for (String context : contexts) {
370 System.out.println(context);
371 //打印出来看看有哪些context
372 }
373 driver.context((String) contexts.toArray()[index]);
374
375 }
376
377
378 /**跳转到webview页面*/
379 public void switchWebview(String contextName){
380 try{
381 Set<String> contexts = driver.getContextHandles();
382 for (String context : contexts) {
383 System.out.println(context);
384 //打印出来看看有哪些context
385 }
386 driver.context(contextName);
387 }catch(NoSuchContextException nce){
388 logger.error("没有这个context:"+contextName, nce);
389 Assert.fail("没有这个context:"+contextName, nce);
390 }
391
392 }
393
394
395 /**
396 * 执行JavaScript 方法
397 * */
398 public void executeJS(String js) {
399 ((JavascriptExecutor) driver).executeScript(js);
400 logger.info("执行JavaScript语句:[" + js + "]");
401 }
402
403 /**
404 * 执行JavaScript 方法和对象
405 * 用法:seleniumUtil.executeJS("arguments[0].click();", seleniumUtil.findElementBy(MyOrdersPage.MOP_TAB_ORDERCLOSE));
406 * */
407 public void executeJS(String js, Object... args) {
408 ((JavascriptExecutor) driver).executeScript(js, args);
409 logger.info("执行JavaScript语句:[" + js + "]");
410 }
411
412 /**检查元素是不是存在*/
413 public boolean doesElementsExist(By byElement){
414 try{
415 findElement(byElement);
416 return true;
417 }catch(NoSuchElementException nee){
418
419 return false;
420 }
421
422
423 }
424
425 /**长按操作*/
426 public void longPress(By by){
427 TouchAction tAction=new TouchAction(driver);
428 tAction.longPress(findElement(by)).perform();
429 }
430
431 /**滑动*/
432 public void swipe(int beginX,int beginY,int endX,int endY){
433 TouchAction tAction=new TouchAction(driver);
434 try{
435 tAction.press(beginX,beginY).moveTo(endX,endY).release().perform();
436 }catch(Exception e){
437 e.printStackTrace();
438 }
439 }
440
441 /**滚动 - 根据文本模糊匹配*/
442 public void scroll(String text){
443 driver.scrollTo(text);
444 }
445
446 /**滚动 - 根据文本精准匹配*/
447 public WebElement scrollExact(String text){
448 return driver.scrollToExact(text);
449 }
450
451 /**拖拽操作*/
452 public void DragAndDrop(By dragElement,By dropElement){
453 TouchAction act=new TouchAction(driver);
454 act.press(findElement(dragElement)).perform();
455 act.moveTo(findElement(dropElement)).release().perform();
456 }
457
458 /**放大和缩小*/
459 public void zoomAndPinch(int beginX,int beginY,int endX,int endY){
460 int scrHeight = driver.manage().window().getSize().getHeight();
461 int scrWidth = driver.manage().window().getSize().getWidth();
462 MultiTouchAction multiTouch = new MultiTouchAction(driver);
463 TouchAction tAction0 = new TouchAction(driver);
464 TouchAction tAction1 = new TouchAction(driver);
465 tAction0.press(scrWidth/2,scrHeight/2).waitAction(1000).moveTo(beginX,beginY).release();
466 tAction1.press(scrWidth/2,scrHeight/2+40).waitAction(1000).moveTo(endX,endY).release();
467 multiTouch.add(tAction0).add(tAction1);
468 multiTouch.perform();
469
470 }
471
472 /**app置于后台运行*/
473 public void runBackgound(int runTimes){
474 driver.runAppInBackground(runTimes);
475
476 }
477
478 /**收起键盘*/
479 public void hideKeyboard(){
480 driver.hideKeyboard();
481 logger.info("虚拟键盘已经收起");
482
483 }
484
485 /**安装app*/
486 public void instalApp(String appPath){
487 try{
488 driver.installApp(appPath);
489 }catch(Exception e){
490 logger.error("app安装失败",e);
491 Assert.fail("app安装失败",e);
492 }
493 }
494
495 /**app是否安装*/
496 public boolean isAppInstalled(String appPackage){
497
498 if(driver.isAppInstalled(appPackage)){
499 logger.info(appPackage+":已经安装");
500 return true;
501 }else {
502 logger.info(appPackage+":未安装");
503 return false;
504 }
505 }
506
507 /**页面过长时候滑动页面 window.scrollTo(左边距,上边距); */
508 public void scrollPage(int x,int y){
509 String js ="window.scrollTo("+x+","+y+");";
510 ((JavascriptExecutor)driver).executeScript(js);
511 }
512
513
514
515 }
复制代码
作者:
小小糖
时间:
2018-3-14 14:34
2.因为要显示log4日志,在pom.xml中加入jar包类:
1 <dependency>
2 <groupId>log4j</groupId>
3 <artifactId>log4j</artifactId>
4 <version>1.2.16</version>
5 <scope>provided</scope>
6 </dependency>
3.加载完成后要创建一个处理log类,名为:LogConfiguration类,代码如下:
复制代码
1 package com.young.appiumcombat.utils;
2 import java.util.Properties;
3
4 import org.apache.log4j.PropertyConfigurator;
5 /**
6 * @author young
7 * @decription 动态生成各个模块中的每条用例的日志,运行完成用例之后请到result/log目录下查看
8 * */
9 public class LogConfiguration {
10
11 public static void initLog(String fileName){
12 //获取到模块名字
13 String founctionName = getFunctionName(fileName);
14 //声明日志文件存储路径以及文件名、格式
15 final String logFilePath = "./result/logs/"+founctionName+"/"+fileName+".log";
16 Properties prop = new Properties();
17 //配置日志输出的格式
18 prop.setProperty("log4j.rootLogger","info, toConsole, toFile");
19 prop.setProperty("log4j.appender.file.encoding","UTF-8" );
20 prop.setProperty("log4j.appender.toConsole","org.apache.log4j.ConsoleAppender");
21 prop.setProperty("log4j.appender.toConsole.Target","System.out");
22 prop.setProperty("log4j.appender.toConsole.layout","org.apache.log4j.PatternLayout ");
23 prop.setProperty("log4j.appender.toConsole.layout.ConversionPattern","[%d{yyyy-MM-dd HH:mm:ss}] [%p] %m%n");
24 prop.setProperty("log4j.appender.toFile", "org.apache.log4j.DailyRollingFileAppender");
25 prop.setProperty("log4j.appender.toFile.file", logFilePath);
26 prop.setProperty("log4j.appender.toFile.append", "false");
27 prop.setProperty("log4j.appender.toFile.Threshold", "info");
28 prop.setProperty("log4j.appender.toFile.layout", "org.apache.log4j.PatternLayout");
29 prop.setProperty("log4j.appender.toFile.layout.ConversionPattern", "[%d{yyyy-MM-dd HH:mm:ss}] [%p] %m%n");
30 //使配置生效
31 PropertyConfigurator.configure(prop);
32
33 }
34
35
36 /**取得模块名字*/
37 public static String getFunctionName(String fileName){
38 String functionName = null;
39 int firstUndelineIndex = fileName.indexOf("_");
40 functionName = fileName.substring(0, firstUndelineIndex-4);
41 return functionName;
42
43 }
44
45
46 }
复制代码
4.因为我们要处理android和ios的项目,更方便处理兼容,在Utils中创建一个SelectDriver类,代码如下:
复制代码
1 package com.young.appiumcombat.utils;
2 import java.io.File;
3 import java.util.concurrent.TimeUnit;
4
5 import org.apache.log4j.Logger;
6 import org.openqa.selenium.WebElement;
7 import org.openqa.selenium.remote.DesiredCapabilities;
8 import org.testng.Assert;
9 import org.testng.ITestContext;
10
11 import io.appium.java_client.AppiumDriver;
12 /**
13 * @author Young
14 * @description 根据测试平台的不同生成不同的driver 比如AndroidDriver 或者是IOSDriver
15 *
16 * */
17
18 public class SelectDriver {
19 //声明driver
20 public AppiumDriver<WebElement> driver;
21 //声明DesiredCapabilities
22 public DesiredCapabilities capabilities;
23 //声明ITestContext,用于获取testng配置文件内容
24 public ITestContext testContext;
25 //appium server地址
26 public String serverURL;
27 //测试引擎名字
28 public String automationName;
29 //测试平台名字
30 public String platformName;
31 //测试平台版本号
32 public String platformVersion;
33 //设备名字
34 public String deviceName;
35 //ios app的路径
36 public String iosAppPath;
37 //android app路径
38 public String androidAppPath;
39 //android app的 package
40 public String appPackage;
41 //android app的activity
42 public String appActivity;
43 //安卓独有 - 是否使用unicode键盘,使用此键盘可以输入中文字符
44 public boolean unicodeKeyboard;
45 //android独有 - 是否重置键盘,如果设置了unicodeKeyboard键盘,可以将此参数设置为true,然后键盘会重置为系统默认的
46 public boolean resetKeyboard;
47 //是否覆盖已有的seesssion,这个用于多用例执行,如果不设置的话,会提示前一个session还没有结束,用例就不能继续执行了
48 public boolean sessionOverride;
49 //暂停的等待时间
50 public int sleepTime;
51 //元素等待超时时间
52 public int elementTimeOut;
53 //app文件路径,主要存储的是app的名字
54 public String appFilePath;
55 //webview的名字或者叫标识符,一般以WEBVIEW开头,例如WEBVIEW_com.microsoft.bing
56 public final static String WEBVIEW_NAME = null;
57 //原生app的名字或者标识符,一般是NATIVE_APP
58 public final static String NATIVEAPP_NAME = null;
59 //实例化本类的日志输出对象
60 public static Logger logger = Logger.getLogger(SelectDriver.class);
61
62 public AppiumDriver<WebElement> selectDriver(ITestContext context,AppiumUtil appiumUtil){
63 //通过testng的xml文件获取serverURL参数值,并赋给 serverURL变量
64 serverURL = context.getCurrentXmlTest().getParameter("serverURL");
65 //通过testng的xml文件获取automationName参数值,并赋给 automationName变量
66 automationName = context.getCurrentXmlTest().getParameter("automationName");
67 //通过testng的xml文件获取platformName参数值,并赋给 platformName变量
68 platformName = context.getCurrentXmlTest().getParameter("platformName");
69 //通过testng的xml文件获取platformVersion参数值,并赋给 platformVersion变量
70 platformVersion = context.getCurrentXmlTest().getParameter("platformVersion");
71 //通过testng的xml文件获取deviceName参数值,并赋给 deviceName变量
72 deviceName = context.getCurrentXmlTest().getParameter("deviceName");
73 //通过testng的xml文件获取androidAppPath参数值,并赋给 androidAppPath变量
74 androidAppPath = context.getCurrentXmlTest().getParameter("androidAppPath");
75 //通过testng的xml文件获取iosAppPath参数值,并赋给 iosAppPath变量
76 iosAppPath = context.getCurrentXmlTest().getParameter("iosAppPath");
77 //通过testng的xml文件获取appPackage参数值,并赋给 appPackage变量
78 appPackage = context.getCurrentXmlTest().getParameter("appPackage");
79 //通过testng的xml文件获取appActivity参数值,并赋给 appActivity变量
80 appActivity = context.getCurrentXmlTest().getParameter("appActivity");
81 //通过testng的xml文件获取unicodeKeyboard参数值,并赋给 unicodeKeyboard变量
82 unicodeKeyboard = Boolean.parseBoolean(context.getCurrentXmlTest().getParameter("unicodeKeyboard"));
83 //通过testng的xml文件获取resetKeyboard参数值,并赋给 resetKeyboard变量
84 resetKeyboard = Boolean.parseBoolean(context.getCurrentXmlTest().getParameter("resetKeyboard"));
85 //通过testng的xml文件获取sessionOverride参数值,并赋给 sessionOverride变量
86 sessionOverride = Boolean.parseBoolean(context.getCurrentXmlTest().getParameter("sessionOverride"));
87 //通过testng的xml文件获取sleepTime参数值,并赋给 sleepTime变量
88 sleepTime = Integer.valueOf(context.getCurrentXmlTest().getParameter("sleepTime"));
89 //通过testng的xml文件获取elementTimeOut参数值,并赋给 elementTimeOut变量
90 elementTimeOut = Integer.valueOf(context.getCurrentXmlTest().getParameter("elementTimeOut"));
91 //通过testng的xml文件获取appFilePath参数值,并赋给 appFilePath变量
92 appFilePath = context.getCurrentXmlTest().getParameter("appFilePath");
93 this.testContext = context;
94 capabilities = new DesiredCapabilities();
95 //告诉测试程序,当前项目目录在哪里
96 File classpathRoot = new File(System.getProperty("user.dir"));
97 //设置capability,以便和appium创建session
98 capabilities.setCapability("platformName",platformName);
复制代码
作者:
小小糖
时间:
2018-3-14 14:35
99 capabilities.setCapability("platformVersion",platformVersion);
100 capabilities.setCapability("deviceName",deviceName);
101 capabilities.setCapability("sessionOverride", sessionOverride);
102 //如果测试平台是android的话,执行下面这个if语句内容
103 if(platformName.equalsIgnoreCase("android")){
104 /**
105 * 设置和android 测试相关的capability并实例化driver对象
106 * */
107 File app = new File(classpathRoot, androidAppPath);
108 capabilities.setCapability("app", app.getAbsolutePath());
109 capabilities.setCapability("unicodeKeyboard", unicodeKeyboard);
110 capabilities.setCapability("resetKeyboard", resetKeyboard);
111 capabilities.setCapability("automationName",automationName);
112 capabilities.setCapability("appPackage", appPackage);
113 capabilities.setCapability("appActivity", appActivity);
114 driver = appiumUtil.getDriver(serverURL, capabilities,platformName);
115 testContext.setAttribute("APPIUM_DRIVER", driver);
116 logger.info(PropertiesDataProvider.getTestData(appFilePath, appPackage)+"已经启动");
117 driver.manage().timeouts().implicitlyWait(elementTimeOut, TimeUnit.SECONDS);
118 return driver;
119
120 //如果测试平台是ios的话,执行下面这个if语句内容
121 }else if(platformName.equalsIgnoreCase("ios")){
122 /**
123 * 设置和ios 测试相关的capability并实例化driver对象
124 * */
125 File app = new File(classpathRoot, iosAppPath);
126 capabilities.setCapability("app", app.getAbsolutePath());
127 //ios设置自动接收系统alert,注意IOS弹出的alert,APPIUM可以自动处理掉,支持ios8以上系统
128 capabilities.setCapability("autoAcceptAlerts", true);
129 driver = appiumUtil.getDriver(serverURL, capabilities,platformName);
130 testContext.setAttribute("APPIUM_DRIVER", driver);
131 driver.manage().timeouts().implicitlyWait(elementTimeOut,TimeUnit.SECONDS);
132
133 }else{
134 logger.error("初始化driver失败");
135 Assert.fail("初始化driver失败");
136 }
137
138 //最后返回dirver对象
139 return driver;
140
141
142 }
143
144
145 }
复制代码
5.有时候我们不想把太多的配置放到testng.xml中,我们就需要根据key读取属性文件里面的value值,现在res/下创建properties,里面有app.properties 和config.properties 两个文本,然后在utils下写一个方法获取value的值,类为:PropertiesDataProvider,代码如下:
复制代码
1 package com.young.appiumcombat.utils;
2
3 import org.apache.commons.configuration.Configuration;
4 import org.apache.commons.configuration.ConfigurationException;
5 import org.apache.commons.configuration.PropertiesConfiguration;
6
7 /**
8 * @author young
9 * @Desription 从.properties文件中读取相关测试数据<br>
10 *
11 * */
12 public class PropertiesDataProvider {
13
14 public static String getTestData(String configFilePath, String key) {
15 Configuration config = null;
16 try {
17 config = new PropertiesConfiguration(configFilePath);
18 } catch (ConfigurationException e) {
19 e.printStackTrace();
20 }
21 return String.valueOf(config.getProperty(key));
22
23 }
24 }
复制代码
6.html报告插件
哈,我们使用 http://www.cnblogs.com/sunny-sl/p/7451582.html这里的arrow的报告插件,在将CONFIGFILE值修改成res/properties目录下的 config.properties,代码如下:
1 retrycount=0
2 sourcecodedir=com/young/appiumcombat/testcases
3 sourcecodeencoding=UTF-8
复制代码
作者:
海海豚
时间:
2018-3-15 15:40
谢谢分享~
欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/)
Powered by Discuz! X3.2