Python自动化测试

目录

前言

参考文章

Python自动化(安卓篇)

配置appium

联调夜神模拟器和appium

(1) 启动appium

(3) 调试模拟器

(4)需要测试的软件APP,是否有没有apk、有apk

实战代码剖析

Python自动化(IOS篇)


前言

为啥写这篇文章?

参考文章

目的 链接
手机APP自动化 Appium原理与安装 | 白月黑羽 (byhy.net)
python+夜神模拟器自动化

CSDN博主「浅醉樱花雨」的原创文章

Python3 + Appium + 安卓模拟器 实现APP自动化测试,并生成测试报告_浅醉樱花雨的专栏-CSDN博客

Python自动化(安卓篇)

配置appium

Python自动化测试_第1张图片

联调夜神模拟器和appium

(1) 启动appium

Python自动化测试_第2张图片

Python自动化测试_第3张图片

(3) 调试模拟器

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,看到如下信息就表示成功。

Python自动化测试_第4张图片

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

Python自动化测试_第5张图片

【知识点补充】

连接好以后,打开控制台命令行窗口, 执行 adb devices -l 命令来列出连接在电脑上的安卓设备。
如果输出 类似如下的内容:

List of devices attached
4d0035dc767a50bb        device product:t03gxx model:GT_N7100 device:t03g

表示电脑上可以查看到 连接的设备,就可以运行自动化程序了。
上述例子是手机连接电脑,不是模拟器哈。

在模拟器里安装测试apk文件,直接将apk文件拖到模拟器里即可,本人使用白月黑夜提供的apk。

Python自动化测试_第6张图片

继续在刚刚的控制台窗口里输入如下代码,其中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)需要测试的软件APP,是否有没有apk、有apk

(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()

【效果】

Python自动化测试_第7张图片 

Python自动化测试_第8张图片

 

【剖析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)

Python自动化测试_第9张图片

 Python自动化测试_第10张图片

【剖析2】为啥要这么写? 

【解答】

【剖析3】为啥要这么写? 

【解答】

【剖析4】为啥要这么写? 

【解答】

【剖析5】为啥要这么写? 

【解答】

【剖析6】为啥要这么写? 

【解答】

Python自动化(IOS篇)

你可能感兴趣的