⚠️本文描述的是关于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 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 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 driver = null;
try {
driver = new AndroidDriver(new URL("http://0.0.0.0:4723/wd/hub"), caps);
} catch (Exception e) {
}
return driver;
}
public static AppiumDriver byCache(AppiumDriver 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;
}
}
。。。。