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);
//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