Appium日常笔记

1,启动Android 设备:

   //启动

   

//   set up appium  

//   File classpathRoot = new File(System.getProperty("user.dir"));  

//   File appDir = new File(classpathRoot, "apps");  

//   File app = new File(appDir, "ContactManager.apk");  

   DesiredCapabilities capabilities = new DesiredCapabilities(); 

       capabilities.setCapability("device","Android");

//       capabilities.setCapability(CapabilityType.BROWSER_NAME, "");

       capabilities.setCapability("deviceName", "xiaomi-mi_3-02214788");//小米

//       capabilities.setCapability("deviceName", "52c7c049");//三星

//       capabilities.setCapability("deviceName", "614ad249");//红米

       capabilities.setCapability("platformVersion", "4.4.4");  

       capabilities.setCapability("platformName", "Android");  

//       capabilities.setCapability("app", app.getAbsolutePath());

       capabilities.setCapability("appPackage", "com.tencent.mm");  

       capabilities.setCapability("appActivity", "com.tencent.mm.ui.LauncherUI");  

       capabilities.setCapability("unicodeKeyboard", "True");  

       capabilities.setCapability("resetKeyboard", "True");  

       driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);

启动IOS设备:

DesiredCapabilities capabilities = new DesiredCapabilities();

//capabilities.setCapability(CapabilityType.BROWSER_NAME, "ios");

capabilities.setCapability(CapabilityType.VERSION, "8.1");

capabilities.setCapability(CapabilityType.PLATFORM, "Mac");

//capabilities.setCapability("device", "iPhone Simulator");

//capabilities.setCapability("app", "safai");

capabilities.setCapability("deviceName", "pohoto");

     capabilities.setCapability("platformName", "ios");

driver = new RemoteWebDriver(new URL("http://0.0.0.0:4723/wd/hub"), capabilities);

注:Appium内还需要配置一些东西,UDID/BundleID/Force Driver


寻找元素超时时间:

driver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS);


打印整个页面的元素:System.out.print(driver.getPageSource());


获取当前时间并截图,命名:

public static String getScreen(){

String fileRoute="//liyu/testing/test/";

SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd-HH-mm");

String picname=fileRoute+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); 

           String time=df.format(new Date()).toString();

           System.out.println("当前时间"+time);

           return time;

       } catch (IOException e) {

           e.printStackTrace();

       }

return null;

      

}


发送邮件:HTML/TXT(要把图片放到IIS路径拼接url)

public void mail() {

String value2="微信**系统: 本次**时间:"+getScreen();

String Value="<img src=\"http://172.17.6.134:88/test/"+getScreen()+".png\">";

System.out.print(Value);

String smtpHost ="172.17.1.23";

String from = "liyu@yiguo.com";

String to = "liyu@yiguo.com";

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

}

}

public static void sendMessage(String smtpHost,String from, String to, String subject, String messageText)throws MessagingException,java.io.UnsupportedEncodingException

{

// Step  :  Configure the mail session

System.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 message

System.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 message

Transport transport = mailSession.getTransport("smtp");

transport.connect(smtpHost, "liyu@yiguo.com", "5201314");

transport.sendMessage(testMessage, testMessage.getAllRecipients());

transport.close();

System.out.println("Message sent!");

}


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(); // 刷新


String 字符串截取转成int:

String getScreen="2015-02-05-16-44";

String Value="2015-02-05-16-49";

// int index= getScreen.substring(13, 1);

    String getScreen1 = getScreen.substring(14, 16);

    String  Value2 = Value.substring(14, 16);

System.out.print(getScreen1);

System.out.print(Value2);

    Integer.parseInt(getScreen1);

    Integer.parseInt(Value2);    

int sum =Integer.parseInt(Value2) -Integer.parseInt(getScreen1); 

System.out.print(sum);


 动作Action:

/***

* 切换WEB页面查找元素

*/

public static void switchtoWeb(){

try {

     Set<String> contextNames = demotestcase.driver.getContextHandles();

     for (String contextName : contextNames) {

       // 用于返回被测app是NATIVE_APP还是WEBVIEW,如果两者都有就是混合型App

       if(contextName.contains("WEBVIEW")||contextName.contains("webview")){

       demotestcase.driver.context(contextName);

       System.out.println("跳转到web页 开始操作web页面"); 

       }

     }

}catch (Exception e) {

     e.printStackTrace();

}

}

/***

* 上滑1/4屏幕

*/

public static void slideUP(){

int x=demotestcase.driver.manage().window().getSize().width;

int y=demotestcase.driver.manage().window().getSize().height;

demotestcase.driver.swipe(x/2, y/3*2, x/2, y/3*1, 0);

}

/***

* 下滑1/4屏幕

*/

public static void slideDown(){

int x=demotestcase.driver.manage().window().getSize().width;

int y=demotestcase.driver.manage().window().getSize().height;

demotestcase.driver.swipe(x/2, y/3*1, x/2, y/3*2, 0);

}

/***

* 左滑1/2屏幕

*/

public static void slideLeft(){

int x=demotestcase.driver.manage().window().getSize().width;

int y=demotestcase.driver.manage().window().getSize().height;

demotestcase.driver.swipe(x/4*3, y/2, x/4*1, y/2, 0);

}

/***

* 右滑1/2屏幕

*/

public static void slideRight(){

int x=demotestcase.driver.manage().window().getSize().width;

int y=demotestcase.driver.manage().window().getSize().height;

demotestcase.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=demotestcase.driver.manage().window().getSize().width;

int y=demotestcase.driver.manage().window().getSize().height;

demotestcase.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=demotestcase.driver.manage().window().getSize().width;

int y=demotestcase.driver.manage().window().getSize().height;

demotestcase.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=demotestcase.driver.manage().window().getSize().width;

int y=demotestcase.driver.manage().window().getSize().height;

demotestcase.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=demotestcase.driver.manage().window().getSize().width;

int y=demotestcase.driver.manage().window().getSize().height;

demotestcase.driver.swipe(x/4*2, y/10*i, x/4*3, y/10*i, 0);

}

/***

* xpath根据content-desc查找元素

* @param view的类型

* @param content-desc 的内容

* @return

*/

public static WebElement getViewbyXathwithcontentdesc(String view,String name){

return demotestcase.driver.findElementByXPath("//"+view+"[contains(@content-desc,'"+name+"')]");

}

/***

* xpath根据text查找元素

* @param view的类型

* @param text的内容

* @return

*/

public static WebElement getViewbyXathwithtext(String view,String name){

return demotestcase.driver.findElementByXPath("//"+view+"[contains(@text,'"+name+"')]");

}

/***

* 截图 文件名: 年月日时分秒

*/

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 = demotestcase.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 = demotestcase.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;

}

/***

* 检查网络

* @return 是否正常

*/

public static boolean checkNet(){

String text=demotestcase.driver.getNetworkConnection().toString();

if(text.contains("Data: true"))

return true;

else

return false;

}

/***

* 根据UIautomator底层方法得到对应desc的view

* @param desc名

* @return View

*/

public static WebElement getViewbyUidesc(String name){

return demotestcase.driver.findElementByAndroidUIAutomator("new UiSelector().descriptionContains(\""+name+"\")");

}

/***

* 根据UIautomator底层方法得到对应text的view

* @param text名

* @return View

*/

public static WebElement getViewbyUitext(String name){

return demotestcase.driver.findElementByAndroidUIAutomator("new UiSelector().textContains(\""+name+"\")");

}

/***

* 绝对坐标 传入长宽的像素点

* @param 宽度从左到右的像素点

* @param 长度从上到下的像素点

*/

public static void clickScreen(int i,int j){

int x=demotestcase.driver.manage().window().getSize().width;

int y=demotestcase.driver.manage().window().getSize().height;

demotestcase.driver.tap(1, i, j, 200);

}

/***

* 相对坐标 传入长宽的百分比

* @param 宽度从左到右的百分比

* @param 长度从上到下的百分比

*/

public static void clickScreen100(int i,int j){

int x=demotestcase.driver.manage().window().getSize().width;

int y=demotestcase.driver.manage().window().getSize().height;

demotestcase.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();

}

}

时间: 2024-12-21 03:17:28

Appium日常笔记的相关文章

.Net 转战 Android 4.4 日常笔记(5)--新软件Android Studio 0.5.8安装与配置及问题解决

原文:.Net 转战 Android 4.4 日常笔记(5)--新软件Android Studio 0.5.8安装与配置及问题解决 说真心话,Eclipse跟我们.net的VS比起来就是屌丝比高富帅,一切都是那么的难用,速度慢得我无法忍受 于是想试试Google钦点的Android Studio IDE工具,这跟ADT一样也是一套集成工具,也需要安装java JDK 1.下载最新的JDKhttp://developers.sun.com/downloads/ 我是下载JDK1.7版本,安装过程可

.Net 转战 Android 4.4 日常笔记(7)--apk的打包与反编译

原文:.Net 转战 Android 4.4 日常笔记(7)--apk的打包与反编译 apk(android package)就是我们安卓系统的安装文件,可以在模拟器和手机中直接打开安装,从项目中打包apk有几种方式可取 一.最简单的方法(类似我们的winfrom) 只要我们调试或者运行过项目,在项目下的bin debug下就有同名apk文件了(Eclipse)下是这样的.在Android下变成了\app\build\apk下了 当然我们不能把这个apk放在商店.没有签名会被人家的apk替换 二

.Net 转战 Android 4.4 日常笔记(6)--Android Studio DDMS用法

原文:.Net 转战 Android 4.4 日常笔记(6)--Android Studio DDMS用法 Android Studio DDMS与Eclipse DDMS大同小异,下面了解DDMS的使用 DDMS(Dalvik Debug Monitor Service )Dalvik调试监控服务 DDMS的作用 后台日志监控 系统线程监控 虚拟机状态.堆信息监控 模拟器文件监控 模拟拨打电话 模拟发送短信 模拟发送GPS位置信息 打开我们的DDMS  打开我们的helloworld程序,为按

.Net 转战 Android 4.4 日常笔记(1)--工具及环境搭建

原文:.Net 转战 Android 4.4 日常笔记(1)--工具及环境搭建 闲来没事做,还是想再学习一门新的技术,无论何时Android开发比Web的开发工资应该高40%,我也建议大家面对移动开发,我比较喜欢学习最新版本的,我有java的基础,但是年久,已经淡忘,以零基础学习,希望没有很多的语言闲话,爽快进入Android开发,只留下一个日常学习笔记,并不发布主页,相信这块在cnblog也是没人看的,如果你有兴趣,我们将共同学习,现在进入学习... 一.工欲善其事 必先利其器 先安装JDK7

.Net 转战 Android 4.4 日常笔记目录

原文:.Net 转战 Android 4.4 日常笔记目录 .Net 转战 Android 4.4 日常笔记(1)--工具及环境搭建 .Net 转战 Android 4.4 日常笔记(2)--HelloWorld入门程序 .Net 转战 Android 4.4 日常笔记(3)--目录结构分析 .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化 .Net 转战 Android 4.4 日常笔记(5)--新软件Android Studio 0.5.8安装与配置及问题解决 .N

.Net 转战 Android 4.4 日常笔记(9)--常用组件的使用方法[附源码]

原文:.Net 转战 Android 4.4 日常笔记(9)--常用组件的使用方法[附源码] 经过两天的学习,把常用的组件都学习了一遍,并做成了App 学习可能真没有捷径,跟学习html有点类似,都是一个控件一个控件学习并使用,最后拼凑成一个系统 链接:http://pan.baidu.com/s/1hqefzEW 密码:zbel  最低API 2.3 目标API 4.4 采用Android Studio 0.58IDE 希望给和我同样的初学者带来一些便利,和开发时候可以查询,第一个版本可能比较

.Net 转战 Android 4.4 日常笔记(8)--常见事件响应及实现方式

原文:.Net 转战 Android 4.4 日常笔记(8)--常见事件响应及实现方式 在Andrioid开发中,常见的事件如下 单击事件 OnClickListener 长按事件 OnLongClickListener 滑动事件 OnTouchListenner 键盘事件 OnKeyListenner 焦点事件 setOnFoucsChangeListener 设置方式 1.动态设置(最常用的方式) Button btn = (Button) findViewById(R.id.btnTest

.Net 转战 Android 4.4 日常笔记(3)--目录结构分析

原文:.Net 转战 Android 4.4 日常笔记(3)--目录结构分析 看了创建项目后,出现的文件夹很多确实有点晕,不过经过简单的了解还是跟我们asp.net的目录有点相识滴. 下面这张图,概括了主要的文件用途.其实也只需要了解这几个就差不多了,知道在那里设计界面,那里写代码就差不多了 我们在学习asp.net也没有刻意去了解bin下的dll吧 全局配置文件,视图,控制层都还是比较容易理解,同样有样式,图片,资源文件等等,但是Android把这些资源文件注册到R.java里面,所以我们要通

.Net 转战 Android 4.4 日常笔记(2)--HelloWorld入门程序

原文:.Net 转战 Android 4.4 日常笔记(2)--HelloWorld入门程序 我不知道人们为什么那么喜欢用HelloWorld来做为自己的第一个程序入门,为什么不是hello **其他的东西或者hi. 一.打开ADT 的Eclipse开发工具新建一个Android项目 New----> Android Application Project Minimum Required SDK这个是运行hello world的最低android版本 Target SDK是现在的目标版本 Co