作者:后浪v
偷懒一个月没有更新博客了,偶尔打开CSDN看到仍有许多点赞和关注消息,唔~
来个冠冕堂皇的理由——最近听音乐去了!
( ˃̶̤́ ꒳ ˂̶̤̀ )
一首让人激动且平静的歌,分享出来~
♪ 点击播放
《无处安放》 - 白若溪
我闻到初春的味道
那如同儿时梦境新鲜的芬芳
也尝到思念的苦涩
这回望远方秋雨般无垠的萧索
我心爱的人啊
多年以后是否还记得
我的惦念我的忧愁和挣扎
Appium 是一个移动跨平台移动端自动化测试工具,可以非常便捷的为IOS和Android平台创建自动化测试用例。它可以模拟APP内部的各种操作,如点击、滑动、文本输入等等,只要我们手动操作Appium就可以完成。另外,Appium实际上继承了Selenium,Appium也是利用WebDriver来实现App的自动化测试的。
Appium相当于一个MITM,我们将编程语言(例如PYTHON)传给Appium,Appium就会根据不同的操作指令对移动设备进行驱动,完成不同的动作,例如:
这幅图, 包含了 3个主体部分 : 自动化程序、Appium Server、移动设备
接下来的演示均以Python语言为例,不足之处请多多指出。
请确保PC已经搭建好Python环境和安装编辑器,另外需要安装Appium、JDK和下载好Android SDK。
因为软件较多且多布置在国外网站,这里我整理在百度网盘以供大家使用:
点击跳转到网盘链接
提取码:u0na
你点击链接的样子是不是像极了给我博客点赞时帅气的样子呢?不要下次一定了叭~~
Appium Desktop官方下载 点击跳转
Appium组织为了方便大家安装使用,制作了一个可执行程序 Appium Desktop,把 nodejs 运行环境、Appium Server 和一些工具打包在里面了,只需要简单的下载安装就可以了。
根据原理图,我们知道自动化程序需要调用客户端库和Appium Server进行通信。
因为我们介绍Python语言开发,所以就需要用pip安装库,如下:
pip install appium-python-client
安卓APP的自动化,必须要安装安卓SDK,而安卓SDK需要JDK环境。网盘下载: jdk-8u211-windows-x64.exe
安装好之后,还需要添加一个环境变量 JAVA_HOME,指定值为jdk安装目录,比如:
JAVA_HOME c:\tools\java\jdk1.8.0_211
对于安卓APP的自动化,Appium Server 是需要 Android SDK的。
因为要用到里面的一些工具,比如 要执行命令设置手机、传送文件、安装应用、查看手机界面等。
可以从上面给出的百度网盘连接下载最新的 Android SDK文件包: androidsdk.zip ,并且解压,即可。
解压完成后,需要 配置一下添加一个环境变量ANDROID_HOME,设置值为sdk包解压目录,比如:
c:\tools\androidsdk
另外,还推荐大家配置环境变量PATH,加入adb所在目录:
c:\tools\androidsdk\platform-tools\
连接好以后,打开命令行窗口, 执行
adb devices -l
命令来列出连接在电脑上的安卓设备。
如果输出类似如下的内容:
List of devices attached
4d0035dc767a50bb evice product:LCT_LA100 xxx:HUAWEI
device:01
表示电脑上可以查看到 连接的设备,就可以运行自动化程序了。
首先来解释一下什么是环境变量path。
环境变量 Path 中包含的 这些目录, 就是 Windows查找程序的目录。
环境变量 Path 的内容包括了多个目录,目录之间用分号隔开。
当我们在CMD中敲入下面的命令时:
python Appium_Bilibili.py
Windows 命令执行器 就会依次搜索如下目录:
看这些目录中,是否有 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名称。
如下所示:
主要来说说实例化这一行。
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()方法的功能,那么的,一起来看看源代码:
第19行
from .webdriver import WebDriver as Remote
这就明白了,Remote实际上就是WebDriver类。
接下来我们看看WebDriver类。
可以看到,WebDriver把desired_caps传入了一个个的方法去执行。所以,这里的Romote()方法做了很多事情:
到这里,初始化就完成了。
Appium是基于Selenium的,所以和Selenium代码定位元素的基本规则相同。
对于安卓应用元素的 resource-id 属性
driver.find_element_by_id('expand_search')
对应安卓应用元素的类型
driver.find_elements_by_class_name('android.widget.TextView')
元素的 content-desc 属性是用来描述该元素的作用的
driver.find_element_by_accessibility_id('自饮一瓢')
表达式的语法规则和 Selenium 里面 Xpath 的语法是一样的
在appium中,xpath表达式中每个节点名是元素的 class 属性值
driver.find_element_by_xpath('//tag1/tag2[@attr="value"]')
谷歌安卓官方文档
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) # 按键