Python自动化测试

Posted R&Y

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python自动化测试相关的知识,希望对你有一定的参考价值。

目录

前言

参考文章

Python自动化(安卓篇)

配置appium

联调夜神模拟器和appium

(1) 启动appium

(2) 配置安卓SDK

(3) 调试模拟器

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

(5) 实战代码剖析

(6) 元素定位实战&理论

Python自动化(IOS篇)



前言

为啥写这篇文章?不告诉你哈。

参考文章

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

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

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

appium-inspector使用教程Appium Inspector使用_BUG1314的专栏-CSDN博客_appium inspector

Python自动化(安卓篇)

配置appium

(1)白月黑羽的版本,一开始本人使用他提供的sdk。 白月黑羽版的安卓SDK如下图所示,但是他的 uiautomateviewer.bat(安卓查看APP界面元素 的工具会闪退。

所以本人自己安装了

(2) 安装 appium-inspector

 参考链接

目的链接
appium-inspectorappium/appium-inspector: A GUI inspector for mobile apps and more, powered by a (separately installed) Appium server (github.com)

appium-inspector已经独立于 appium,所以需要从github下载。

联调夜神模拟器和appium

(1) 启动appium

(2) 配置安卓SDK

参考文章

目的链接
SDK国内下载地址AndroidDevTools - Android开发工具 Android SDK下载 Android Studio下载 Gradle下载 SDK Tools下载
教程Android SDK的下载与安装 - 菜鸟学飞ing - 博客园 (cnblogs.com)
知乎教程Android SDK下载安装及配置教程 - 知乎

前言

1.目前官网上已经没有单独的SDK下载安装包了。目前官网推荐的是下载包含有android SDK的Android Studio。Android Studio 的一个功能非常强大的用来做安卓开发试调的官方出品的工具。Ps:官网下载,需科学上网。官网下载传送门

2.由于这个Android Studio 的安装包过大且官网下载需要FQ,而咱们在用Appium 的时候实际上只需要用到SDK 工具而已。所以推荐大家去另外一个国内的Android 工具的下载网站下载。传送门

SDK Tools

SDK Platform-Tools

这是 adb, fastboot 等工具包。把解压出来的 platform-tools 文件夹放在 android sdk 根目录下,并把 adb所在的目录添加到系统 PATH 路径里,即可在命令行里直接访问了 adb, fastboot 等工具。

 Build-Tools
这是Android开发所需的Build-Tools,下载并解压后,将解压出的整个文件夹复制或者移动到 your sdk 路径/build-tools 文件夹即可。

【配置】

SDK Manager.exe

【最终】 

(1)本人的

(2)白月黑羽版的安卓SDK如下图所示,但是他的 uiautomateviewer.bat(安卓查看APP界面元素 的工具会闪退。

 【补充】

更换Android SDK在线更新镜像服务器来下载安装:

​1、北京化工大学镜像服务器地址:

IPv4: http://ubuntu.buct.edu.cn/ 端口:80

IPv4: http://ubuntu.buct.cn/ 端口:80

IPv6: http://ubuntu.buct6.edu.cn/ 端口:80

2、大连东软信息学院镜像服务器地址:

http://mirrors.neusoft.edu.cn 端口:80

3、郑州大学开源镜像站:

http://mirrors.zzu.edu.cn 端口:80

使用方法:

(1) 启动 Android SDK Manager ,打开主界面,依次选择『Tools』、『Options...』,弹出『Android SDK Manager - Settings』窗口;

(2) 在『Android SDK Manager - Settings』窗口中,在『HTTP Proxy Server』和『HTTP Proxy 
Port』输入框内填入上面镜像服务器地址(不包含http://,如下图)和端口,并且选中『Force https://... sources to be fetched using http://...』复选框。设置完成后单击『Close』按钮关闭『Android SDK Manager - Settings』窗口返回到主界面;

(3) 依次选择『Packages』、『Reload』。

【win11配置环境变量】

打开如下图

把%ANDROID_HOME%\\platform-tools、%ANDROID_HOME%\\tools添加到Path环境变量。 

ANDROID_HOME
D:\\WorkSpace\\android-sdk-windows

%ANDROID_HOME%\\platform-tools
%ANDROID_HOME%\\tools

检测是否配置成功。打开命令行窗口,输入adb。出现如下图所示内容则配置成功:

C:\\Users\\AlienwareKgx>adb
Android Debug Bridge version 1.0.41
Version 29.0.6-6198805
Installed as D:\\WorkSpace\\android-sdk-windows\\platform-tools\\adb.exe

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

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) 需要测试的软件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=''

(5) 实战代码剖析

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】定位元素

【解答】

代码规则

从示例代码可以发现,和Selenium Web自动化一样,要操作界面元素,必须先定位(选择)元素。

Appium是基于Selenium的,所以 和 Selenium 代码 定位元素的基本规则相同:

  • find_element_by_XXX 方法,返回符合条件的第一个元素,找不到抛出异常

  • find_elements_by_XXX 方法,返回符合条件的所有元素的列表,找不到返回空列表

  • 通过 WebDriver 对象调用这样的方法,查找范围是整个界面

  • 通过 WebElement 对象调用这样的方法,查找范围是该节点的子节点

界面元素查看工具

做 Selenium Web 自动化的时候,要找到元素,我们是通过浏览器的开发者工具栏来查看元素的特性,根据这些特性(属性和位置),来定位元素

Appium 要自动化手机应用,同样需要工具查看界面元素的特征。

常用的查看工具是: Android Sdk包中的 uiautomateviewer 和 Appium Desktop 中的 Appium Inspector

uiautomateviewer

安卓查看APP界面元素,最常用的就是 Android SDK 中的工具 uiautomateviewer ,它在SDK目录目录 的 tools\\bin 目录中

D:\\WorkSpace\\androidsdk\\tools\\uiautomatorviewer.bat

本人的版本
D:\\WorkSpace\\android-sdk-windows\\tools\\uiautomatorviewer.bat

和Selenium一样,我们要定位选择元素,也是根据元素的特征,包括

  • 元素的属性
  • 元素的相对位置(相对父元素、兄弟元素等)

Appium Inspector

Appium Desktop 中的 Appium Inspector 也可以查看元素。它的一个优点是可以直接验证选择表达式是否能定位到元素。

127.0.0.1
4723
/wd/hub
{
  "platformName": "Android",
  "appium:platformVersion": "7.1.2",
  "appium:deviceName": "xxx",
  "appium:appPackage": "tv.danmaku.bili",
  "appium:appActivity": ".MainActivityV2",
  "appium:unicodeKeyboard": true,
  "appium:resetKeyboard": true,
  "appium:noReset": true,
  "appium:newCommandTimeout": 6000,
  "appium:automationName": "UiAutomator2"
}

platformName: 平台名称设置为Android
platformVersion:填写当前连接的Android设备的系统版本,必须正确
deviceName: 填写Android设备名称,不需要正确
app: 路径,从本地选择要测试应用的apk路径
appPackage: 测试app的package
appActivity: 测试app的StartActivity
unicodeKeyboard: 布尔值 true则禁用手机键盘
noReset: 布尔值true 则不重新安装apk,false则重新安装apk
newCommandTimeout: 6000

【剖析3】uiautomatorviewer.bat闪退

【解答】

D:\\WorkSpace\\android-sdk-windows\\tools\\uiautomatorviewer.bat (已加上被本人修改的)具体内容如下:


@echo off
rem Copyright (C) 2012 The Android Open Source Project
rem
rem Licensed under the Apache License, Version 2.0 (the "License");
rem you may not use this file except in compliance with the License.
rem You may obtain a copy of the License at
rem
rem      http://www.apache.org/licenses/LICENSE-2.0
rem
rem Unless required by applicable law or agreed to in writing, software
rem distributed under the License is distributed on an "AS IS" BASIS,
rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rem See the License for the specific language governing permissions and
rem limitations under the License.

rem don't modify the caller's environment
setlocal

rem Set up prog to be the path of this script, including following symlinks,
rem and set up progdir to be the fully-qualified pathname of its directory.
set prog=%~f0

rem Change current directory and drive to where the script is, to avoid
rem issues with directories containing whitespaces.
cd /d %~dp0

rem Get the CWD as a full path with short names only (without spaces)
for %%i in ("%cd%") do set prog_dir=%%~fsi

rem Check we have a valid Java.exe in the path.
set java_exe=
call lib\\find_java.bat
if not defined java_exe goto :EOF

set jarfile=uiautomatorviewer.jar
set frameworkdir=.

if exist %frameworkdir%\\%jarfile% goto JarFileOk
    set frameworkdir=lib

if exist %frameworkdir%\\%jarfile% goto JarFileOk
    set frameworkdir=..\\framework

:JarFileOk

set jarpath=%frameworkdir%\\%jarfile%

if not defined ANDROID_SWT goto QueryArch
    set swt_path=%ANDROID_SWT%
@REM 替换为自己的路径
@REM set swt_path=D:\\WorkSpace\\android-sdk-windows\\tools\\lib\\x86_64
    goto SwtDone

:QueryArch

    for /f "delims=" %%a in ('"%java_exe%" -jar %frameworkdir%\\archquery.jar') do set swt_path=%frameworkdir%\\%%a

:SwtDone

if exist "%swt_path%" goto SetPath
    echo SWT folder '%swt_path%' does not exist.
    echo Please set ANDROID_SWT to point to the folder containing swt.jar for your platform.
    exit /B

:SetPath
set javaextdirs=%swt_path%;%frameworkdir%

call "%java_exe%" "-Djava.ext.dirs=%javaextdirs%" "-Dcom.android.uiautomator.bindir=%prog_dir%" -jar %jarpath% %*

@REM 不会马上闪退了,可以看到报错。得输入回车才会退出bat程序
@REM pause

(1)uiautomatorviewer.bat鼠标右键选编辑(本人选择pycharm打开编辑),第一行为空行,最后一行输入:pause。文件另存为 下面的编码格式选为ANSI,保存文件。(本人没有改编码格式) 

这样报错就不是马上闪退了,可以看到报错。得输入回车才会退出bat程序。(感兴趣可以去学习bat)

(2)闪退原因之一:找不到swt.jar

【解决措施一】修改uiautomatorviewer.bat

D:\\WorkSpace\\android-sdk-windows\\tools\\lib\\x86_64
if not defined ANDROID_SWT goto QueryArch
@REM     set swt_path=%ANDROID_SWT%--废弃
    set swt_path=D:\\WorkSpace\\android-sdk-windows\\tools\\lib\\x86_64
    goto SwtDone

【解决措施二】不修改uiautomatorviewer.bat,增加环境变量

 上述步骤后,发现uiautomatorviewer.bat还是报错。无法创建java虚拟机吧

 (3)闪退原因之一:jdk版本不是推荐的1.8

 查看jdk,发现是12的,赶紧卸载重装jdk1.8(java8)

JAVA_HOME
D:\\Program Files\\Java\\jdk1.8.0_301

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

 【结果】终于打开了uiautomatorviewer,是真的傻逼这个过程,艰辛。

如果点击后没显示,可能需要重启模拟器,真机的话可以拔usb再查回来。

 

【剖析3.1】uiautomatorviewer经常出现报错?

【解答】

因为它和appinum server 会有冲突,建议把appinum server关闭重启(不要关闭uiautomatorviewer哈),然后点击 Device Screenshot。

​​​​​​​

【剖析4】appium-inspector配置后报错

Failed to create session. The requested resource could not be found, or a request was received using an HTTP method that is not supported by the mapped resource

【解答】

self.driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)  # 连接Appium

本人是没有配置http://127.0.0.1:4723/wd/hub 这句话(即没有配置appium server)导致的报错。

 如下图所示配置

 2233娘们出现了。

(6) 元素定位实战&理论

Python自动化(ios篇)

以上是关于Python自动化测试的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 多处理进程中运行较慢的 OpenCV 代码片段

python Python测试片段

python常用代码

Python 自动化 - 浏览器chrome打开F12开发者工具自动Paused in debugger调试导致无法查看网站资源问题原因及解决方法,javascript反调试问题处理实例演示(代码片段

python Cacher的测试片段

30 段 Python 实用代码