爬虫学习笔记(二十一)—— Appium

Posted 别呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了爬虫学习笔记(二十一)—— Appium相关的知识,希望对你有一定的参考价值。

一、概念和作用

1.1、概念

appium是一个移动 App (手机应用)自动化工具。支持 ios 平台和 android 平台上的原生应用,web应用和混合应用。它允许测试人员在不同的平台(iOS,Android)使用同一套API来写自动化测试脚本,这样大大增加了iOS和Android测试套件间代码的复用性。


1.2、常见应用

  • 自动化任务:微信机器人
  • 爬虫:通过手机自动化,提取信息
  • 自动化测试:自动化测试,提高效率

1.3、特点

  • 支持多个平台:iOS (苹果)、安卓 App 的自动化都支持。
  • 支持跨平台运行:Appium可以用在OSX,Windows以及Linux桌面系统上运行。
  • 支持多种类型的自动化:
    1. 支持 苹果、安卓 应用 原生界面 的自动化
    2. 支持 应用 内嵌 WebView 的自动化
    3. 支持 手机浏览器 中的 web网站自动化
    4. 支持 flutter 应用的自动化
  • 支持多种编程语言:像 Selenium 一样, 可以用多种编程语言调用它,开发自动化程序。
  • 扩展了WebDriver的协议:Appium没有自己重新去实现一套。这样的好处是以前的WebDriver API能够直接被继承过来,以前的 Selenium(WebDriver)各种语言的binding都可以拿来就用。
  • appium选择了Client/Server的设计模式。只要client能够发送http请求给server,那么的话client用什么语言来实现都是可以的,这就是appium及Selenium(WebDriver)如何做到支持多语言的原因;

1.4、Appium和Selenium

appium类库封装了标准Selenium客户端类库,为用户提供所有常见的JSON格式selenium命令以及额外的移动设备控制相关的命令,如多点触控手势和屏幕朝向。

appium客户端类库实现了Mobile JSON Wire Protocol(一个标准协议的官方扩展草稿)和W3C WebDriver spec(一个传输不可预知的自动化协议,该协议定义了MultiAction 接口)的元素。

appium服务端定义了官方协议的扩展,为appium 用户提供了方便的接口来执行各种设备动作,例如在测试过程中安装/卸载App。这就是为什么我们需要appium特定的客户端,而不是通用的Selenium 客户端。当然,appium 客户端类库只是增加了一些功能,而实际上这些功能就是简单的扩展了Selenium 客户端,所以他们仍然可以用来运行通用的Selenium会话。


二、安装

2.1、安装Appium客户端库

指令:

pip install appium-python-client

2.2、安装Appium Desktop

Appium Server 是用 NodeJS 运行的,基于JS开发出来的,Appium组织为了方便大家安装使用,制作了一个可执行程序 Appium Desktop,把 NodeJS 运行环境、Appium Server,和一些工具 打包在里面了,只需要简单的下载安装就可以了。

网址:http://appium.io/

安装示例:


2.3、安装JDK

JDK官网下载:https://www.oracle.com/java/technologies/javase-downloads.html


2.4、安装Android SDK

注意:现在已经不能单独安装Android SDK了,必须要一起下载谷歌集成好的包,包含了一个比较大的开发Android的IDE,就是Android Studio,而且Android的官方网站不能直接登录了,这里把SDK必须的文件打了一个压缩包,直接解压就可以了。

链接:https://pan.baidu.com/s/1D3aPH5HLc73oaOtqdib4lA
提取码:cgnb


2.5、环境配置:

  1. jdk添加环境变量: JAVA_HOME,指定值为jdk安装目录,比如JAVA_HOME D:\\SoftWare\\JDK\\jdk-16(根据自己的安装目录改变)
  1. jdk,jre配置环境变量Path: %JAVA_HOME%\\bin %JAVA_HOME%\\jre\\bin
  1. 环境变量: ANDROID_HOME ,设置值为sdk包解压目录,比如 D:\\SoftWare\\Android SDK\\androidsdk(根据自己的安装目录改变)
  1. 配置adb环境变量 Path:加入 adb所在目录, d:\\tools\\androidsdk\\platform-tools\\(根据自己的安装目录改变)

2.6、安装验证

1、JDK, JRE 安装验证

2、adb 安装验证


三、连接模拟器

这里使用夜神模拟器,网站:https://www.yeshen.com/

注:如果连接的是手机,直接进入“进入开发者模式”步骤进行

3.1、修改模拟器文件

  1. 打开安装目录,进入到bin目录(比如:D:\\SoftWare\\夜神模拟器\\Nox\\bin
  2. 把第三节里安装好的Android SDK里的adb.exe文件(比如我的在D:\\SoftWare\\Android SDK\\androidsdk\\platform-tools目录下)复制到该目录覆盖掉该目录已存在的adb.exe文件 (因为下载的Android SDK版本可能和模拟器的不一样,无法通过adb控制模拟器,所以最好替换一下文件。)
  3. 删掉该目录的nox_adb.exe文件,再复制一份adb.exe并重命名为nox_adb.exe
  4. 启动模拟器
  5. 进入bin目录打开控制台,执行./nox_adb.exe connect 127.0.0.1:62001,然后执行adb devices -l,看到如下信息就表示成功了

3.2、设置模拟器

3.3、进入开发者模式

1、进入“设置”,点击 “关于平板电脑”–>多次点击“版本号” ,进入开发者模式

2、启用USB调试,点击“开发者模式”–>开启“USB调试”


3.4、在模拟器中安装软件

首先需要保证模拟器已经连接成功,然后通过命令 adb devices -l 查看

安装软件使用命令 adb install [安装包路径] ,路径可以直接把安装包拖进窗口。


四、模拟器连接到Appium

4.1、启动和配置Appium

打开Appium之后直接点击Start Server就可以了

点击右上角放大镜开始配置模拟器信息

可以直接复制下面的JSON数据粘贴到右侧的输入框中,其中系统版本需要自己到模拟器中的关于平板电脑选项中自己查看

{
  "platformName": "Android",
  "platformVersion": "7.1.2",
  "deviceName": "BieYa"
}

全部信息填写完成后点击Start Session启动将Appium连接至模拟器,这时模拟器中会自动安装一个Appium Settings的软件,Appium通过这个软件控制模拟器的运行。


4.2、Appium界面信息


4.3、uiautomatorviewer

这个工具可以查看APP元素的属性,还提供了一组API,用于构建在用户应用和系统应用上执行交互的界面测试。Appium也封装了这个工具里面的API,所以也可以在Appium中使用这些API来操作模拟器。

参考谷歌安卓官方文档介绍: https://developer.android.google.cn/training/testing/ui-automator

截取手机元素

元素的属性

  • NAF:true 输入框不能输入字符
  • index:表示父节点的第几个子节点
  • resource_id:类似于id
  • text:文本信息
  • class:类似于标签名与class
  • package:包名
  • content-desc:节点描述信息
  • checkable :是否是可选择的
  • checked:是否是已选择的
  • clickable:是否是可点击的
  • enabled:可用状态
  • focusable:是否可以聚焦
  • focused:是否是聚焦状态的
  • scrollable:是否是可滚动的
  • long-clickable:是否可长按
  • bounds:坐标 左上角和右下角

4.4、shell 命令

1、查看app应用名

adb shell  dumpsys activity | findstr mFocusedActivity

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

2、查看输入法内容

adb shell ime list -s 

3、从默认的appium输入法切换到搜狗输入法

adb shell ime set io.appium.settings/.UnicodeIME   

五、简单的使用示例:哔哩哔哩

5.1、Appium连接

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

desired_caps = {
    'platformName': 'Android',         #被测的手机是安卓
    'platformVersion': '7.1.2',        #手机安卓版本
    'deviceName': 'BieYa',             #设备名,安卓手机可以随意填写
    'appPackage': 'tv.danmaku.bili',   #启动APP package名称      shell用查看app应用名
    'appActivity': '.MainActivityV2',  #启动Activity名称
    'unicodeKeyboard': True,           #使用自带输入法,输入中文是填true
    'resetKeyboard': True,             #执行完程序恢复原来输入法  经常来不及执行需要手动恢复
    'noReset': True,                   #不要重置APP  重要参数 务必填True
    'newCommandTimeout': 6000,         #固定写
    'automationName': 'UiAutomator2'
}

#连接APPium Server,初始化自动环境 建立连接,根据参数建立连接  安装
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps)

5.2、UI Selector

#设置缺省等待时间
driver.implicitly_wait(15)
time.sleep(5)
#UISelector控制手机元素   点击搜索框
# code = 'new UiSelector().text("热门").className("android.widget.TextView")'   #点击 ‘热门’ 标签
code = 'new UiSelector().className("android.widget.TextView")'
ele = driver.find_element_by_android_uiautomator(code)
# ele = driver.find_element_by_xpath('//android.widget.TextView[@content-desc="搜索"]')
ele.click()

5.3、Appium标签操作

#APPium标签操作
time.sleep(3)
#根据id定位搜索位置框,输入 python
search_tag = driver.find_element_by_id('tv.danmaku.bili:id/search_src_text')
search_tag.send_keys('python')
#输入回车键,确定搜索
time.sleep(1)
driver.press_keycode(AndroidKey.ENTER)

5.4、滑动操作

def swipUp(driver, t=800, n=1):
    '''向上滑动屏幕'''
    size = driver.get_window_size()
    x = size['width']*0.5   # x坐标
    y_start = size['height']*0.75   #起始点y坐标
    y_end = size['height'] * 0.25   #终点y坐标
    for i in range(n):
        driver.swipe(x,y_start,x,y_end,t)

5.5、流程控制

#1、加载所有标签 -滑动  2、判断底部  3、去重
title_list = []  #判断底部  去重
while True:
    title_tags = driver.find_elements_by_id('tv.danmaku.bili:id/title')
    title_list_lenght = len(title_list)  #判断底部-起始长度
    if title_tags:
        for title_tag in title_tags:
            content = title_tag.text
            if content not in title_list: #去重
                print(content)
                title_list.append(content)
    current_length = len(title_list)  #判断底部-结束长度
    print(' ')
    if current_length == title_list_lenght:
        print('到底了....')
        break
    swipUp(driver)  #滑动
print('结束..........')
driver.quit()

结果演示:

以上是关于爬虫学习笔记(二十一)—— Appium的主要内容,如果未能解决你的问题,请参考以下文章

Python学习笔记(二十一)

R语言学习笔记(二十一五):如何如何提升R语言运算的性能以及速度

Python学习笔记第二十一周

Unity3d - RPG项目学习笔记(二十一)

Python爬虫(二十一)_Selenium与PhantomJS

day9-Python学习笔记(二十一)单元测试