appium精简教程

环境配置

package appium;

import io.appium.java_client.android.*;

import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.TimeUnit;

import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
//import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.JavascriptExecutor;
import org.testng.Assert;
//import org.testng.annotations.Test;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.AfterTest;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
import java.util.*;


public class appium {
    private AndroidDriver dr;
    private String reportPath = "C:\inetpub\wwwroot\Content\Images\";
    private int sleepBase = 1000;
    public String port;
    public String udid;
    public String pver;
    
    @BeforeTest  //must be j2se-1.5
    @Parameters({ "port", "udid" , "pver"})
    public void beforeSuite(String port, String udid, String pver) {
    //public void beforeSuite() {
        this.port = port;
        this.udid = udid;
        this.pver = pver;
        
        //this.port = "4723";
        //this.udid = "0123456789ABCDEF";
        //this.pver = "4.4";
    }
    @Test 
    public void TC_001() throws InterruptedException, MalformedURLException
    {
       try
       {
         LaunchApp();
         
         //Step1: go to view
         ClickByIndex("android.widget.ImageView", 6, "回单验证");
         
         //Step2: fill the form ; To do: put the input text into XML
         java.util.List<WebElement> arrEditText= dr.findElementsByClassName("android.widget.EditText");
         arrEditText.get(0).sendKeys("3243243255");
         arrEditText.get(1).sendKeys("1112312345123451234512345456");
         arrEditText.get(2).sendKeys("221234512345123456");
         
         InputkeyboardNum(arrEditText.get(3));
         
         arrEditText.get(4).sendKeys("441234123451234556");
         arrEditText.get(5).sendKeys("551234123451234556");
         PrintScreen(reportPath+udid+"_填写表单.jpg");
         
         //Step3: click search
         ClickByID("com.boc.bocsoft.phone:id/btn_receipt_ok", "点击查询");
         
         //Step4: check the string
         PrintScreen(reportPath+udid+"_回单验证查询.jpg");
         String text = dr.findElementById("com.boc.bocsoft.phone:id/tv_receipt_result_one_show_no").getText();
         Assert.assertEquals(text, "没有符合查询条件的交易回单");
       }
       catch(Exception e)
       {
           e.printStackTrace();           
       }
    }  
    
    @Test
    public void TC_002() throws InterruptedException, MalformedURLException
    {      
        Login();
        
        //Step1: go to view
            ClickByIndex("android.widget.ImageView", 3, "转账汇款");
        
        //Step2: fill the form      
        ClickByID("com.boc.bocsoft.phone:id/text_function_menu_child", "对公单笔汇款");
        ClickByID("com.boc.bocsoft.phone:id/payee_picker", "选择收款人");
        ClickByIndex("android.widget.TextView",2, "签约收款人");
        ClickByIndex("android.widget.TextView",8, "选择签约收款人");
        
        InputkeyboardNum(dr.findElementById("com.boc.bocsoft.phone:id/item_content"));
        
        //ClickByID("com.boc.bocsoft.phone:id/pick_indicator", "输入用途");
        //dr.findElementById("com.boc.bocsoft.phone:id/usage_content").sendKeys("输入中文用途");
        //dr.sendKeyEvent(4);        
        //ClickByID("com.boc.bocsoft.phone:id/confirm", "确定");

        for(int i =0; i< 3;i++)
        {
            swipeScreen(716.0, 988.0, 530.0, 504.0, 0.5, 4, dr);
            dr.swipe(716, 988, 530, 504, 1);
        }
        
        ClickByID("com.boc.bocsoft.phone:id/submit", "提交");
        String expect = dr.findElementById("com.boc.bocsoft.phone:id/result_info").getText();
        System.out.println(expect);
        
        ClickByID("com.boc.bocsoft.phone:id/main_iv_bank", "主页");
        ClickByIndex("android.widget.ImageView", 3, "转账汇款");
        ClickByIndex("android.widget.TextView", 9, "网银操作记录查询");
        ClickByID("com.boc.bocsoft.phone:id/operation_record_trade_query", "查询网银操作记录");
        List<WebElement> arrActual = dr.findElementsById("com.boc.bocsoft.phone:id/review_amount");
        String actual = arrActual.get(arrActual.size()-1).getText();
        System.out.println(actual);
        Assert.assertTrue(expect.contains(actual), "expect: " + expect + " ; actual: " + actual);
    }
    
//basic operation
    private void ClickByID(String id, String log) throws InterruptedException, MalformedURLException
    {
        Thread.sleep(2000);
        System.out.println("Click " + log);
        dr.findElementById(id).click();
        Thread.sleep(sleepBase * 5);
        PrintScreen(reportPath+udid+ "_" + log + ".jpg");
    }
    private void ClickByIndex(String className, int index, String log) throws InterruptedException, MalformedURLException
    {
        Thread.sleep(2000);
        java.util.List<WebElement> arr= dr.findElementsByClassName(className);
        arr.get(index).click();
        System.out.println("Click " + log);
        Thread.sleep(sleepBase * 5);
        PrintScreen(reportPath+udid+ "_" + log + ".jpg");
    }
    private void SendKeysByID(String id, String keys) throws InterruptedException, MalformedURLException
    {
        System.out.println("Send " + keys);
        dr.findElementById(id).sendKeys(keys);
        Thread.sleep(1000);
    }
    
    private void Tappoint(int x, int y) throws InterruptedException, MalformedURLException
    {
        System.out.println("Tappoint: " + x + " , " + y);
        dr.tap(1, x, y, 100);
        Thread.sleep(1000);    
        
    }
    private void PrintScreen(String fileName) throws InterruptedException, MalformedURLException
    {
        System.out.println(fileName);
        
        File file= null;
        try
        {
           file= dr.getScreenshotAs(OutputType.FILE);
            FileUtils.copyFile(file, new File(fileName));
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
        }             
    }
    
    //
    public static void swipeScreen(Double startX, Double startY, Double endX,
            Double endY, Double duration, int repeat, AndroidDriver driver) {
            JavascriptExecutor js = (JavascriptExecutor) driver;
            java.util.HashMap<String, Double> swipeObj = new java.util.HashMap<String, Double>();
            swipeObj.put("startX", startX);
            swipeObj.put("startY", startY);
            swipeObj.put("endX", endX);
            swipeObj.put("endY", endY);
            for (int i = 0; i < repeat; i++) {
                try {
                    js.executeScript("mobile: flick", swipeObj);
                } catch (Exception ex) {
                    System.out.println("滑动屏幕失败");
                }
            }
        }
    public static void scroll(String direction, AndroidDriver driver) {
        JavascriptExecutor js = (JavascriptExecutor) driver;
        java.util.HashMap<String, String> scrollObject = new java.util.HashMap<String, String>();
        scrollObject.put("direction", direction);
        js.executeScript("mobile: scroll", scrollObject);
    }


//app operation
    private void LaunchApp() throws InterruptedException, MalformedURLException
    {
        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability(CapabilityType.BROWSER_NAME, "");
        capabilities.setCapability("deviceName", udid);
        capabilities.setCapability("udid", udid);
        capabilities.setCapability("platformVersion", pver);
        capabilities.setCapability("platformName", "Android");
        //aapt.exe dump badging apkPath
        capabilities.setCapability("appPackage", "com.boc.bocsoft.phone");
        capabilities.setCapability("appActivity", "com.boc.bocsoft.phone.activity.business.splash.MEBSplashActivity"); 
        capabilities.setCapability("unicodeKeyboard", "True");  //for input Chinese      
        capabilities.setCapability("resetKeyboard", "True");
        
        dr = new AndroidDriver(new URL("http://127.0.0.1:" + port + "/wd/hub"),capabilities);
        Thread.sleep(sleepBase * 10);  
        PrintScreen(reportPath+udid+"_Launch.jpg");
    }
    private void ExitAppium()
    {
        if(dr != null)
        {
            dr.closeApp();    
        }
    }
    private void Login() throws InterruptedException, MalformedURLException
    {
            try
            {
                LaunchApp();
                ClickByID("com.boc.bocsoft.phone:id/main_title_right_btn", "登录");
                SendKeysByID("com.boc.bocsoft.phone:id/et_login_user_name", "jqhd001");
                //SendKeysByID("com.boc.bocsoft.phone:id/sipbox_login_password", "0123456789abc");
                //SendKeysByID("com.boc.bocsoft.phone:id/sipbox_login_verifys", "456789");
                
                dr.findElementById("com.boc.bocsoft.phone:id/sipbox_login_password").click();
                Thread.sleep(3000);
                for(int i=0;i<5;i++)
                {
                    Tappoint(60,1360);
                    Tappoint(160,1360);
                }
                dr.sendKeyEvent(4);
                
                dr.findElementById("com.boc.bocsoft.phone:id/sipbox_login_verifys").click();
                Thread.sleep(1000);
                for(int i=0;i<6;i++)
                {
                    Tappoint(178,1360);
                }
                dr.sendKeyEvent(4);
                
                PrintScreen(reportPath+udid+"_登录.jpg");
                ClickByID("com.boc.bocsoft.phone:id/tv_login_submits", "点击登录");
                
                //wait for login: appium will automatic shutdown if no new cmd in 60s
                System.out.println("Wait 100s for login");
                WebElement loginSign = null;
                for(int i=0;i<5;i++)
                {
                    Thread.sleep(20000);
                    Tappoint(0,0);
                    
                    try{
                    loginSign = dr.findElementById("com.boc.bocsoft.phone:id/btn_dialog_error_enter");}
                    catch(Exception e){}
                    
                    if(loginSign != null)
                    {
                        System.out.println("Login done ! " + loginSign);
                        ClickByID("com.boc.bocsoft.phone:id/btn_dialog_error_enter", "修改密码提示");
                        return;
                    }
                }
            }
            catch(Exception e){}
        //to do: we may have to retry 3 times because login always failed by bad network
    }
    private void InputkeyboardNum(WebElement ele) throws InterruptedException, MalformedURLException
    {
        System.out.println("software keyboard: input 123");
        ele.click();
        Thread.sleep(2000);
        //int x = dr.manage().window().getSize().width;
        //int y = dr.manage().window().getSize().height;     
        Tappoint(137, 1330);
        Tappoint(414, 1330);
        Tappoint(670, 1330);
        Tappoint(940, 1670);
        System.out.println("Input done");
    }
    
    @AfterTest
    public void afterTest()
    {
        ExitAppium();
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<suite name="Suite1">
  <parameter name = "port" value = "4723"/>
  <parameter name = "udid" value = "0123456789ABCDEF"/>
  <parameter name = "pver" value = "4.4"/> 
  <test name="Test">
    <classes>
      <class name="appium.appium"/>
    </classes>
  </test> <!-- Test -->
</suite> <!-- Suite -->
原文地址:https://www.cnblogs.com/hbreset/p/4502658.html