Appium

环境搭建地址:https://www.cnblogs.com/ydnice/p/5787800.html

这个算是比较齐全的了,不过有一点一定要注意——node版本、node版本、node版本!!!

我就是因为node版本问题导致环境搭建失败,这个里面没有写,可以去node官网查看版本的对应关系

在appium自动化脚本编写的过程中,合理正确的使用api事半功倍,下面介绍使用的语言是Java,appium的版本是1.3.4,java-client的版本是java-client-2.1.0。

第一:AndroidDriver的使用,其已经继承了AppiumDriver。

private AndroidDriver driver;

@Before        public void setUp() throws Exception {               

 DesiredCapabilities capabilities = new DesiredCapabilities();                capabilities.setCapability("Name", "Android Emulator");                capabilities.setCapability("platformVersion", "4.4");                capabilities.setCapability("platformName", "Android");                capabilities.setCapability("appPackage", "com.android.settings");                capabilities.setCapability("appActivity", ".Settings");                

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

 public void tearDown() throws Exception {                

driver.quit();      

  }

2.截屏并保存至本地

//截屏并保存至本地                

File screen = driver.getScreenshotAs(OutputType.FILE);                

File screenFile = new File("d:\\screen.png");               

 try {                        

FileUtils.copyFile(screen, screenFile); //commons-io-2.0.1.jar中的} 

catch (IOException e) {                        

e.printStackTrace();                

}

3.push文件、pull文件

File file = new File("d:\\test.txt"); //test.txt内容为"test"                String content = null;                try {                        content = FileUtils.readFileToString(file);                } catch (IOException e) {                        e.printStackTrace();                }                                byte[]= Base64.encodeBase64(content.getBytes());                driver.pushFile("sdcard/test.txt", data);                                byte[] resultDate = driver.pullFile("sdcard/test.txt");                System.out.println(new String(Base64.decodeBase64(resultDate))); //打印结果为"test"

4.

        //获取当前界面的activity,可用于断言是否跳转到预期的activity

        driver.currentActivity();

5.

        //打开通知栏界面

        driver.openNotifications();

6.

//获取网络状态        int= driver.getNetworkConnection().value;        System.out.println(status);        //设置网络状态        driver.setNetworkConnection(new NetworkConnectionSetting(status));        //或者        driver.setNetworkConnection(new NetworkConnectionSetting(false, true, false));

7.

        //启动其他应用,跨APP

        driver.startActivity("com.android.camera", ".CameraLauncher");

8.

        //自动滑动列表

        driver.scrollTo("text");

        //或者

        driver.scrollToExact("text");

9.

                //安装APP

                driver.installApp(appPath);


                //判断应用是否已安装

                driver.isAppInstalled("package name");

10.

//拖动图标至日历图标位置        new TouchAction(driver).longPress(driver.findElementByName("相机"))        .moveTo(driver.findElementByName("日历")).release().perform();

11.

                //锁屏

                driver.lockScreen(2);


                //判断是否锁屏

                driver.isLocked();

12.

                //发送按键事件

                driver.sendKeyEvent(AndroidKeyCode.HOME);

13.

 //通过uiautomator定位clickable属性为true的元素并点击                driver.findElementByAndroidUIAutomator("new UiSelector().clickable(true)").click();                          //相同属性的元素使用List存放                

List elements = driver.findElementsByClassName("class name");                elements.get(0).click(); //点击List中的第一个元素                //,点击元素位置                driver.tap(1, driver.findElementByName("日期和时间"), 0);



初始化完成以后可以使用driver进行各种操作——

1、按压控件

方法:

press()

开始按压一个元素或坐标点(x,y)。通过手指按压手机屏幕的某个位置。

press(WebElement el, int x, int y)

press也可以接收屏幕的坐标(x,y)。

例:

TouchAction(driver).press(x=0,y=308).release().perform()

除了press()方法之外,本例中还用到了别外两个新方法。

release() 结束的行动取消屏幕上的指针。

Perform() 执行的操作发送到服务器的命令操作。

2、长按控件

方法:

longPress()

开始按压一个元素或坐标点(x,y)。 相比press()方法,longPress()多了一个入参,既然长按,得有按的时间吧。duration以毫秒为单位。1000表示按一秒钟。其用法与press()方法相同。

longPress(WebElement el, int x, int y, Duration duration)

例:

TouchAction action =newTouchAction(driver);

action.longPress(names.get(200),1000).perform().release();

action.longPress(200,200,1000).perform().release();

3、点击控件

方法:

tap()

对一个元素或控件执行点击操作。用法参考press()。

tap(WebElement el, int x, int y)

例:

TouchAction action =newTouchAction(driver);

action.tap(names.get(200)).perform().release();

action.tap(200,200).perform().release();

4、移动

方法:

moveTo()

将指针(光标)从过去指向指定的元素或点。

movTo(WebElement el, int x, int y)

其用法参考press()方法。

例:

TouchAction action =newTouchAction(driver);

action.moveTo(names.get(200)).perform().release();

action.moveTo(200,200).perform().release();

5、暂停

方法:

wait()

暂停脚本的执行,单位为毫秒。

action.wait(1000);



最后附上一部分实例代码————————

public static DesiredCapabilities setCapsforMobileBrowser(DesiredCapabilities capabilities) {

        capabilities = new DesiredCapabilities();

        capabilities.setCapability(MobileCapabilityType.APPIUM_VERSION, "1.9.0");//appium版本

        capabilities.setCapability(MobileCapabilityType.DEVICE_NAME, "2b2dc1d4ea9e67eb");

        capabilities.setCapability(MobileCapabilityType.PLATFORM_VERSION, "4.4.2");

        capabilities.setCapability("platformName", "Android");//平台

        capabilities.setCapability("appPackage", "com.ireader.pad");//包名

        capabilities.setCapability("appActivity", "com.ireader.pad.business.splash.WelcomeActivity");

        capabilities.setCapability("unicodeKeyboard", true); //中文输入

        capabilities.setCapability("resetKeyboard", true); //重置输入法

        capabilities.setCapability("noSign", true);  //无需重复签名

        capabilities.setCapability("noRest", true); //无需重启

        //capabilities.setCapability("fullReset", true); //卸载清除文件

        return capabilities;

    }


/*

  * 截图

  * */

    public static String screenShot() {

        String time = new SimpleDateFormat("yyyyMMdd-HHmmss").format(new Date());

        String screenShotPath = dir + File.separator + time + ".png";

        try {

            File sourceFile = driver.getScreenshotAs(OutputType.FILE);

            FileUtils.copyFile(sourceFile, new File(screenShotPath));

        } catch (Exception e) {

            e.printStackTrace();

            return "Failed to screenshot";

        }

        return screenShotPath.replace("\\", "/");

    }


/*

    * 上划

    * */

    public void swipeToUp(AndroidDriver driver) {

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

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

        TouchAction action1 = new TouchAction(driver).press(PointOption.point(width / 2, height * 3 / 4)).waitAction(WaitOptions.waitOptions(duration))

                .moveTo(PointOption.point(width / 2, height / 4)).release();

        action1.perform();

    }

    /*

    * 左滑

    * */

    public void swipeToLeft(AndroidDriver driver) {

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

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

        TouchAction action3 = new TouchAction(driver);

        action3.press(PointOption.point(width * 4 / 5, height / 2)).waitAction(WaitOptions.waitOptions(duration))

                .moveTo(PointOption.point(width / 5, height / 2)).release();

        action3.perform();

    }


public void login() {

        driver.findElement(By.id("com.ireader.pad:id/next_btn")).click();

        driver.findElement(By.id("com.ireader.pad:id/know_btn")).click();

        try {

            //强制等待

            Thread.sleep(1000);

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

        //元素是否已显示

        if (driver.findElement(By.id("com.ireader.pad:id/know_btn")).isDisplayed()) {

            driver.findElement(By.id("com.ireader.pad:id/know_btn")).click();

        }

        //返回

        if (driver.findElement(By.id("android:id/up")).isDisplayed()) {

            driver.findElement(By.id("android:id/up")).click();

        }

        //手机号登陆

        driver.findElement(By.id("com.ireader.pad:id/rl_selectlogin_mobile")).click();

        //账号密码登陆

        //driver.findElement(By.id("com.ireader.pad:id/rl_selectlogin_studentno")).click();

        //输入

        /*AndroidElement phone = driver.findElement(By.id("com.ireader.pad:id/le_smslogin_mobile"));

        phone.sendKeys("17600868885");

        AndroidElement code = driver.findElement(By.id("com.ireader.pad:id/le_smslogin_code"));

        code.setValue("1234");

        AndroidElement sms = driver.findElement(By.id("com.ireader.pad:id/le_smslogin_sms"));

        sms.replaceValue("123456");*/

        List<AndroidElement> textFieldsList = driver.findElementsByClassName("android.widget.EditText");

        textFieldsList.get(0).sendKeys("17600868885");

        textFieldsList.get(1).setValue("1234");

        textFieldsList.get(2).replaceValue("123456");

        waitTwoTime();

        driver.findElement(By.id("com.ireader.pad:id/tv_login_finish")).click();

        waitTwoTime();

        for (int i=0; i<1;i++){

            countDownTest();  //倒计时

            //calendarTest();    //日历

            //copyBookTest();  //字帖

            //englishTest();    //翻译

            //setTest();        //设置

            //noteTest();      //笔记本

            //noteAddTest();      //笔记本重复添加测试

            //noteAddTest2();      //笔记本重复添加测试

            //teachShopTest();  //教辅商店

            //testPaper();      //试卷真题

            //textBook();      //课本

            //coursewareTest(); //课件

        }

    }

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容