手机APP爬取之Appium的基本认识与使用

作者:后浪v

文章目录

      • 零、写在前面
      • 一、Appium的基本原理与安装
        • 1. 相关链接
        • 2. 简介
        • 3. 工作原理
        • 4. 所需安装包
        • 5. 自动化环境搭建
          • 5.1 Appium Server安装
          • 5.2 安装client编程库
          • 5.3 安装JDK
          • 5.4 安装 Android SDK
        • 6. 连接手机
        • 7. 区分用户变量和系统变量(补充)
      • 二、代码展示与分析
      • 三、元素定位与界面操作
        • 1. 界面元素查看工具
        • 2. 定位元素的方法
          • 2.1 根据ID
          • 2.2 根据CLASS NAME
          • 2.3 根据ACCESSIBILITY ID
          • 2.4 根据Xpath
        • 3. 安卓 UIAutomator
        • 4. 界面操作

零、写在前面

偷懒一个月没有更新博客了,偶尔打开CSDN看到仍有许多点赞和关注消息,唔~
来个冠冕堂皇的理由——最近听音乐去了!

( ˃̶̤́ ꒳ ˂̶̤̀ )

一首让人激动且平静的歌,分享出来~

♪ 点击播放

《无处安放》 - 白若溪

我闻到初春的味道  
那如同儿时梦境新鲜的芬芳  
也尝到思念的苦涩  
这回望远方秋雨般无垠的萧索  

我心爱的人啊  
多年以后是否还记得  
我的惦念我的忧愁和挣扎 

一、Appium的基本原理与安装

1. 相关链接
  • GitHub: https://github.com/appium/appium
  • 官方网站: http://appium.io
  • 官方文档: http://appium.io/introduction.html
  • Python Client: https://github.com/appium/python-client
2. 简介

Appium 是一个移动跨平台移动端自动化测试工具,可以非常便捷的为IOS和Android平台创建自动化测试用例。它可以模拟APP内部的各种操作,如点击、滑动、文本输入等等,只要我们手动操作Appium就可以完成。另外,Appium实际上继承了Selenium,Appium也是利用WebDriver来实现App的自动化测试的。
Appium相当于一个MITM,我们将编程语言(例如PYTHON)传给Appium,Appium就会根据不同的操作指令对移动设备进行驱动,完成不同的动作,例如:

  • 自动化完成一些重复性的任务
  • 爬虫
  • 自动化测试
3. 工作原理

手机APP爬取之Appium的基本认识与使用_第1张图片

这幅图, 包含了 3个主体部分 : 自动化程序、Appium Server、移动设备

  • 自动化程序:自动化程序是由我们来开发的,实现具体的手机自动化功能。
  • Appium Server:负责管理手机自动化环境,并且转发自动化程序的控制指令给手机,转发手机给自动化程序的响应消息。
  • 手机设备:Appium Server 会在手机上 安装一个 自动化代理程序, 代理程序会等待自动化指令,并且执行自动化指令。
4. 所需安装包

接下来的演示均以Python语言为例,不足之处请多多指出。
请确保PC已经搭建好Python环境和安装编辑器,另外需要安装Appium、JDK和下载好Android SDK。
因为软件较多且多布置在国外网站,这里我整理在百度网盘以供大家使用:

点击跳转到网盘链接
提取码:u0na

你点击链接的样子是不是像极了给我博客点赞时帅气的样子呢?不要下次一定了叭~~

手机APP爬取之Appium的基本认识与使用_第2张图片

5. 自动化环境搭建
5.1 Appium Server安装

Appium Desktop官方下载 点击跳转
Appium组织为了方便大家安装使用,制作了一个可执行程序 Appium Desktop,把 nodejs 运行环境、Appium Server 和一些工具打包在里面了,只需要简单的下载安装就可以了。

5.2 安装client编程库

根据原理图,我们知道自动化程序需要调用客户端库和Appium Server进行通信。
因为我们介绍Python语言开发,所以就需要用pip安装库,如下:

pip install appium-python-client
5.3 安装JDK

安卓APP的自动化,必须要安装安卓SDK,而安卓SDK需要JDK环境。网盘下载: jdk-8u211-windows-x64.exe
安装好之后,还需要添加一个环境变量 JAVA_HOME,指定值为jdk安装目录,比如:

JAVA_HOME   c:\tools\java\jdk1.8.0_211

手机APP爬取之Appium的基本认识与使用_第3张图片

5.4 安装 Android SDK

对于安卓APP的自动化,Appium Server 是需要 Android SDK的。
因为要用到里面的一些工具,比如 要执行命令设置手机、传送文件、安装应用、查看手机界面等。
可以从上面给出的百度网盘连接下载最新的 Android SDK文件包: androidsdk.zip ,并且解压,即可。
解压完成后,需要 配置一下添加一个环境变量ANDROID_HOME,设置值为sdk包解压目录,比如:

c:\tools\androidsdk

另外,还推荐大家配置环境变量PATH,加入adb所在目录:

c:\tools\androidsdk\platform-tools\

手机APP爬取之Appium的基本认识与使用_第4张图片

6. 连接手机

连接好以后,打开命令行窗口, 执行

adb devices -l 

命令来列出连接在电脑上的安卓设备。
如果输出类似如下的内容:

List of devices attached
4d0035dc767a50bb evice product:LCT_LA100 xxx:HUAWEI
device:01

表示电脑上可以查看到 连接的设备,就可以运行自动化程序了。

7. 区分用户变量和系统变量(补充)

首先来解释一下什么是环境变量path。
环境变量 Path 中包含的 这些目录, 就是 Windows查找程序的目录。
环境变量 Path 的内容包括了多个目录,目录之间用分号隔开。
当我们在CMD中敲入下面的命令时:

python Appium_Bilibili.py

Windows 命令执行器 就会依次搜索如下目录:

  • C:\Python38\Scripts;
  • C:\Python38;
  • C:%USERPROFILE%\AppData\Local\Microsoft\WindowsApps;
  • C:\Program Files (x86)\mitmproxy\bin;
  • C:\Windows\system32;
  • C:\Users\tingy\AppData\Local\Programs\Microsoft VS Code\bin;
  • C:\Windows\System32\Wbem;
  • C:\Windows\System32\WindowsPowerShell\v1.0\

看这些目录中,是否有 python.exe 或者 python.bat 之类的可执行文件,如果有就执行他们。
区别(引用博客):

  • 系统变量:对所有的用户起作用
  • 用户变量:对当前用户起作用

注意:系统变量与用户变量的PATH:告诉系统可执行文件放在什么路径(平常执行程序的路径,要放在PATH里面,不能建一个变量,cmd会提示“不是内部或外部命令,或者不是可执行程序”)

二、代码展示与分析

前面说过,Appium继承了Selenium的WebDriver类,实际上代码可以参考selenium网页自动化。

Say Is Easy. Show Thou Code!

from appium import webdriver
from appium.webdriver.extensions.android.nativekey import AndroidKey

desired_caps = {
  'platformName': 'Android',       # 被测手机是安卓
  'platformVersion': '10',         # 手机安卓版本
  'deviceName': 'McLarn',          # 设备名,安卓手机可以随意填写
  'appPackage': 'tv.danmaku.bili', # 启动APP Package名称
  'appActivity': '.ui.splash.SplashActivity', # 启动Activity名称
  'unicodeKeyboard': True,         # 需要输入中文时填True
  'resetKeyboard': True,           # 执行完程序恢复原来输入法
  'noReset': True,                 # 执行完不要清除App数据
  'newCommandTimeout': 6000,       # 超时等待时间
  'automationName' : 'UiAutomator2'# 自动化代理版本
}

# 连接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')

# 舍不得与人分享的宝藏up主嘿~
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 EXIST! ')
driver.quit()

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

首先,封装了desired_caps字典,传入了手机信息,被测试软件信息,输入法信息,自动化服务的相关信息。

查询启动APP Package与启动Activity名称的方法:

手机成功连接电脑后,打开被测试的手机APP,然后通过ADB(Android Debugger Bridge) 命令查看手机最近运行程序:

adb shell dumpsys activity recents | find "intent={"

我们来着重关注cmp参数:

pkg=com.tecent.mobileqq cmp=com.tecent.mobileqq/.activity.SplashActivity}

其中cmp中“/”前半段就是APP Package名称,后半段就是Activity名称。

如下所示:

手机APP爬取之Appium的基本认识与使用_第5张图片

主要来说说实例化这一行。

driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)  

此行代码调用了webdriver的Remote方法,Appium Server启动后会在本地创建一个默认端口号: 127.0.0.1:4723,这里加入了这个参数,并且传入了之前配置好的desired_caps字典。

remote 英[rɪˈməʊt] 美[rɪˈmoʊt]
adj.偏远的; 偏僻的; 遥远的; 久远的; 关系较远的; 远亲的;
n. 远程;
[例句]Landslides have cut off many villages in remote areas.
滑坡使边远地区的许多村庄与外界隔绝。
[其他]比较级:remoter 最高级:remotest

很难直观的看出Romote()方法的功能,那么的,一起来看看源代码:

手机APP爬取之Appium的基本认识与使用_第6张图片

第19行

from .webdriver import WebDriver as Remote

这就明白了,Remote实际上就是WebDriver类。

接下来我们看看WebDriver类。

手机APP爬取之Appium的基本认识与使用_第7张图片

可以看到,WebDriver把desired_caps传入了一个个的方法去执行。所以,这里的Romote()方法做了很多事情:

  • 识别一个Android且版本为10的手机设备并连接
  • 找到被测试的App对象并通过Lancher启动它
  • 配置好适合的输入法
  • 配置好UIAutomator

到这里,初始化就完成了。

三、元素定位与界面操作

Appium是基于Selenium的,所以和Selenium代码定位元素的基本规则相同。

1. 界面元素查看工具
  • Android Sdk包中的 uiautomateviewer
  • Appium Desktop 中的 Appium Inspector
2. 定位元素的方法
2.1 根据ID

对于安卓应用元素的 resource-id 属性

driver.find_element_by_id('expand_search')
2.2 根据CLASS NAME

对应安卓应用元素的类型

driver.find_elements_by_class_name('android.widget.TextView')
2.3 根据ACCESSIBILITY ID

元素的 content-desc 属性是用来描述该元素的作用的

driver.find_element_by_accessibility_id('自饮一瓢')
2.4 根据Xpath

表达式的语法规则和 Selenium 里面 Xpath 的语法是一样的
在appium中,xpath表达式中每个节点名是元素的 class 属性值

driver.find_element_by_xpath('//tag1/tag2[@attr="value"]')
3. 安卓 UIAutomator

谷歌安卓官方文档

4. 界面操作
  • driver.click() # 点击

  • driver.tap([(850,1080)],300) # 点按

  • driver.send_keys(string) # 输入

  • driver.swipe(start_x=x, start_y=y1, end_x=x, end_y=y2, duration=800) # 滑动

  • driver.press_keycode(AndroidKey.ENTER) # 按键

你可能感兴趣的:(python,android,安卓,windows,数据挖掘)