APP 自动化(三)——连接 Appium 和 Android
前言
前置准备
打开 USB 调试
真机调试是一定要打开 USB 调试的,这里简单说一下方法。首先开启「开发者选项」,在设置里面找到「关于手机」这样的选项,在里面找到系统版本,然后点按 7 下。显示系统版本的地方不同系统可能会有所区别,但是都是点它就对了。
开启之后,在设置里面找找「开发者选项」,进去找到「USB 调试」的开关,打开即可。经过测试,貌似虚拟机不需要打开 USB 调试也可以,不过也不差这一步了,就都打开吧。
值得一提的是,虚拟机安装之后,其实是 Tablet 也就是 Pad 模式。打开开发者选项的地方稍微有点区别,如下:
Settings -> System -> About tablet -> Build number(点 7 下)。
连接设备
如果是真机,用 USB 线连接就可以了,注意最好选「文件传输」不要选「仅充电」。线要选粗一点的那种,有的细线是不具有数据传输功能的,只能充电。
如果是虚拟机,稍微麻烦点,要先查看下 Android 的 IP 地址。请确定虚拟机网络用的是「桥接」模式,并且 Android 的 WIFI 已经连接了虚拟网络(通常名字叫 VirtWifi)。
然后「长按 WIFI -> 设置 -> Advanced -> IP address」,在里面就能查到 IP 了,通常是 192.168.0.20
这样的格式。
然后启动 CMD,输入:
adb connect 192.168.0.20:5555
# OUTPUT: connected to 192.168.0.20:5555
这时候就算成功连接了,可以通过后文的命令查看设备信息。
查看设备信息
在使用 Appium 脚本的时候,需要把设备的一些参数填进去,这些参数可以通过 adb
的命令行获得。常用的参数获取命令如下:
注意:多设备的情况下要添加
-s
参数来指定设备。只有一个设备的时候可以省略。
# [deviceName]
adb devices
# OUTPUT:
# List of devices attached
# WCKUT21202001268 device
# 192.168.0.20:5555 device
# [platformVersion]
adb shell getprop ro.build.version.release
# or
adb -s WCKUT21202001268 shell getprop ro.build.version.release
# OUTPUT: 9
# [appPackage] / [appActivity]
adb shell "dumpsys window | grep mCurrentFocus"
# or
adb -s WCKUT21202001268 shell "dumpsys window | grep mCurrentFocus"
# OUTPUT: mCurrentFocus=Window{871ad05 u0 com.android.settings/com.android.settings.Settings}
注意:
appPackage
和appActivity
的获取,要保证 Android 系统的界面,是处在「设置」下面的时候,才能获取到正确的值。
运行测试脚本
启动 appium
命令行启动 appium,注意调试期间不能关闭窗口。
appium
# OUTPUT:
# [Appium] Welcome to Appium v2.11.2
# [Appium] The autodetected Appium home path: C:\Users\Administrator\.appium
# [Appium] Attempting to load driver uiautomator2...
# [Appium] Requiring driver at C:\Users\Administrator\.appium\node_modules\appium-uiautomator2-driver\build\index.js
# [Appium] AndroidUiautomator2Driver has been successfully loaded in 2.379s
# [Appium] Appium REST http interface listener started on http://0.0.0.0:4723
# [Appium] You can provide the following URLs in your client code to connect to this server:
# http://192.168.56.1:4723/
# http://192.168.13.14:4723/
# http://127.0.0.1:4723/ (only accessible from the same host)
# [Appium] Available drivers:
# [Appium] - uiautomator2@3.7.2 (automationName 'UiAutomator2')
# [Appium] No plugins have been installed. Use the "appium plugin" command to install the one(s) you want to use.
这步太简单了,稍微介绍一下原理吧。这里启动的是一个 web 服务,从输出可以看出来它是有 IP 和端口的。这个服务可以调用 adb,控制已经连接的设备。而 adb 又是通过 IP 连接的 Android 系统。所以 Android 系统和 Appium 服务如果都上云的话,理论上也是可以成功的。信号传递过程大概如下:
自动化脚本 -> Appium Server -> adb -> Android
如果这块没看懂也没关系,等所有的跑通了再回头看,自然就懂了,我们继续。
脚本代码
我们就用官方给的 Python 版代码 试一下。找个目录,运行 pip install Appium-Python-Client
安装依赖,然后新建一个 test.py
文件,把下面的代码 copy 过去,并做适当修改。一般需要修改的有
deviceName
、platformVersion
、appPackage
、appActivity
,这些信息在上面都有介绍过要怎么获取。- 还有可能需要修改
XPATH
部分的代码。比如虚拟机里面没有 Battery 按钮,我就改成了 Sound; - 也有可能要修改
appium_server_url
的值,这个就是上文提到的 Appium Server 的地址了
以下是我修改过,且本机验证通过的代码,大家可以自行比较一下跟官方的区别。
# test.py
import unittest
from appium import webdriver
from appium.options.android import UiAutomator2Options
from appium.webdriver.common.appiumby import AppiumBy
capabilities = dict(
platformName='Android',
automationName='uiautomator2',
deviceName='192.168.0.20:5555',
appPackage='com.android.settings',
platformVersion='9',
appActivity='com.android.settings.Settings',
language='en',
locale='US'
)
appium_server_url = 'http://localhost:4723'
class TestAppium(unittest.TestCase):
def setUp(self) -> None:
self.driver = webdriver.Remote(appium_server_url, options=UiAutomator2Options().load_capabilities(capabilities))
def tearDown(self) -> None:
if self.driver:
self.driver.quit()
def test_find_battery(self) -> None:
el = self.driver.find_element(by=AppiumBy.XPATH, value='//*[@text="Sound"]')
el.click()
if __name__ == '__main__':
unittest.main()
然后运行 py test.py
即可。我们会看到在 Android 界面自动进入 Settings
,然后按了 Sound 按钮
,然后全部退出。
使用 Appium Inspector
调试的时候需要查看页面元素,这时候就需要用到 Appium-Inspector 了,用法稍微有点门槛,这里说一下。
安装运行之后,会是如下图的页面:
IP、Port 这块没什么好说的,主要就是下面的参数。这些参数跟脚本里面的一样,也可以直接修改右侧的 JSON。填写完成后,可以点击 Save As
保存起来,方便下次用。
{
"platformName": "Android",
"appium:automationName": "uiautomator2",
"appium:deviceName": "192.168.0.20:5555",
"appium:platformVersion": "9",
"appium:appPackage": "com.android.settings",
"appium:appActivity": "com.android.settings.Settings"
}
正确填写之后点击 Start Session
按钮即可。成功的话会看到 Android 自动跳到 Settings 页面,然后 Inspector 会变成下面的样子:
这时候就可以方便的获取元素信息了,比如 Display 这个按钮,我们可以看到它的 XPATH 是 (//android.widget.LinearLayout[@resource-id="com.android.settings:id/dashboard_tile"])[4]
。修改一下脚本里的代码试试。
当然也可以通过 class、id 等获取元素,这里就不展开了。
结语
到这里,我们基本的流程已经跑通了,剩下的就是进阶版的内容了。根据自己的需求调整每个步骤。这里挖 2 个小坑。
第一个坑,笔者的真机测试没有成功。运行测试脚本的时候,只是给手机装了 2 个 APP,然后也并不能成功跳出 Settings 页面。盲猜有可能是操作系统的问题���因为用的是华为,系统是 HarmonyOS,出问题貌似也是情理之中的。
不过想在国内找一个纯 Android 的旧个人手机,还真的有点难度,这也是用虚拟机的好处之一了。这个问题找机会研究下,国内这么多手机品牌,肯定有解决方案的。
第二个坑,在研究过程中,查到了一个 B 站的视频合集《手把手教你-app自动化测试》。文章中那些查看信息的命令都是在这学的。它貌似是用 Docker 来弄得 Appium 服务。这个就很符合我后续的需求了,抽时间研究下。
好了,这篇文章写完,就算是一个小里程碑的结束了,大家可以完整的跑一下整个流程了。咱们进阶内容再见。
转载自:https://juejin.cn/post/7391351326153834496