APP爬虫:windows + Appium + 夜神模拟器,模拟浏览京东APP(全网最详细教程,没有之一!)

1. 前言

1.1. Appium简介

Appium是一个开源测试自动化框架,可用于原生,混合和移动Web应用程序测试。 它使用WebDriver协议驱动iOS,Android和Windows应用程序。

1.2. Appium特点

  • 可以跨平台同时支持Android、iOS
  • 支持多种语言,java、python、php、Ruby等等

2. 环境工具

2.1. 环境

Windows 10 & 夜神安卓模拟器
MacOS 10.12(本文的.py文件运行在Mac上,也可以将.py文件运行在Windows 上)

2.2. 工具

adb、JAVA、SDK、Appium

3. 环境搭建

3.1. 安装 JAVA JDK

3.1.1. 下载 JAVA JDK

-- 下载地址:https://www.oracle.com/java/technologies/javase-jdk14-downloads.html
-- windows 用户选择 windows x64 进行下载;

image.png

3.1.2. 安装 JDK

-- 按提示完成安装,注意安装位置,如图:


image.png

3.1.3. 配置 JAVA 环境变量

  • 在桌面鼠标右键点击 【我的电脑(或计算机)】> 【高级系统设置】 > 【环境变量】,打开环境变量配置页面;

-- JAVA_HOME

C:\Program Files\Java\jdk-14(此处可以自己在安装时设定路径)

image.png

-- Path

%JAVA_HOME%\bin;
%JAVA_HOME%\jre\bin;


image.png

-- CLASSPATH

.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar

注意:最前面有个【点】,一定不要漏掉!

image.png
  • 验证安装情况
    -- 打开 cmd 命令行工具,输入 java -version,返回信息如图标识安装配置成功;
    image.png

3.2. 安装 Android SDK Tools

3.2.1.下载 Android SDK Tools

-- 下载地址:http://tools.android-studio.org/index.php/sdk
-- 选择 Winddows 对应的 .exe 文件下载,如图:

image.png

3.2.2. 安装 SDK Tools

按提示进行安装,注意文件包的安装路径,如果C盘空间不够的话,后面可能会下载 packages 不成功,所以最好放到D盘或E盘,如图:


image.png

3.2.3. 安装 pacakge 包

image.png

注意:此处需要先点击选择左侧的 packages 包,然后点击右侧的 Accept License,依次分别点选并接受,等全部 Packages 包都变成绿色对号以后,再点击 Install 进行安装;
image.png

  • 等待全部安装完毕即可。

3.3. 替换 UIAutomator

  • 下载 uiautomatorviewer.jar 文件;

注意:之所以要配置 UIAutomator,是因为 Android SDK tools 包中原生的工具在获取元素时,不能很好地满足开发需求;

链接: https://pan.baidu.com/s/1fxWt0tz3scEgVYVsv8-yWQ 提取码: 8qz3

  • \sdk\tools\lib* 目录下找到 uiautomatorviewer xxx.jar,复制该文件的文件名,将改文件移动到其他文件夹,将下载的 uiautomatorviewer.jar 复制进文件包,并用之前的文件名重新命名该文件。

注意:一定要用前面复制的文件名重新命名!

image.png

3.4. 替换 ADB,并配置 ANDROID 环境变量

3.4.1. ADB 简介

  • ADB,即 Android Debug Bridge(安卓调试桥) tools。它就是一个命令行窗口,用于通过电脑端与模拟器或者真实设备交互;
  • adb 命令可用于执行各种设备操作(例如安装和调试应用),并提供对 Unix shell(可用来在设备上运行各种命令)的访问权限。它是一种客户端-服务器程序,包括以下三个组件:

客户端:用于发送命令。客户端在开发计算机上运行。您可以通过发出 adb 命令来从命令行终端调用客户端。
守护进程 (adbd):在设备上运行命令。守护进程在每个设备上作为后台进程运行。
服务器:管理客户端和守护进程之间的通信。服务器在开发机器上作为后台进程运行。

  • adb 包含在 Android SDK 平台工具软件包中,需要使用 SDK 管理器下载此软件包,该管理器会将其安装在 android_sdk/platform-tools/ 下;
  • 欲了解更多详细内容,请访问 Android Studio用户指南

3.4.2. 替换 SDK 中的 ADB

  • 在夜神模拟器安装目录的 bin 目录下找到 nox_adb.exe 文件


    image.png
  • 在 android-sdk\platform-tools 目录下找到 adb.exe,将文件剪切移动到备份位置;
  • 将 nox_adb.exe 复制到 android-sdk\platform-tools 目录下,重命名为 adb.exe;

3.4.3. ADB 命令

adb devices  # 查看 adb 已连接的设备
adb kill-server  # 关闭 adb 服务
adb start-server  # 启动 adb 服务

3.5. 配置 ANDROID 环境变量

  • 在系统环境变量添加 ANDROID_HOME,路径为 SDK 文件安装路径
    -- 如下图:


    image.png
  • 在 path 中添加下面两行内容
%ANDROID_HOME%\tools
%ANDROID_HOME%\platform-tools

-- 如下图:


image.png

4. 安装 Appium

4.1. Appium 简介

  • Appium 是一个自动化测试开源工具,支持 iOS 平台和 Android 平台上的原生应用;
  • appium类库封装了标准Selenium客户端类库,为用户提供所有常见的JSON格式selenium命令以及额外的移动设备控制相关的命令,如多点触控手势和屏幕朝向。

4.2. Appium 与 Selenium

  • 类库封装了标准Selenium客户端类库,为用户提供所有常见的JSON格式selenium命令以及额外的移动设备控制相关的命令,如多点触控手势和屏幕朝向。
  • appium客户端类库实现了Mobile JSON Wire Protocol(一个标准协议的官方扩展草稿)和W3C WebDriver spec(一个传输不可预知的自动化协议,该协议定义了MultiAction 接口)的元素。
  • appium服务端定义了官方协议的扩展,为appium 用户提供了方便的接口来执行各种设备动作,例如在测试过程中安装/卸载App。这就是为什么我们需要appium特定的客户端,而不是通用的Selenium 客户端。

4.3. 下载Appium软件

5. 安装夜神模拟器

5.1. 夜神模拟器简介

  • 夜神安卓模拟器(夜神模拟器),是全新一代的安卓模拟器,与传统安卓模拟器相比,基于android5.1.1同时支持android7.1,兼容X86/AMD,在性能、稳定性、兼容性等方面表现良好;
  • 重要的是:相比其他模拟器,夜神模拟器对 Appium 会更加友好!

5.2. 下载安装

-- 下载地址:https://www.yeshen.com/

  • 安装
    -- 下载成功后开始安装;

5.3. 配置 & 启动

  • 安装成功后,桌面多出两个图标,一个叫夜神多开器(MultiPlayerManager),一个叫夜神模拟器(NoxPlayer),表示安装成功;
  • 配置
    -- 夜神模拟器的使用以及配置,参考我的另一篇文章 夜神模拟器使用简介及配置操作
  • 启动
    -- 找到配置好的模拟器,点击三角形图标启动;


    image.png

6. 安装京东APP

  • 下载京东APP
    -- 在Windows浏览器中打开 https://app.jd.com/android.html下载京东APP;
  • 安装京东APP
    -- 将下载好的京东 .apk 文件拖入模拟器,完成安装;

7. 开发测试

7.1. 打开开发者模式

  • 打开模拟器,依次进入 设置 > 关于平板电脑 > 版本号,鼠标持续点击 版本号,打开开发者模式;

    image.png

  • 返回上级菜单,进入 开发者选项 打开 USB调试

    image.png

7.2 打开 adb

  • 打开 cmd 命令行,输入下面代码,启动adb 并查看 连接的设备;
adb start-server  # 启动 adb 服务
adb devices  # 查看 adb 已连接的设备
  • 得到下图,表示连接成功;


    image.png

7.3. 配置 app desired_caps

  • 获取 apk 包名(appPackage)、活动名(appActivity)
    -- 电脑打开 cmd 命令行,输入下面代码获取 app 信息;
adb shell dumpsys activity activities  # 该命令的功能是获取当前正在被操作的 app 的 activity 相关信息;

-- 得到下面的返回结果,appActivity 值为 com.jingdong.app.mall.main.MainActivity,app 的 appPackage 值为 com.jingdong.app.mall
-- 这里注意:appActivity 返回值本来是 com.jingdong.app.mall/.main.MainActivity,需要 去掉中间的反斜线

image.png

  • 打开模拟器,依次进入 设置 > 关于平板电脑,获取模拟器参数参数;
  • 下面是配置后的参数,注意 appActivity 值需要去掉反斜线 !
# 定义启动设备需要的参数
desired_caps = {}
# 设备系统
desired_caps['platformName'] = 'Android'
# 设备系统版本号        
desired_caps['platformVersion'] = '5.1.1'
# 设备名称
desired_caps['deviceName'] = 'Meizu'
## 要测试的应用的地址
#desired_caps['app'] = 'xxx.apk'   # 注意是 apk 文件在电脑上的绝对路径
# 应用的包名
desired_caps['appPackage'] = 'com.jingdong.app.mall'
desired_caps['appActivity'] = 'com.jingdong.app.mall.main.MainActivity'   # appActivity 值需要去掉反斜线

7.4. UIAutomator 获取元素位置

  • 在 sdk\tools\bin 目录下找到 uiautomatorviewer.bat 文件,双击打开运行 uiautomatorviewer;


    image.png
  • 启动 uiautomatorviewer 后,点击左上安卓角手机图标连接安卓模拟器;


    image.png
  • 将模拟器页面同步到 UIAutomator 之后,在模拟器打开 app ,再次点击左上角安卓手机图标,就可以在 UIAutomator 看到同步后的京东 app 页面;

注意:每次操作 App 出现页面变换以后,需要手动点击左上角安卓手机图标,才能够在 UIAutomator 同步页面

  • 在京东 app 上移动鼠标,获取需要操作的 app 的 xpath 路径,如下图;


    image.png
  • 具体的获取位置步骤,可以参考 selenium 的元素定位获取方法,此处省略步骤细节;

7.5. 编写代码

  • 此处展示 启动、输入关键字查询 两个动作的代码,请读者自行编写代码完成 app 操作;
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction
import time


class Jingdong():
    def __init__(self):
        desired_caps = {}
        # 设备系统
        desired_caps['platformName'] = 'Android'
        # 设备系统版本号
        desired_caps['platformVersion'] = '5.1.1'
        # 设备名称
        desired_caps['deviceName'] = '127.0.0.1:62025'
        ## 要测试的应用的地址
        #desired_caps['app'] = 'xxx.apk'   # 注意是 apk 文件在电脑上的绝对路径
        # 应用的包名
        desired_caps['appPackage'] = 'com.jingdong.app.mall'
        desired_caps['appActivity'] = 'com.jingdong.app.mall.main.MainActivity'

        self.driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)  # 地址为appium地址
        time.sleep(8)

    def search(self, keyword):
        self.driver.find_element_by_xpath('//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.LinearLayout[1]/android.widget.RelativeLayout[1]/android.widget.RelativeLayout[1]/android.widget.FrameLayout[1]/android.support.v7.widget.RecyclerView[1]/android.widget.RelativeLayout[2]/android.widget.LinearLayout[1]').click()
        time.sleep(3)
        self.driver.find_element_by_xpath("//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.RelativeLayout[1]/android.widget.RelativeLayout[2]/android.widget.EditText[1]").send_keys(keyword)
        time.sleep(3)
        self.driver.find_element_by_xpath("//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]/android.widget.RelativeLayout[1]/android.widget.RelativeLayout[1]/android.widget.RelativeLayout[1]/android.widget.TextView[1]").click()
        time.sleep(3)


def main():
    jingdong = Jingdong()
    keyword = "手机"
    jingdong.search(keyword)

if __name__ == '__main__':
    main()

7.6. 关闭 adb 服务

adb kill-server

7.7. 启动 Appium

  • 启动 appium 服务,点击 Start Server,不需要进行任何操作;
image.png

7.8. 重启模拟器

  • 之所以在关闭 adb 之后重启模拟器,是为保证 adb 连接不出现异常;

9. mitmproxy 获取结果

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,064评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,606评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,011评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,550评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,465评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,919评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,428评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,075评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,208评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,185评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,191评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,914评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,482评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,585评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,825评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,194评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,703评论 2 339