一、Appium用途和特点

Appium 是一个移动 App (手机应用)自动化工具。

手机APP 自动化有什么用?

  • 自动化完成一些重复性的任务
    比如微信客服机器人
  • 爬虫
    就是通过手机自动化爬取信息。
    为什么不通过网页、HTTP 爬取呢?有的系统没有网页,也不方便通过HTTP爬取
  • 自动化测试
    很多企业里面有这样的需求

Appium 自动化方案的特点:

  • 开源免费
  • 支持多个平台
    iOS (苹果)、安卓 App 的自动化都支持。
  • 支持多种类型的自动化
    支持 苹果、安卓应用原生界面 的自动化
    支持 应用内嵌 WebView 的自动化
    支持 手机浏览器中的 web网站自动化
    支持 flutter应用的自动化
  • 支持多种编程语言
    像 Selenium 一样, 可以用多种编程语言 调用它 开发自动化程序。

二、 自动化原理

android tasker自动化框架实现 appium android自动化_python

Appium自动化架构借鉴Selenium, 包含了 3个主体部分:自动化程序、Appium Server、移动设备.

  • 自动化程序
    自动化程序是由我们来开发的,实现具体的手机自动化功能。
    要发出具体的指令控制手机,也需要使用客户端库
    和Selenium一样,Appium 组织也提供了多种编程语言的客户端库,包括 java,python,js, ruby等,方便不同编程语言的开发者使用。
    我们需要安装好客户端库,调用这些库,就可以发出自动化指令给手机。
  • Appium Server 

       Appium Server 是 Appium 组织开发的程序,它负责管理手机自动化环境,并且转发自动化程        序的控制指令给手机,并且转发手机给自动化程序的响应消息。

  • 手机设备
    我们这里说的手机设备,其实不仅仅是手机,包括所有苹果、安卓的移动设备,比如:手机、平板、智能手表等。
    为了直观方便的讲解,这里我们简称: 手机
    当然手机上也包含了我们要自动化控制的手机应用APP。
    手机设备为什么能 接收并且处理自动化指令呢?
    因为,Appium Server 会在手机上 安装一个 自动化代理程序, 代理程序会等待自动化指令,并且执行自动化指令

比如:要模拟用户点击界面按钮,Appium 自动化系统的流程是这样的:

  • 自动化程序 调用客户端库相应的函数, 发送点击元素的指令(封装在HTTP消息里)给 Appium Server
  • Appium Server 再转发这个指令给手机上的自动化代理
  • 手机上的自动化代理接收到指令后,调用手机平台的自动化库,执行点击操作,返回点击成功的结果给 Appium Server
  • Appium Server 转发给自动化程序
  • 自动化程序了解到本操作成功后,继续后面的自动化流程

其中,自动化代理控制,使用的什么库来实现自动化的呢?

如果测试的是苹果手机, 用的是苹果的 XCUITest 框架 (IOS9.3版本以后)

如果测试的是安卓手机,用的是安卓的 UIAutomator 框架 (Android4.2以后)

这些自动化框架提供了在手机设备上运行的库,可以让程序调用这些库,像人一样自动化操控设备和APP,比如:点击、滑动,模拟各种按键消息等。

三、 Android自动化环境搭建

1. 安装appium 点击这里打开下载页面

2. 安装client编程库 

根据原理图, 我们知道自动化程序需要调用客户端库和 Appium Server 进行通信。

pip install appium-python-client

3. 安装JDK Java Downloads | Oracle

# 打开文件
vim .bash_profile
 
# 括号中都复制进去
【
# 复制如下内容,JAVA_HOME 替换为自己目录
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_341.jdk/Contents/Home
export PATH=$JAVA_HOME/bin:$PATH:.
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:.
 
# 配置文件立即生效
source .bash_profile
 
# 查看 JAVA_HOME 目录
echo $JAVA_HOME
】
 
 
# 执行使之生效
source .bash_profile

# 查看jdk是否生效
java - version

4. 安装 Android SDK

对于安卓APP的自动化,Appium Server 是需要 Android SDK的adb命令。

因为要用到里面的一些工具,比如 要执行命令设置手机、传送文件、安装应用、查看手机界面等。

# 安装
brew install android-platform-tools
 
# 验证
adb version

 或者直接下载android-sdk-macos包 

5. 安装appium inspector 定位元素的软件

6. 连接手机

上述的软件环境都准备好以后,要自动化手机APP,需要:

  • 在你运行程序的电脑上 用 USB线 连接上 你的安卓手机
  • 进入 手机设置 -> 关于手机 ,不断点击 版本号 菜单(7次以上),
  • 退出到上级菜单,在开发者模式中,启动USB调试

如果手机连接USB线后,手机界面弹出 类似 如下提示。

android tasker自动化框架实现 appium android自动化_android_02

注意:

有的手机系统,可能需要一些额外的选项需要设置好。

比如,有的手机,开发者选项里 需要打开 允许通过USB安装应用 等。

总之,给USB开发调试 尽可能方便的控制手机。

连接好以后,打开命令行窗口, 执行 adb devices 命令来列出连接在电脑上的安卓设备。

android tasker自动化框架实现 appium android自动化_自动化_03

7. 在pycharm中输入下方例子

运行代码前,要先 运行 Appium Desktop

from appium import webdriver
from selenium.webdriver.common.by import By
from appium.webdriver.extensions.android.nativekey import AndroidKey

desired_caps = {
  'platformName': 'Android', # 被测手机是安卓
  'platformVersion': '8', # 手机安卓版本
  'deviceName': 'xxx', # 设备名,安卓手机可以随意填写
  'appPackage': 'tv.danmaku.bili', # 启动APP Package名称
  'appActivity': '.ui.splash.SplashActivity', # 启动Activity名称
  'unicodeKeyboard': True, # 使用自带输入法,输入中文时填True
  'resetKeyboard': True, # 执行完程序恢复原来输入法
  'noReset': True,       # 不要重置App
  'newCommandTimeout': 6000,
  'automationName' : 'UiAutomator2'
  # 'app': r'd:\apk\bili.apk',
}

# 连接Appium Server,初始化自动化环境
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

# 设置缺省等待时间
driver.implicitly_wait(5)

# 如果有`青少年保护`界面,点击`我知道了`
iknow = driver.find_elements(By.ID, "text3")
if iknow:
    iknow.click()

# 根据id定位搜索位置框,点击
driver.find_element(By.ID, 'expand_search').click()

# 根据id定位搜索输入框,点击
sbox = driver.find_element(By.ID, 'search_src_text')
sbox.send_keys('白月黑羽')
# 输入回车键,确定搜索
driver.press_keycode(AndroidKey.ENTER)

# 选择(定位)所有视频标题
eles = driver.find_elements(By.ID, 'title')

for ele in eles:
    # 打印标题
    print(ele.text)

input('**** Press to quit..')
driver.quit()