目录
前言
参考文章
Python自动化(安卓篇)
配置appium
联调夜神模拟器和appium
(1) 启动appium
(3) 调试模拟器
(4)需要测试的软件APP,是否有没有apk、有apk
实战代码剖析
Python自动化(IOS篇)
为啥写这篇文章?
目的 | 链接 |
手机APP自动化 | Appium原理与安装 | 白月黑羽 (byhy.net) |
python+夜神模拟器自动化 | CSDN博主「浅醉樱花雨」的原创文章 Python3 + Appium + 安卓模拟器 实现APP自动化测试,并生成测试报告_浅醉樱花雨的专栏-CSDN博客 |
1.打开安装目录,进入到bin目录(本人的路径:D:\Program Files\Nox\bin),备份adb.exe文件为adb_bak.exe;备份该目录的nox_adb.exe文件为nox_adb_bak.exe。
2.从Android SDK里(本人的路径:D:\WorkSpace\androidsdk\platform-tools目录下)复制adb.exe到D:\Program Files\Nox\bin下面;再复制一份adb.exe并重命名为nox_adb.exe。
3.启动模拟器,在D:\WorkSpace\androidsdk\platform-tools目录下鼠标右键打开控制台,执行nox_adb.exe connect 127.0.0.1:62001,然后执行adb devices,看到如下信息就表示成功。
C:\Users\AlienwareKgx>d:
D:\WorkSpace\androidsdk\platform-tools>cd D:\Program Files\Nox\bin
D:\Program Files\Nox\bin>nox_adb.exe connect 127.0.0.1:62001
* daemon not running; starting now at tcp:5037
* daemon started successfully
connected to 127.0.0.1:62001
D:\Program Files\Nox\bin>adb devices
List of devices attached
127.0.0.1:62001 device
【知识点补充】
连接好以后,打开控制台命令行窗口, 执行 adb devices -l 命令来列出连接在电脑上的安卓设备。
如果输出 类似如下的内容:
List of devices attached
4d0035dc767a50bb device product:t03gxx model:GT_N7100 device:t03g
表示电脑上可以查看到 连接的设备,就可以运行自动化程序了。
上述例子是手机连接电脑,不是模拟器哈。
在模拟器里安装测试apk
文件,直接将apk
文件拖到模拟器里即可,本人使用白月黑夜提供的apk。
继续在刚刚的控制台窗口里输入如下代码,其中D:\apk\wv.apk
是测试apk
的完整路径。
aapt dump badging D:\apk\wv.apk
效果展示:
D:\Program Files\Nox\bin>aapt dump badging D:\apk\wv.apk
package: name='com.example.jcy.wvtest' versionCode='1' versionName='1.0'
sdkVersion:'19'
targetSdkVersion:'29'
uses-permission:'android.permission.INTERNET'
application: label='鐧芥湀榛戠窘' icon='res/mipmap-mdpi-v4/ic_launcher.png'
launchable activity name='com.example.jcy.wvtest.MainActivity'label='' icon=''
uses-feature:'android.hardware.touchscreen'
main
supports-screens: 'small' 'normal' 'large' 'xlarge'
supports-any-density: 'true'
locales: '--_--' 'ca' 'da' 'fa' 'ja' 'nb' 'de' 'af' 'bg' 'th' 'fi' 'hi' 'vi' 'sk' 'uk' 'el' 'nl' 'pl' 'sl' 'tl' 'am' 'in' 'ko' 'ro' 'ar' 'fr' 'hr' 'sr' 'tr' 'cs' 'es' 'it' 'lt' 'pt' 'hu' 'ru' 'zu' 'lv' 'sv' 'iw' 'sw' 'bs_BA' 'fr_CA' 'lo_LA' 'en_GB' 'bn_BD' 'et_EE' 'ka_GE' 'ky_KG' 'km_KH' 'zh_HK' 'si_LK' 'mk_MK' 'ur_PK' 'sq_AL' 'hy_AM' 'my_MM' 'zh_CN' 'pa_IN' 'ta_IN' 'te_IN' 'ml_IN' 'en_IN' 'kn_IN' 'mr_IN' 'gu_IN' 'mn_MN' 'ne_NP' 'pt_BR' 'gl_ES' 'eu_ES' 'is_IS' 'es_US' 'pt_PT' 'en_AU' 'zh_TW' 'be_BY' 'ms_MY' 'az_AZ' 'kk_KZ' 'uz_UZ'
densities: '160' '240' '320' '480' '640' '65534'
可以看到安装包的信息都打印出来了,记录下【package: name】为'com.example.jcy.wvtest'、【launchable activity name】为 'com.example.jcy.wvtest.MainActivity'
这两个名称,待会儿写测试脚本的时候要用。
注意,如果模拟器重启了,需要执行
nox_adb.exe connect 127.0.0.1:62001
(4.1)没有apk
如果你应用已经安装在手机上了,可以直接打开手机上该应用,进入到你要操作的界面,然后执行
adb shell dumpsys activity recents | find "intent={"
会显示如下,最近的 几个 activity 信息:
intent={act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=tv.danmaku.bili/.ui.splash.SplashActivity}
intent={act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000300cmp=com.huawei.android.launcher/.unihome.UniHomeLauncher}
intent={flg=0x10804000 cmp=com.android.systemui/.recents.RecentsActivity bnds=[48,1378][10322746]}
intent={flg=0x10000000 cmp=com.tencent.mm/.ui.LauncherUI}
D:\Program Files\Nox\bin>adb shell dumpsys activity recents | find "intent={"
【本人实战】【在夜神模拟器打开哔哩哔哩(无需登录)】
intent={act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=tv.danmaku.bili/.MainActivityV2}
intent={act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000100 cmp=com.vphone.launcher/.launcher3.Launcher}
intent={act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10a00000 cmp=io.appium.settings/.Settings}
intent={act=android.intent.action.DELETE dat=package:com.tencent.android.qqdownloader#com.tencent.pangu.link.SplashActivity flg=0x10800000 cmp=com.android.packageinstaller/.UninstallerActivity}
intent={act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.mysoft.yunke.ydxs/com.mysoft.core.activity.LauncherActivity}
intent={act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10800100 cmp=com.android.settings/.FallbackHome}
其中第一行就是当前的应用,我们特别关注最后
cmp=tv.danmaku.bili/.ui.splash.SplashActivity
【本人实战】cmp=tv.danmaku.bili/.MainActivityV2
应用的package名称就是 tv.danmaku.bili
应用的启动Activity就是 .ui.splash.SplashActivity
(4.2)有apk
(1)如果你已经获取到了 apk,在命令行窗口执行
d:\tools\androidsdk\build-tools\29.0.3\aapt.exe dump badging d:\tools\apk\bili.apk | find "package: name="
输出信息中,获得“应用的package名称”
package: name='tv.danmaku.bili' versionCode='5531000' versionName='5.53.1' platformBuildVersionName='5.53.1' compileSdkVersion='28' compileSdkVersionCodename='9'
(2)在命令行窗口执行
d:\tools\androidsdk\build-tools\29.0.3\aapt.exe dump badging d:\tools\apk\bili.apk | find "launchable-activity"
输出信息中,获得“应用的启动Activity”
launchable-activity: name='tv.danmaku.bili.ui.splash.SplashActivity' label='' icon=''
import time
from appium import webdriver
from appium.webdriver.extensions.android.nativekey import AndroidKey
# 【目的】 bilibili自动化
# 【说明】 需要配合bilibili的apk使用
# 【python语法说明】 (1)webdriver.Chrome() 表示 类.对象() 对象实例化 (2) r'字符串' 表示不存在转义
# 【date】 20211006 14:53:00
# 【author】 xiaoke
class TestBilibili_01():
def __init__(self, name):
# __init__()方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法
self.name = name
# 测试开始前执行的方法
def setUp(self):
desired_caps = {
'platformName': 'Android', # 被测手机是安卓
'platformVersion': '7.1.2', # 手机安卓版本 又称:平台名称
'deviceName': 'xxx', # 设备名,安卓手机可以随意填写 【设备名称。如果是真机,在'设置->关于手机->设备名称'里查看,模拟器推荐填写 127.0.0.1:62001】
'appPackage': 'tv.danmaku.bili', # 启动APP Package名称 又称:apk的包名
'appActivity': '.MainActivityV2', # 启动Activity名称
'unicodeKeyboard': True, # 使用自带输入法,输入中文时填True
'resetKeyboard': True, # 执行完程序恢复原来输入法
'noReset': True, # 不要重置App
'newCommandTimeout': 6000,
'automationName': 'UiAutomator2'
# 'app': r'd:\apk\bili.apk',
}
# 连接Appium Server,初始化自动化环境
self.driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps) # 连接Appium
# self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
# 设置缺省等待时间
self.driver.implicitly_wait(8)
# 结束后执行的方法
def setDown(self):
self.driver.quit()
def work(self):
# 如果有`青少年保护`界面,点击`我知道了`
iknow = self.driver.find_elements_by_id("text3")
if iknow:
iknow.click()
# 根据id定位搜索位置框,点击
self.driver.find_element_by_id("expand_search").click()
# 根据id定位搜索输入框,点击
sbox = self.driver.find_element_by_id('search_src_text')
sbox.send_keys('白月黑羽')
# 输入回车键,确定搜索
self.driver.press_keycode(AndroidKey.ENTER)
# 选择(定位)所有视频标题
elements = self.driver.find_elements_by_id("title")
for element in elements:
# 打印标题
print(element.text)
if __name__ == '__main__':
# 创建 TestBilibili_01 类的第一个对象
bili = TestBilibili_01("Bilibili")
bili.setUp()
input('**** Press to quit..')
bili.setDown()
【效果】
【剖析1】为啥要这么写?
# 连接Appium Server,初始化自动化环境
self.driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps) # 连接Appium
【解答】本人编写的python程序是客户端,appium server是服务端(内嵌nodeJs) 。所以是客户端请求服务端,http服务,而服务的url为 http://127.0.0.1:4723/wd/hub (个人猜测wd 就是webDriver)
【剖析2】为啥要这么写?
【解答】
【剖析3】为啥要这么写?
【解答】
【剖析4】为啥要这么写?
【解答】
【剖析5】为啥要这么写?
【解答】
【剖析6】为啥要这么写?
【解答】