Android,使用Appium,进行自动化测试

96
alphet
0.1 2019.02.25 10:31* 字数 966
⚠️本文描述的是关于Appium,在Mac上面的使用方式。

注意,如果app里面有WebView,那么无法通过这个appium,
定点测试Webview 加载的某一个element;这个问题,已经搞2天了,
但是并没有解决,如果大家有解决方案的话,
恳请赐教!

贴上学习链接:

//appium使用引导
http://www.automationtestinghub.com/appium-tutorial/
//UiScrollable的api
https://developer.android.com/reference/android/support/test/uiautomator/UiScrollable


先讲其他的也许会很难懂,先给大家最终结果:

手机放在桌子上面,没人碰它,注意是没人碰它!,突然之间,微信打开了,在朋友列表,找到你的女朋友,然后给她发了一条消息,“我门分手吧!”。

Amazing ? ,这就是自动化!

手机上安装的任何一个app,都能实现这种类型的操作。
比如,打开精冬,收藏铁三角SPORT7TW.
再比如,打开大众点评,给某一个商家,写1星差评;

回到主题,我们要做的,其实是自动话测试,并不是给女朋友发消息。下面分析一下,发消息这个过程是怎么实现的。

这段是重点,用Appium进行测试的过程:
     用B语言(比如java、js等等)写一个脚本B1,B1的具体内容:
“启动微信,进入通信录,找到女朋友,发消息”,
再通过工具A 执行脚本B1。
然后,你的女朋友,就会收到分手消息,是不是intereting?
上面的过程如何实现?
第1步, 配置环境
第2步, 写脚本
第3步, 准备好手机,并运行脚本

第1步,如果你是新手,那么流血是必然的,你会觉得世界非常的不友好
第2步,自动化测试的主体,所有的功能测试都是通过脚本实现的,虽然你没有点手机给女朋友发消息,但是你的脚本实现了这个发消息的功能逻辑
第3步,最简单,也许就是一个回车,也许就是点击一个运行button,在Android Studio 上面就是快捷键Command +R。

如何写脚本?
产品需求:“启动微信,进入通信录,找到女朋友,发消息”
转换为代码逻辑:“找到微信Apk的包名、微信lauchActivity的simpleName,启动微信;找到按钮‘通信录’的id,click这个id;
滑动通信录列表,找到女朋友的id或者name,点击女朋友;
启动软件盘,输入内容,点击发送”,这就是上面的B1脚本。

上面已经分析了 有3步,作为一个老手,第一步其实也非常简单,我们今天不讲第一步的内容,如果大家有需要,可以上BD或者GG搜索下,如何配置Appium。
下面进入两个主体,其一是脚本语言,
其二是server工具。
第一,脚本语言
实现B1脚本,可以用java,javascript,python,objectC任意一种。
本文主要描述java 脚本语言
首先, 我们看一个比较熟悉的代码模型:在webview里面插入js代码:

/**
 * 其中jsToast是 .js文件里面的function,
 * 作用是弹出alert(Test)
*/
mWebView.loadUrl("javascript:jsToast(\"Test\")");

脚本里面的语法就跟 "javascript:jsToast("Test")",非常相似:

下面是示例,滑动RecyclerView,到item中的text为“曹操的故事”

MobileElement ele1 =
driver.findElement(MobileBy.AndroidUIAutomator(
"new UiScrollable("new UiSelector().resourceId(\"cn.t:id/mRecyclerView_id\"))
.getChildByText("new UiSelector().className(\"android.widget.TextView\"),\"曹操的故事\")"));

driver:非常重要的class,几乎所有功能都需要用到它
ele1: MobileElement手机元素,在android里面我门叫它View,
            比如TextView,ImageView,类似html里面的元素,
cn.t: app包名
mRecyclerView_id: RecyclerView的id:
曹操的故事: 目标TextView的Text
UiScrollable:类似RecyclerView
UiSelector:类似View

我们把上面的例子拆解一下,理解起来要容易一些,分为2步

1,初始化RecyclerView
 RecyclerView:mRecyclerView ="new UiScrollable(new UiSelector().resourceId(\"cn.t:id/mRecyclerView_id\"))";
2,滑动到"曹操的故事"
mRecyclerView.getChildByText(new UiSelector().className(\"android.widget.TextView\"),\"曹操的故事\")

所有的命令都是通过字符串的方式进行,上面2步合成一个字符串str

MobileElement ele1 =driver.findElement(MobileBy.AndroidUIAutomator(str);

我们就拿到了view= ele1,并且滑动到这个位置

另外,在RecyclerView里面滑动到某一个位置还有其他方式,比如.scrollIntoView(new UiSelector().text("曹操的故事"),文章顶部有个关于UiScrollable的链接,里面有具体的api

第二,Server工具
很简单,安装Appium.dmg,就行了,并做下面的配置
Server Address:0.0.0.0
Server Port : 4723
Allow Session Override :☑️

关于Appium的测试过程就讲完了,一句话:写好脚本,启动Appium.dmg,
运行脚本。
下面贴一份完整的调试代码,功能是:清除缓存


package cn.t;

import org.openqa.selenium.By;
import org.openqa.selenium.remote.DesiredCapabilities;
import java.net.URL;
import io.appium.java_client.AppiumDriver;
import io.appium.java_client.MobileBy;
import io.appium.java_client.MobileElement;
import io.appium.java_client.android.AndroidDriver;


public class Sample {
    static AppiumDriver<MobileElement> mDriver = null;

    public static void main(String[] args) {
//      String udid="ce19171899941ca80c7e";
        String udid = "192.168.1.105:5555";
        String dName = "Samsung Android Note10";
        mDriver = initDriver(udid, dName);
        byCache(mDriver);
    }

    public static AppiumDriver<MobileElement> initDriver(String udid, String dName) {
        DesiredCapabilities caps = new DesiredCapabilities();
        caps.setCapability("deviceName", dName);
        caps.setCapability("platformName", "Android");
        caps.setCapability("platformVersion", "8.0.0");
        caps.setCapability("udid", udid);
        caps.setCapability("appPackage", "cn.t");
        caps.setCapability("appActivity", "cn.t.activity.AeActivity");
        caps.setCapability("noReset", "true");
        AppiumDriver<MobileElement> driver = null;
        try {
            driver = new AndroidDriver<MobileElement>(new URL("http://0.0.0.0:4723/wd/hub"), caps);
        } catch (Exception e) {
        }
        return driver;
    }


    public static AppiumDriver<MobileElement> byCache(AppiumDriver<MobileElement> driver) {
        try {

            //点击进入设置页面
            Thread.sleep(2000);
            driver.findElement(By.id("tvSetting")).click();

            //点击清空按钮
            Thread.sleep(2000);
            MobileElement eleClear = driver.findElement(By.id("tvSubmit"));

            eleClear.click();

            //终止Appium  service
            Thread.sleep(2000);
            driver.quit();

        } catch (Exception e) {

        }
        return driver;
    }

}

。。。。

日记本
Web note ad 1