应用
列出手机上的应用,检查某个应用是否已安装,打开应用、链接和设置页面,查看前台是哪个应用,以及处理会保护屏幕的应用。
本页为译文。如与英文版不一致,以英文版为准。 English
大多数脚本都从打开一个应用开始。本指南介绍以整个应用为单位、而不是针对界面元素的命令。
列出手机上的应用
apps 返回已安装应用的包名、名称、版本,以及是否为系统应用。只有在你要求时才会包含系统应用。
droidline apps
droidline apps --systemfor app in d.apps():
print(app["package"], app["label"], app["version"])
everything = d.apps(system=True)for (const app of await d.apps()) {
console.log(app.package, app.label, app.version);
}
const everything = await d.apps(true);foreach (var app in await d.AppsAsync())
Console.WriteLine($"{app.Package} {app.Label} {app.Version}");
var everything = await d.AppsAsync(system: true);这也是查找包名最快的方法,launch、in_app 和 notify_filter 都需要包名。在列表里搜索主屏幕上看到的应用名称即可。
检查应用是否已安装
installed 在应用已安装时返回版本名,未安装时返回空字符串。
droidline installed com.android.chromeversion = d.installed("com.android.chrome")
if not version:
print("没有安装 Chrome")const version = await d.installed("com.android.chrome");
if (!version) console.log("没有安装 Chrome");var version = await d.InstalledAsync("com.android.chrome");
if (version == "") Console.WriteLine("没有安装 Chrome");打开应用
launch 打开应用的首个界面,并返回手机所用的时间。传入 activity 可以打开指定界面,前提是该应用允许其他应用打开这个界面。
droidline launch com.android.settings
droidline launch com.example.shop com.example.shop.CartActivityd.launch("com.android.settings")
d.launch("com.example.shop", "com.example.shop.CartActivity")await d.launch("com.android.settings");
await d.launch("com.example.shop", "com.example.shop.CartActivity");await d.LaunchAsync("com.android.settings");
await d.LaunchAsync("com.example.shop", "com.example.shop.CartActivity");launch 在应用画出首个界面之前就会返回。接着用 wait 等待你预期会出现的内容:
d.launch("dev.droidline.demo")
d.wait("text", "Sign in")
应用不对外开放的界面无法直接打开。这时 launch 会打开首个界面,脚本需要从那里一步步点过去。
打开链接或设置页面
open_url 打开网址或应用的深度链接,传入包名可以指定由哪个应用打开。intent 按 action 打开界面,用来进入某个设置页面。
droidline open_url https://droidline.dev
droidline open_url "myapp://orders/42" com.example.shop
droidline intent android.settings.WIFI_SETTINGS
droidline intent android.settings.APPLICATION_DETAILS_SETTINGS package:com.android.chromed.open_url("https://droidline.dev")
d.open_url("myapp://orders/42", "com.example.shop")
d.intent("android.settings.WIFI_SETTINGS")
d.intent("android.settings.APPLICATION_DETAILS_SETTINGS", "package:com.android.chrome")await d.openUrl("https://droidline.dev");
await d.openUrl("myapp://orders/42", "com.example.shop");
await d.intent("android.settings.WIFI_SETTINGS");
await d.intent("android.settings.APPLICATION_DETAILS_SETTINGS", "package:com.android.chrome");await d.OpenUrlAsync("https://droidline.dev");
await d.OpenUrlAsync("myapp://orders/42", "com.example.shop");
await d.IntentAsync("android.settings.WIFI_SETTINGS");
await d.IntentAsync("android.settings.APPLICATION_DETAILS_SETTINGS", "package:com.android.chrome");打开设置页面后要点哪里,因手机厂商和语言而异。Wi-Fi、移动数据、飞行模式、强行停止和清除数据的做法见示例。
查看前台是哪个应用
current 返回前台的应用和界面(activity)。in_app 对某个应用回答 true 或 false,适合在循环里检查。
droidline current
droidline in_app com.android.settingsprint(d.current()) # {'package': 'com.android.settings', 'activity': '...'}
if not d.in_app("com.example.shop"):
d.launch("com.example.shop")console.log(await d.current());
if (!(await d.inApp("com.example.shop"))) await d.launch("com.example.shop");var now = await d.CurrentAsync();
Console.WriteLine($"{now.Package} {now.Activity}");
if (!await d.InAppAsync("com.example.shop")) await d.LaunchAsync("com.example.shop");返回、主屏幕和最近应用
droidline back
droidline home
droidline recentsd.back()
d.home()
d.recents()await d.back();
await d.home();
await d.recents();await d.BackAsync();
await d.HomeAsync();
await d.RecentsAsync();会保护屏幕的应用
银行和支付类应用常常禁止截屏,所以它们在前台时 screenshot 返回的是黑色图片。不过按钮和文字通常仍会出现在 dump 中,按文字、ID 或描述查找并点击元素依然可用。指纹、人脸和图案验证需要由人在手机上完成。
清除应用数据
clear_data 用一条命令清除应用数据,但只能在设备所有者模式下使用。没有这个模式时,示例里有通过设置页面清除的方法。