Appium 日常干货分享
来源:互联网 发布:python绝技 pdf 中文 编辑:程序博客网 时间:2024/05/19 04:04
Appium 日常干货分享
最新的 io.appium java -client 升级到5.0 了 ,有些 方法没来得及更新。
Capabilities 配置(Android):
public void StartUp() throws InterruptedException, IOException { DesiredCapabilities capabilities = new DesiredCapabilities(); capabilities.setCapability("device","Android"); capabilities.setCapability("deviceName", "192.168.57.101:5555"); capabilities.setCapability("udid", "192.168.57.101:5555"); capabilities.setCapability("platformVersion", "6.0"); capabilities.setCapability("appPackage", "com.sds.android.ttpod"); capabilities.setCapability("appActivity", "com.ali.music.entertainment.splash.SplashActivity"); //capabilities.setCapability(MobileCapabilityType.APP, "链接地址");//引用apk下载地址 capabilities.setCapability("unicodeKeyboard", "True"); capabilities.setCapability("resetKeyboard", "True"); capabilities.setCapability("autoAcceptAlerts", true);// 自动接受提示信息 driver = new AndroidDriver<>(new URL("http://"+ip+":"+port+"/wd/hub"), capabilities); driver.manage().timeouts().implicitlyWait(40, TimeUnit.SECONDS); }
Capabilities 配置(IOS):
public void SetIosDriverSession(Capabilities cap) throws MalformedURLException, InterruptedException { DesiredCapabilities capabilities = new DesiredCapabilities(); capabilities.setCapability(CapabilityType.BROWSER_NAME, ""); capabilities.setCapability("platformName", "iOS"); capabilities.setCapability("newCommandTimeout", "30000"); capabilities.setCapability("deviceName", cap.getDriverkey()); capabilities.setCapability("platformVersion", cap.getDriverVersion()); capabilities.setCapability("app", "/Users/liyu/Documents/TTEntertainment-iOS.app"); capabilities.setCapability("autoAcceptAlerts", "True"); capabilities.setCapability("unicodeKeyboard", "True"); capabilities.setCapability("resetKeyboard", "True"); try { driver= new IOSDriver(new URL("http://"+cap.getIp()+":"+cap.getProt()+"/wd/hub"), capabilities); driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); } catch (MalformedURLException e) { e.printStackTrace(); } driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); Thread.sleep(10000);}
UiSelector text
driver.findElementByAndroidUIAutomator("new UiSelector().text(\"Custom View"\")").click();
UiSelector textContains 全局文本匹配
driver.findElementByAndroidUIAutomator("new UiSelector().textContains(\"发现\")").click();
UiSelector textMatches
driver.findElementByAndroidUIAutomator("new UiSelector().textMatches(\"^Custom.*\")").click();
UiSelector textStartsWith
driver.findElementByAndroidUIAutomator("new UiSelector().textStartsWith(\"Custom\")").click();
检查网络
/**** 检查网络* @return 是否正常*/public static boolean checkNet(){String text=driver.getNetworkConnection().toString();if(text.contains("Data: true"))return true;elsereturn false;}
desc的view
/**** 根据UIautomator底层方法得到对应desc的view* @param desc名* @return View*/public static WebElement getViewbyUidesc(String name){return driver.findElementByAndroidUIAutomator("new UiSelector().descriptionContains(\""+name+"\")");}
得到对应text的view
/**** 根据UIautomator底层方法得到对应text的view* @param text名* @return View*/public static WebElement getViewbyUitext(String name){return driver.findElementByAndroidUIAutomator("new UiSelector().textContains(\""+name+"\")");}
超时时间:
driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS);
打印整个页面PageSource:
System.out.print(driver.getPageSource());
获取当前时间并截图,命名:
public static String getScreen(){String fileRoute="路径";SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmm");String picname=fileRoute+df.format(new Date()).toString()+".png"; File screen = driver.getScreenshotAs(OutputType.FILE); System.out.println(picname); File screenFile = new File(picname); try { FileUtils.copyFile(screen, screenFile); String time=df.format(new Date()).toString(); System.out.println("当前时间"+time); return time; } catch (IOException e) { e.printStackTrace(); }return null;
}
APP内上滑:
driver.swipe(250, 300, 250, 1400, 0);
APP内上滑:
driver.swipe(250,1400, 250,300 , 0);
WebView navigate 操作
//driver.navigate().forward(); // 前进//driver.navigate().back(); // 后退driver.navigate().refresh(); // 刷新``
切换WEBVIEW
/**** 切换WEB页面查找元素*/public static void switchtoWeb(){try { Set<String> contextNames = driver.getContextHandles(); for (String contextName : contextNames) { // 用于返回被测app是NATIVE_APP还是WEBVIEW,如果两者都有就是混合型App if(contextName.contains("WEBVIEW")||contextName.contains("webview")){ driver.context(contextName); System.out.println("跳转到web页 开始操作web页面"); } }}catch (Exception e) { e.printStackTrace();}}
滑动相关
/**** 上滑1/4屏幕*/public static void slideUP(){int x=driver.manage().window().getSize().width;int y=driver.manage().window().getSize().height;driver.swipe(x/2, y/3*2, x/2, y/3*1, 0);}/**** 下滑1/4屏幕*/public static void slideDown(){int x=driver.manage().window().getSize().width;int y=driver.manage().window().getSize().height;driver.swipe(x/2, y/3*1, x/2, y/3*2, 0);}/**** 左滑1/2屏幕*/public static void slideLeft(){int x=driver.manage().window().getSize().width;int y=driver.manage().window().getSize().height;driver.swipe(x/4*3, y/2, x/4*1, y/2, 0);}/**** 右滑1/2屏幕*/public static void slideRight(){int x=driver.manage().window().getSize().width;int y=driver.manage().window().getSize().height;driver.swipe(x/4*1, y/2, x/4*3, y/2, 0);}/**** 特殊上滑* @param 传入从左到右宽度的百分比(1-99之间)*/public static void slideUP(int i){Assert.assertFalse("上滑宽度传入错误", i<=0||i>=100);int x=driver.manage().window().getSize().width;int y=driver.manage().window().getSize().height;driver.swipe(x/10*i, y/3*2, x/10*i, y/3*1, 0);}/**** 特殊下滑* @param 传入从左到右宽度的百分比(1-99之间)*/public static void slideDown(int i){Assert.assertFalse("下滑宽度传入错误", i<=0||i>=100);int x=driver.manage().window().getSize().width;int y=driver.manage().window().getSize().height;driver.swipe(x/10*i, y/3*1, x/10*i, y/3*2, 0);}/**** 特殊左滑* @param 传入从上到下宽度的百分比(1-99之间)*/public static void slideLeft(int i){Assert.assertFalse("左滑宽度传入错误", i<=0||i>=100);int x=driver.manage().window().getSize().width;int y=driver.manage().window().getSize().height;driver.swipe(x/4*3, y/10*i, x/4*2, y/10*i, 0);}/**** 特殊右滑* @param 传入从上到下宽度的百分比(1-99之间)*/public static void slideRight(int i){Assert.assertFalse("左滑宽度传入错误", i<=0||i>=100);int x=driver.manage().window().getSize().width;int y=driver.manage().window().getSize().height;driver.swipe(x/4*2, y/10*i, x/4*3, y/10*i, 0);}
content-desc定位
/**** 根据content-desc查找元素* @param view的类型* @param content-desc 的内容* @return*/public static WebElement getViewbyXathwithcontentdesc(String view,String name){return driver.findElementByXPath("//"+view+"[contains(@content-desc,'"+name+"')]");}
根据xpath text查找元素
/**** 根据text查找元素* @param view的类型* @param text的内容* @return*/public static WebElement getViewbyXathwithtext(String view,String name){return driver.findElementByXPath("//"+view+"[contains(@text,'"+name+"')]");}### 截图 文件名: 年月日时分秒``` java/**** 截图 文件名: 年月日时分秒*/public static String getScreen(){SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");String picname=finalElement.phoneScreens+df.format(new Date()).toString()+".png";//picname=picname.replaceAll(":", "-");//picname=picname.replaceAll(" ", "-"); File screen = driver.getScreenshotAs(OutputType.FILE); System.out.println(picname); File screenFile = new File(picname); try { FileUtils.copyFile(screen, screenFile); } catch (IOException e) { e.printStackTrace(); }return picname;}
截图
/**** 截图 文件名: 内容-年月日时分秒*/public static String getScreen(String name){SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");String picname=finalElement.phoneScreens+name+df.format(new Date()).toString()+".png"; File screen = driver.getScreenshotAs(OutputType.FILE); System.out.println(picname); File screenFile = new File(picname); try { FileUtils.copyFile(screen, screenFile); } catch (IOException e) { e.printStackTrace(); } return picname;}
绝对坐标 传入长宽的像素点
/**** 绝对坐标 传入长宽的像素点* @param 宽度从左到右的像素点* @param 长度从上到下的像素点*/public static void clickScreen(int i,int j){int x=driver.manage().window().getSize().width;int y=driver.manage().window().getSize().height;driver.tap(1, i, j, 200);}
相对坐标 传入长宽的百分比
/**** 相对坐标 传入长宽的百分比* @param 宽度从左到右的百分比* @param 长度从上到下的百分比*/public static void clickScreen100(int i,int j){int x=driver.manage().window().getSize().width;int y=driver.manage().window().getSize().height;driver.tap(1, x*i/100, y*j/100, 200);}
预留示例
/**** log记录* @param 图片保存路径* @param Exception参数* @param AssertionError参数* @param 测试用例名*/public static void getlog(String text, Exception error, AssertionError assertError, String testname){SimpleDateFormat df = new SimpleDateFormat("MM-dd-HH-mm");System.out.println("当前时间"+df.format(new Date()));String filename=finalElement.errorfile+testname+"-"+df.format(new Date()).toString()+".txt";File file=new File(finalElement.errorfile);if(!file.exists())file.mkdirs();try { File f = new File(filename); if (!f.exists()) f.createNewFile();FileWriter fw = new FileWriter(f, true);PrintWriter pw = new PrintWriter(fw);pw.append(testname+" 测试failed\r\n");pw.append("截图保存为:"+text+"\r\n");try{pw.append("eclipse报错为:\n"+error.toString()+"\r\n");error.printStackTrace(pw);} catch (Exception e){}try{pw.append("断言报错为:"+assertError.toString()+"\r\n");assertError.printStackTrace(pw);} catch (Exception e){} pw.flush();pw.close();file=new File(finalElement.errorlog);if(!file.exists())file.mkdirs();String cmd="cmd /c \"adb logcat -d *:E *:S |grep \"com.yiguo.app\" >"+finalElement.errorlog+testname+"-"+df.format(new Date()).toString()+".txt\"";//System.out.println(cmd);Runtime.getRuntime().exec(cmd);} catch (Exception e) {e.printStackTrace();}}
发送邮件:HTML/TXT(要把图片放到IIS路径拼接url)
public void mail(String Value, String subject ) {String smtpHost ="172.17.1.23";String from = "mail";String to = "mail";String subject = value2; //subject javamail自动转码StringBuffer theMessage = new StringBuffer();theMessage.append("<h2><font color=red>**截图:</font></h2>");theMessage.append("<hr>");theMessage.append(Value);try {Mail.sendMessage(smtpHost, from, to, subject, theMessage.toString());}catch (javax.mail.MessagingException exc) {exc.printStackTrace();}catch (java.io.UnsupportedEncodingException exc) {exc.printStackTrace();}}``` javapublic static void sendMessage(String smtpHost,String from, String to, String subject, String messageText)throws MessagingException,java.io.UnsupportedEncodingException{// Step : Configure the mail sessionSystem.out.println("Configuring mail session for: " + smtpHost);java.util.Properties props = new java.util.Properties();props.setProperty("mail.smtp.auth", "true");//指定是否需要SMTP验证props.setProperty("mail.smtp.host", smtpHost);//指定SMTP服务器props.put("mail.transport.protocol", "smtp");Session mailSession = Session.getDefaultInstance(props);mailSession.setDebug(true);//是否在控制台显示debug信息// Step : Construct the messageSystem.out.println("Constructing message - from=" + from + " to=" + to);InternetAddress fromAddress = new InternetAddress(from);InternetAddress toAddress = new InternetAddress(to);MimeMessage testMessage = new MimeMessage(mailSession);testMessage.setFrom(fromAddress);testMessage.addRecipient(javax.mail.Message.RecipientType.TO, toAddress);testMessage.setSentDate(new java.util.Date());testMessage.setSubject(MimeUtility.encodeText(subject,"gb2312","B"));testMessage.setContent(messageText, "text/html;charset=gb2312");System.out.println("Message constructed");// Step : Now send the messageTransport transport = mailSession.getTransport("smtp");transport.connect(smtpHost, "liyu@yiguo.com", "5201314");transport.sendMessage(testMessage, testMessage.getAllRecipients());transport.close();System.out.println("Message sent!");}
欢迎一起交流,一起进步 可以关注我的微信公众号:“测试开发进阶” - 点我关注
0 0
- Appium 日常干货分享
- Appium日常笔记
- 干货分享
- android日常干货
- 技术资料干货大分享!
- 创业建议干货分享
- GitHub干货分享
- 分享一些ios干货
- 跨境电商干货分享
- 技术干货分享
- 干货资料站点分享
- web 开发干货分享
- iOS干货分享
- github干货地址分享
- 记录appium基于python的日常问题
- QQ营销的干货分享
- Eclipse开发必备干货分享
- CTR点击率预估干货分享
- USACO 2017 January Contest, Gold Problem 1. Balanced Photo
- hololens
- Spring MVC常用的注解
- KM算法
- 单页应用跳转实现浅析-demo篇
- Appium 日常干货分享
- Vector,ArrayList,LinkedList,SynchronizedList
- splinter安装与入门
- Java事务处理全解析(四)—— 成功的案例(自己实现一个线程安全的
- Service
- 阿里中间件技术栈与架构师能力图
- javafx日期控件
- 数据结构-类似并查集建
- 图论矩乘——BZOJ1706/Luogu2886 [USACO07NOV]Cow Relays