# frame_app_ui_PublicVersion **Repository Path**: panyurong/frame_app_ui_PublicVersion ## Basic Information - **Project Name**: frame_app_ui_PublicVersion - **Description**: 公开版:app端UI自动化框架(Android系统) - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2023-04-19 - **Last Updated**: 2025-04-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # app_ui_frame ## 框架介绍 ​ 1、本项目为根据PO模式设计实现的app端UI自动化框架 ​ 2、测试框架简单可以理解为一定的目录结构,这些目录结构分别实现了公共代码的封装,日志,用例的封装,测试报告等 ​ 3、测试框架就是将公共方法,日志,测试报告,截图,数据驱动等独立封装出来 ​ 4、测试框架的一个重要特性就是可移植性,即针对不同的业务项目,只需要单独写业务代码,其他模块都可以通用 ### APP自动化与WEB自动化的比较 APP 自动化 与 WEB 自动化 的主要区别在于以下几点: | | WEB | APP | | ---------- | ---------------------------------- | -------------------------------------- | | 启动方式 | 浏览器启动、多线程 | 呼出APP启动、只能单线程 | | 客户端信息 | 通过启动 webdriver 不同的浏览器类 | 需要制定desired_caps内容,包含设备信息 | | 元素定位 | name、id、class_name、css、xpath等 | 不支持 css_selector 和 linktext | | 元素操作 | 可以支持通过 js 实现 | 不支持 js ,但支持滑动等操作 | ## 软件架构 ​ cases:用例文件管理目录 ​ datas:用例数据文件管理目录 ​ etc:配置文件管理目录 ​ logs:日志目录 ​ pages:page文件管理目录 ​ plugins:第三方插件管理目录 ​ reports:测试报告目录 ​ tools:通用方法代码文件管理目录 ## 设计步骤 ​ 1、项目目录结构搭建 ​ 2、封装日志打印、文件读取、数据库操作、邮件发送等公共方法 ​ 3、PO模式设计 ​ 3.1 PO模式基于传统的关键字驱动与数据驱动,将页面元素定位和对元素的操作行为封装成一个page类,实现对页面对象和测试用例的分离,使得自动化测试脚本的减少代码重复、更易读、减少维护成本 ​ 3.2 基础层:BasePage ​ 对Selenium各种常用的元素定位、元素操作、元素等待等方法进行2次封装,组成公共组件库BasePage类 ​ 3.3 PO层:PageCalss ​ 将每一个页面都作为一个单独的pageClass类,都继承BasePage类。主要实现web页中的元素定位、元素操作、业务操作方法的封装,分三步: ​ 第一步(定位分离):将界面的元素抽离出来(定位的方式、定位的值) ​ 第二步(操作分离):将元素的操作方法抽离出来 ​ 第三步(业务分离):将业务操作抽离出来(经常操作的业务绑定在一起) ​ 3.4 测试用例层:TestCase ​ TestCase依赖PageCalss类,从而实现相应的测试步骤 ## 过程记录 ​ 1、目录结构搭建 ​ 2、同步项目到Git进行版本控制,创建dev分支 ​ 3、创建utility.py文件,封装常用功能方法 ​ 4、创建get_log.py文件,封装日志打印功能类 ​ 5、创建get_data.py文件,封装获取ini、Json、yaml等文件类型的数据方法 ​ 6、创建get_path.py文件,用于获取项目路径 ​ 7、创建get_time.py文件,封装获取时间相关方法 ​ 8、创建get_db.py文件,封装常用数据库类型的操作模块 ​ 9、创建push_ddmsg.py文件,封装推送钉钉机器人消息方法 ​ 10、创建config.py文件,日志打印配置公共参数等 ​ 11、封装BasePage基础类。存放在pages文件夹内 ​ 12、将每个页面封装为pageclass类。存放在pages文件夹内 ​ 12.1 定位分离 ​ 12.1.1 隔离定位:页面元素进行分离,每个元素只定位一次,如果页面改变,只需要改变相应的元素定位 ​ 12.1.2 数据驱动:将元素信息,及对元素的操作方法,写到yaml中。优点:如果有100个地方用到了一个元素,当元素定位表达式变了,只需要改配置文件就行了,不用100个地方每个都修改。存放在datas文件夹内 ​ 12.2 操作分离 ​ 12.2.1 分离操作:将常用的元素操作封装为方法 ​ 12.2.2 日志打印:将操作内容输出到日志 ​ 12.3 业务分离 ​ 根据业务逻辑对操作方法进行组装实现业务操作。如果跳转到新的页面,return返回这个新页面 ​ 13、创建conftest.py文件,存放在根目录下: ​ 13.1 利用pytest_runtest_makereport这个方法实现失败用例自动截图 ​ 13.2 利用pytest_report_teststatus实现自定义测试结果 ​ 13.3 利用pytest_runtest_setup、pytest_runtest_makereport实现用例执行失败后其他不再执行(当前类内) ​ 14、测试用例 ​ 13.1 使用测试框架pytest ​ 13.2 创建run_test.py,用于启动测试用例。存放在根目录下 ​ 13.3 创建conftest.py,用于配置pytest全局参数。存放在根目录下 ​ 13.4 测试用例:将自动化测试用例编写成代码。存放在cases文件夹内 ​ 13.5 数据驱动:把用例数据提取到数据文件中,使用数据驱动来驱动测试用例,可以方便我们用例的管理和维护。存放在datas文件夹内 ​ 15、结合allure生成测试报告 ​ 15、创建run_test.py文件,用于启动测试。存放在根目录下 ## 功能简介 ``` 1、钉钉机器人消息推送 2、失败用例自动截图 3、当前测试类中被标记的用例执行失败后,跳过其他同样被标记的未执行用例 ``` ## 使用教程 ### 准备工作 #### 环境搭建 ##### Appium安装 ###### 1.配置jdk,这里推荐jdk1.8版本 (1)进入官网:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html ![输入图片说明](datas/images/jdk%E4%B8%8B%E8%BD%BD1.png) (2)运行exe文件,一直下一步即可 ![输入图片说明](datas/images/jdk%E4%B8%8B%E8%BD%BD2.png) (3)配置java环境变量 第一:配置JAVA_HOME ![输入图片说明](datas/images/jdk%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F1.png) 第二步:配置path ![输入图片说明](datas/images/jdk%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F2.png) 第三步:配置classpath ![输入图片说明](datas/images/jdk%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F3.png) ###### 2.配置Android SDK (1)进入网站下载安装包:http://tools.android-studio.org/index.php/sdk ![输入图片说明](datas/images/Android%20SDK%E4%B8%8B%E8%BD%BD1.png) (2)解压压缩包 ![输入图片说明](datas/images/Android%20SDK%E4%B8%8B%E8%BD%BD2.png) (3)打开SDK Readme.txt文件,复制命令行 ![输入图片说明](datas/images/Android%20SDK%E4%B8%8B%E8%BD%BD3.png) (4)在cmd命令行中执行复制的命令(帮助我们自动下载各版本的sdk的包) ![输入图片说明](datas/images/Android%20SDK%E4%B8%8B%E8%BD%BD4.png) (5)配置环境变量 第一步:配置ANDROID_HOME ![输入图片说明](datas/images/Android%20SDK%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F1.png) 第二步:配置path ![输入图片说明](datas/images/Android%20SDK%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F2.png) (6)检查 在cmd命令行输入:adb ###### 3.安装appium desktop(appium server) (1)进入官网下载安装包:https://github.com/appium/appium-desktop/releases/tag/v1.18.3 ![输入图片说明](datas/images/appium%E4%B8%8B%E8%BD%BD.png) (2)点击下一步,安装 ###### 4.安装appium client ``` pip install appium-python-client ``` ##### Android环境 ###### 1、真机环境 ``` Android手机用usb数据线连接到pc的usb口上 打开手机的开发者模式(默认没打开):设置->关于手机->版本号10.0.0.162,连续点五次以上,会提示已经打开开发者模式 在设置的最上端,搜索“开发人员选项”,点进去 勾选其中的USB调试,弹出的提示框,要点确定确认 勾选仅充电模式下允许ADB调试 在屏幕的通知栏(屏幕从上往下划),其中usb连接的通知,点进去,都选传输文件mtp 在PC端命令窗口,cmd->adb devices,如果能够列出设备的序列号就说明环境搭建成功 ``` ###### 2、第三方模拟器 ``` 模拟器:夜神、雷电、逍遥、iTools 连接方式参考真机 ``` ###### 3、ADT自带安卓模拟器 ``` 封装好的用于开发Android的ADT Bundle: 1.jdk环境搭建(java环境) 2.ADT环境搭建 1.SDK软件开发包(安卓开发) 2.自带安卓专用eclipse 3.自带的安装模拟器 ``` ``` 扩展一: jdk,是Java开发工具包,主要用于编写Java程序;也就是说你要使用Java语言,就需要安装jdk sdk,就是软件开发包,是一个广义的概念,任何编程工具几乎都可以看成是SDK。单单说SDK,范围太大。如果是Android sdk,就可以理解是安卓机器的操作系统,类似Windows操作系统。没有Android sdk,就无法进行Android开发。简言之,jdk是sdk的一种 扩展二: 也可以自己配置Eclipse内嵌ADT + SDK安卓开发环境 ``` ##### ADB工具 ###### adb 工具简介 ``` adb 的全称为Android Debug Bridge,就是起到调试桥的作用,用于电脑和 android 手机的连接,可以通过 adb 工具,用电脑来操控手机。adb 是谷歌提供的一个开发用的辅助工具,包含在 android studio 中。谷歌后来提供了单独的平台工具的包(https://developer.android.google.cn/studio/releases/platform-tools),包含了adb。另外各个 android 模拟器中也包含了 adb 工具 adb.exe在你安装的android的sdk开发包platform-tools目录下 ``` ###### adb 工具的原理 ``` 它就是一个命令行窗口,用于通过电脑端与模拟器或者真实设备交互。包括三大内容: 1.电脑上运行的客户端。 2.在你用于开发的机器上作为后台进程运行的服务器。 3.一个以后台进程的形式运行于模拟器或设备上的守护程序(daemon) ``` ###### adb 工具包含 - adb server - adb client - adb daemon(运行在 android 手机中) ![输入图片说明](datas/images/adb%E5%B7%A5%E5%85%B7.png) ###### adb 常用指令 **1.adb devices** 该命令用于查看电脑连接的设备(手机或者模拟器) ![输入图片说明](datas/images/adb%20%E5%B8%B8%E7%94%A8%E6%8C%87%E4%BB%A41.png) 127.0.0.1:21503 对应的就是模拟器,21503 是逍遥模拟器的默认端口。 127.0.0.1:21503 对应手机的序列号,用于区分不同的手机设备。序列号的后面是 device 表示设备正常,如果发现是 offline,一般通过重启手机/模拟器可以解决。 可以通过 adb connect 或者 adb disconnect 来连接或者断开手机。对于真机而言, 一般可以通过 ip 地址来进行连接,要求手机和电脑在同一个局域网内 ![输入图片说明](datas/images/adb%20%E5%B8%B8%E7%94%A8%E6%8C%87%E4%BB%A41.2.png) 注意:如果多次重启模拟器或者真机,仍然连接不上设备。可以考虑是模拟器文件中的adb.exe与sdk中的不兼容,将sdk中的adb.exe文件替换到模拟器文件中。 **2.adb install** 该命令用于在手机上安装应用。 adb install apk文件路径 如果电脑同时连接多个手机,会提示错误,需要通过-s 参数来明确在哪个手机上安装。 adb -s 序列号 install apk 文件路径 ![输入图片说明](datas/images/adb%20%E5%B8%B8%E7%94%A8%E6%8C%87%E4%BB%A42.png) adb install 时也可能失败,常见的原因有: 1、app 对应的 sdk 的最低版本比 android 系统对应的 sdk 版本要高 2、app 对应的处理器不兼容 **3.adb uninstall** adb uninstall 包名 包名可以在 androidmanifest.xml 文件中查看到 ![输入图片说明](datas/images/adb%20%E5%B8%B8%E7%94%A8%E6%8C%87%E4%BB%A43.1.png) androidmanifest.xml 文件由于进行扰码,所以查看起来不方便,可以通过 aapt 工具来查看包名。 aapt d badging apk文件路径 ![输入图片说明](datas/images/adb%20%E5%B8%B8%E7%94%A8%E6%8C%87%E4%BB%A43.2.png) 通过包名卸载 app。 ![输入图片说明](datas/images/adb%20%E5%B8%B8%E7%94%A8%E6%8C%87%E4%BB%A43.3.png) 通过包名卸载 app。 ![输入图片说明](datas/images/adb%20%E5%B8%B8%E7%94%A8%E6%8C%87%E4%BB%A43.4.png) **4.adb pull** 该命令用于将手机上的文件取到(复制到)电脑上。 adb pull 手机上文件路径 电脑上文件路径 ![输入图片说明](datas/images/adb%20%E5%B8%B8%E7%94%A8%E6%8C%87%E4%BB%A44.png) 需要注意 android 系统和 windows 系统中斜杠线的方向。 实际工作中一般会从手机上获取截图、录频、数据库文件、配置文件、日志文件等。 **5.adb push** 该命令用于将电脑上文件复制到手机上。 adb push 电脑文件路径 手机文件路径 ![输入图片说明](datas/images/adb%20%E5%B8%B8%E7%94%A8%E6%8C%87%E4%BB%A45.png) 实际工作中一般从电脑上复制一些复杂的测试文件到手机上去。 **6.adb shell** 该命令用于进入 android 系统。 ![输入图片说明](datas/images/adb%20%E5%B8%B8%E7%94%A8%E6%8C%87%E4%BB%A46.1.png) 针对真机操作 adb shell,往往看到的用户是 shell 用户,可以通过 adb root 切换为 root 用户,前提是真机已经 root 过。 android 系统中有几个文件夹需要注意: 1、/data/app,用来放用户自己安装的 app 的 apk 文件 ![输入图片说明](datas/images/adb%20%E5%B8%B8%E7%94%A8%E6%8C%87%E4%BB%A46.2.png) 2、/data/data,用来放系统应用和用户应用的安装目录的 ![输入图片说明](datas/images/adb%20%E5%B8%B8%E7%94%A8%E6%8C%87%E4%BB%A46.3.png) 3、运行考研帮的 app 后,相应目录下出现新的文件夹和文件。 ![输入图片说明](datas/images/adb%20%E5%B8%B8%E7%94%A8%E6%8C%87%E4%BB%A46.4.png) **7.adb kill-server/adb start-server** 这组命令用于重启 adb 服务器。 **8.adb shell screencap** 该命令用于截图。 adb shell screencap -p 截图文件路径(手机上的路径) **9.adb --help** 查看帮助命令 **10.adb logcat** 查看adb日志 `adb logcat -v time -s *:E > d:\logcat.txt` -v time 是给日志加上时间戳,-s 是对日志进行过滤,*:E 表示只看错误及以上的信息。 日志信息级别分为: 1、V 2、I,系统信息 3、D,调试信息 4、W,警告信息 5、E,错误信息 实际测试时,操作同时保存 logcat 的日志,操作结束后,可以在 logcat 日志中进行关键字查询,比如 error、exception、anr、crash 等等。 **11.adb bugreport** 查看 android 系统启动日志。在对手机进行整机测试时可以查看该日志。单独对 app 进行测试不需要关注 **12.adb shell dumpsys battery** 查看设备状态 ![输入图片说明](datas/images/adb%20%E5%B8%B8%E7%94%A8%E6%8C%87%E4%BB%A412.png) **13.adb shell dumpsys activity top** 获取最上层的应用的信息(包名和活动名) 一般打开被测app首页后,在终端运行该命令来获取app的相关信息 ![输入图片说明](datas/images/adb%20%E5%B8%B8%E7%94%A8%E6%8C%87%E4%BB%A413.png) **14.adb shell dumpsys activity activities** 获取当前的任务列表 ![输入图片说明](datas/images/adb%20%E5%B8%B8%E7%94%A8%E6%8C%87%E4%BB%A414.png) **15.adb shell am start -W -n app包名/app活动名** 启动app **16.aapt dump badging apk文件路径 | grep(findstr) launchable-activity** 对于未安装的app,使用该命令获取app的包名和活动名 ###### adb 连接真机或者第三方模拟器 **连接真机或者模拟器的前置操作,手机中需要做一些设置** - 进入模拟器或者手机的设置菜单 - 点击关于平板电脑 - 连续点击最下面的版本号,进入开发者模式 - 进入开发者选项 - 打开 usb 调试(逍遥模拟器不打开也 ok) - 对于真机而言,还需要注意“选择 usb 配置”不能是仅限充电。 - 如果是华为品牌的真机,还可能需要安装华为的手机助手 - 如果出现电脑和手机无法连接,可以考虑重启 adb server,或者是重启手机。 - 常见的模拟器比如 genymotion(可以自由选择不同的 android 版本,还支持来电和短信的模拟)、逍遥模拟器、夜神模拟器。实际工作中通常是用真机进行测试, 除非是一些手游,会考虑模拟器的支持。 - adb 工具本身有版本,可以通过 adb version 来查看。如果尝试用 sdk中带的 adb 工具连接模拟器,可能会出现提示 client 的版本和 server 的版本不一致。用其中一个 adb 覆盖另外一个 adb 即可。 **使用夜神模拟器的前置操作** ``` 在我们配置好 appium 的环境、安装好 “夜神模拟器” 之后,还需要进行一步操作。这就是将 “夜神模拟器” 自身的 `adb` 替换成 我们安装的 Android SDK 的 adb 。 这是因为 模拟器的 adb 的版本比 Android SDK 的 adb 要低,这种情况下就会导致服务没有办法启动,所以需要替换掉。(如果是 windows 系统的话,还需要将复制过来的 adb.exe 改成 nox_adb.exe ,具体视实际情况而定。) 如此就能够保证两个 adb 的版本是完全一致的。 ``` ``` 在系统环境变量path里面添加模拟器的bin路径 ``` 然后利用进入夜神模拟器的路径,利用 `adb` 链接当前的夜神模拟器。 ``` - 执行命令:`adb connect 127.0.0.1:62001` ;夜神模拟器的默认端口是 `62001`;当出现 `connected to 127.0.0.1:62001` 则表示已连接到设备。 - 执行命令:`adb devices` ;如果出现 `127.0.0.1:62001 device` 则代表当前的 adb 链接已经大功告成。 ``` **在appium desktop中启动appium server** ![输入图片说明](datas/images/appium%E5%90%AF%E5%8A%A8.png) **启动 Inspector Session,创建一个session会话** ![输入图片说明](datas/images/appium%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AAsession%E4%BC%9A%E8%AF%9D.png) **Capability配置** 关于 Capability 的配置,其主要就分成了三部分:`公共部分、android部分、ios部分。` 相对应的就是配置 android ,就连接 android,配置 ios 则连接 ios 1、Capability 配置讲解 - 公共部分 | 关键字 | 描述 | 实例 | | ------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | | `automationName` | 自动化测试的引擎 | 默认就是 `appium` (一般也不会可以区设置) | | `platformName` | 你要测试的手机操作系统 | `Android` 或者 `IOS` | | `platformVersion` | 手机操作系统的版本 | 例如 `7.1`.2, `4.2.1` (一般可以从设置中心查看) | | `deviceName` | 使用的手机或模拟器类型 | ios系统一般写的是手机型号 安卓系统则写的是设备名称或IP与端口号 | | app | 标识apk 或者 ipa 文件所在的本地路径 一般情况下在初次安装app时使用 如果指定了 `appPackage` 和 `appActivity` 参数,则不需要此参数了。 该参数也与 `browserName` 不兼容。 | xxx/xxx.apk | | `browserName` | 做自动化时使用的 浏览器名字。如果是 一个应用则只需填写个空的字符串 | ‘Safari’ 对应 iOS; ‘Chrome’, 'Chromium’与 ‘Browser’ 则对应 Android | | `newCommandTimeout` | 用于客户端在退出或者结束 session 之前,appium 等待客户端发送一条新 命令所花费的时间(秒为单位) | 超时时间默认为`60`,一般不会去设置 | | `language` | 为模拟器设置语言 | 一般不会设置 | | `udid` | 连接真机的唯一设备号(主要针对 ios) | `1ee314287ad321g` | | `noReset` | 在当前 session 下不会重置应用的状态。默认值为 `false` | `true`, `false` | 2、Capability 配置讲解 - 安卓部分 | 关键字 | 描述 | 实例 | | ----------------- | ------------------------------------------------------------ | --------------------------------------------------- | | `appPackage` | app应用的包名,唯一标识,好知道是哪一个app | `com.example.android.myApp`, `com.android.settings` | | `appActivity` | 需要运行的acticity,其实就是 告诉 appium 需要运行 app 里哪个页面;默认是 “.” 开头的 | .activities.PeopleActivity | | `appWaitActivity` | 设置需要等待的 activity 名称 | `SplashActivity` | | `unicodeKeyboard` | 设置 `Unicode` 键盘输入法;默认值为 `false` | `true`或`false` | | `resetKeyboard` | 设置键盘是否恢复初始状态;默认值为 `false` | `true`或`false` | 3、Capability 配置讲解 - IOS部分 > - boundleId:这个参数是必须的,如果不配置就无法启动 ios app ,这个是该 app 的唯一标识。 > - eg:caps.setCapability(“boundleId”, “iOS.xxx.xxx”) > > ------ > > - autoAcceptAlerts:这个参数在实际当中很实用,其功能就是自动接收 alert 请求,默认是 false ,需要手动改为 treu > - eg:caps.setCapability(“autoAcceptAlerts”, “true”) **设备各种信息的获取方式** 1.获取连接的设备信息:adb devices 如果设备未连接:adb connect 127.0.0.1:21503来手动连接。adb disconnect 127.0.0.1:21503手动断开连接 如果adb devices一直获取不到设备信息,可以将sdk下的adb.exe复制到模拟器目录下替换原来的adb.exe(需关闭所有adb进程) 如果还是adb连接不上设备,可以adb kill-server,然后再连接 2.获取app的包名: 方式一:如已安装对应的app:adb shell pm list packages -3(-3表示只看第三方的app) 方式二:如还未安装对应的app:aapt d badging 安装包的路径 3.获取app的活动名: 方式一:如已安装对应的app:adb shell dumpsys activity | findstr mFocusedActivity(获取正在运行的app的包名和活动名) ![输入图片说明](datas/images/%E8%8E%B7%E5%8F%96app%E7%9A%84%E5%8C%85%E5%90%8D.png) 方式二:如还未安装对应的app:aapt d badging apk 安装包的路径 4.安装apk软件 adb install apk文件路径 **点击start session创建连接** ![输入图片说明](datas/images/%E7%82%B9%E5%87%BBstart%20session%E5%88%9B%E5%BB%BA%E8%BF%9E%E6%8E%A5.png) **appium desktop常用功能** ![输入图片说明](datas/images/appium%20desktop%E5%B8%B8%E7%94%A8%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D.png) 常用定位元素功能来辅助编写脚本 #### 项目插件 ``` # python解释器 Python >= 3.6.5 # 自动化相关 1.3.0 =< appium-python-client< 2.1.0 pytest >= 7.0.1 pytest-rerunfailures >= 10.3 allure-pytest >= 2.10.0 pytest-ordering >= 0.6 pytest-dependency >= 0.5.1 pytest-assume >= 2.4.3 pytest-xdist >= 3.0.2 # 其他 pandas >= 1.1.5 xlrd >= 2.0.1 xlwt >= 1.3.0 pytesseract >= 0.3.8 requests >= 2.27.1 colorlog >= 6.7.0 PyMySQL >= 1.0.2 pymongo >= 4.1.1 redis >= 4.3.5 DBUtils >= 3.0.2 PyYAML >= 6.0 ``` #### 公共配置 ``` 文件夹etc——文件config.py:配置公共参数 ``` ### 使用说明 ​ 1、PO模式使用要点 ​ 1.1 不要在page页面对象外做元素定位 ​ 1.2 不在page页面对象里面写断言,除非是页面是否成功加载断言 ​ 1.3 需要多少个元素就定位多少个,不需要对整个页面的元素进行定位 ​ 1.4 当用例设计页面跳转时,例如登陆操作,登陆完成后跳转首页,当页面发生“跳转”,封装的业务逻辑需要返回(return)对应的页面对象的实例 ​ 1.5 BasePage封装Selenium基础方法,不需要全部封装,用到多少方法就封装多少方法 ​ 2、定位要点 ​ 2.1 定位一个时,要求定位方式做到唯一准确,一般优先考虑id、name、link_text、partial_link_text,次考虑class_name、xpath、css_selector,最后再考虑tag_name,最后考虑tag_name是因为大部分时候不是唯一值 ​ 2.2 定位多个时,要求定位方式均有共同特征,一般优先考虑class_name、xpath、css_selector、tag_name,次考虑link_text、partial_link_text,基本不考虑id、name,因为id、name基本是唯一的,没有共同特征。 ​ 2.2.1)使用class_name寻找共同特征的技巧是:如果class属性值中有空格,则可以截取class属性的部分值(截取到的部分值中一定不要包含空格) ​ 2.2.1)使用xpath寻找共同特征的技巧是:一般布局规范的前端HTML代码路径有相同层级分布,xpath的值选择它们之间共同的层级路径,最后在需要做出区分的层级,去掉其序号,比如: ``` 菜单1-子级1://*[@id="app"]/div/div[2]/div[1]/div/div/div[1]/div/ul/li[1]/ul/li[1] 菜单1-子级2://*[@id="app"]/div/div[2]/div[1]/div/div/div[1]/div/ul/li[1]/ul/li[2] 菜单2-子级3://*[@id="app"]/div/div[2]/div[1]/div/div/div[1]/div/ul/li[2]/ul/li[3] 菜单2-子级5://*[@id="app"]/div/div[2]/div[1]/div/div/div[1]/div/ul/li[2]/ul/li[5] 定位所有菜单,xpath的值为://*[@id="app"]/div/div[2]/div[1]/div/div/div[1]/div/ul/li 定位所有子级,xpath的值为://*[@id="app"]/div/div[2]/div[1]/div/div/div[1]/div/ul/li/ul/li ``` ​ 2.3 定位方法最好使用显式等待 ​ 2.3.1)定位可点击的元素时,优先考虑使用的定位方法是显式等待的element_to_be_clickable方法 ​ 2.3.1.1)注意判断按钮是否可点击,不是所有按钮都可点击的 ​ 2.3.1.2)注意使用 click() 点击方法时,最好点击前加个强制等待时间,因为可点击不代表点击之后就会起作用,可能页面还没有渲染完成 ​ 2.3.2) 定位多个元素时,优先考虑使用的定位方法是显式等待的visibility_of_all_elements_located、visibility_of_any_elements_located方法,这两种方法的区别是要定位的元素是否全部可见(元素可见的含义为元素的高和宽都大于0),注意判断元素是否可见,不是所有元素都会处于一直可见的状态的 ​ 2.4 定位不到元素 ​ 在保证xpath正确的情况下,使用绝对路径xpath都定位不到元素时,需要更换定位方法:依据该元素是否可见、是否出现在DOM树里面等,使用适合的方法 ​ 3、元素操作 ​ 3.1) 定位到了元素,不代表能马上获取到其属性值,比如点击元素无效、当前页面刷新获取到旧的url等,所以需要把控好获取元素的属性值时间,手动加个强制时间等待等 ## 问题解决 ``` 1、 问题:allure-pytest=2.13.0与pytest-rerunsfailures=10.3搭配使用时,不明原因导致生成allure报告后会出现多条重复的失败用例记录,且没有标记重跑次数 解决:使用低版本allure-pytest=2.10.0或更低 ``` ``` 2、 问题:cases/test_login_case.py: 25 warnings E:\DATA\PycharmProjects\web_ui_frame\venv\lib\site-packages\selenium\webdriver\remote\remote_connection.py:418: DeprecationWarning: HTTPResponse.getheader() is deprecated and will be removed in urllib3 v2.1.0. Instead use HTTPResponse.headers.get(name, default). if resp.getheader('Content-Type') is not None: cases/test_login_case.py: 25 warnings E:\DATA\PycharmProjects\web_ui_frame\venv\lib\site-packages\selenium\webdriver\remote\remote_connection.py:419: DeprecationWarning: HTTPResponse.getheader() is deprecated and will be removed in urllib3 v2.1.0. Instead use HTTPResponse.headers.get(name, default). content_type = resp.getheader('Content-Type').split(';') 解决: 这是由于selenium中,底层使用urllib3在处理http请求,相关的相应头操作已被移除,所以报出以上warning。 可以在报错的文件(remote_connection.py)的相关行内,把getheader()替换为headers.get()即可。 如把: if resp.getheader('Content-Type') is not None: 替换为: if resp.headers.get('Content-Type') is not None: 同理,content_type = resp.getheader('Content-Type').split(';') 替换为: content_type = resp.headers.get('Content-Type', '').split(';') ``` ``` 3、 问题:pytest.ini 文件加注解报错,UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xaf 解决: 1)选中pytest.ini,点击选中File->File Properties->File Encoding 2)找到GBK格式,选中保存 3)重新执行正常脚本,不再报错 ``` ``` 4、Appium报错:Error An unknown server-side error occurred while processing the command. Original error: Error executing adbExec. Original error: 'Command 'D:\\android-sdk-windows\\platform-tools\\adb.exe -P 5037 -s 127.0.0.1\:62001 install -r C:\\Users\\wsjc\\AppData\\Local\\Programs\\Appium\\resources\\app\\node_modules\\appium\\node_modules\\appium-uiautomator2-server\\apks\\appium-uiautomator2-server-debug-androidTest.apk' exited with code 1'; Stderr: 'adb: failed to install C:\Users\wsjc\AppData\Local\Programs\Appium\resources\app\node_modules\appium\node_modules\appium-uiautomator2-server\apks\appium-uiautomator2-server-debug-androidTest.apk:'; Code: '1' 解决:因为没有配置模拟器的环境变量,在系统环境变量path里面添加模拟器的bin路径 ``` ![输入图片说明](datas/images/%E6%A8%A1%E6%8B%9F%E5%99%A8bin%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F.png) ``` 5、Appium报错:Error An unknown server-side error occurred while processing the command. Original error: Error executing adbExec. Original error: 'Command 'D:\\android-sdk-windows\\platform-tools\\adb.exe -P 5037 -s 127.0.0.1\:62001 shell 'pgrep --help; echo $?'' exited with code 1'; Stderr: 'error: protocol fault (couldn't read status): connection reset'; Code: '1' 解决:重启手机 ``` ``` 6、导入from appium.webdriver.common.appiumby import By失败 ModuleNotFoundError: No module named 'appium.webdriver.common.appiumby' 解决: deprecated:: 2.1.0 Please use 'from appium.webdriver.common.appiumby import AppiumBy' instead of 'MobileBy'. 在实际代码中使用AppiumBy和MobileBy是一样的,不过MobileBy中明确说了,在2.1.0版本中弃用了MobileBy,最好是使用AppiumBy 2.1.0版本前from appium.webdriver.common.mobileby import MobileBy as By 2.1.0版本后from appium.webdriver.common.appiumby import By ``` ## 其他内容 ### 测试流程 ​ 1、可行性分析 ​ 确认其可行性,是否可以实行测试自动化 ​ 2、测试需求分析 ​ 确定测试覆盖率以及自动化测试粒度、测试用例上的筛选等 ​ 3、制定测试计划 ​ 评估完成所有测试活动的时间,测试活动安排及资源分配等,控制测试过程以及跟踪整个测试过程 ​ 4、测试用例设计 ​ 通过从功能测试用例筛选、修改,转为自动化测试用例 ​ 5、测试脚本开发 ​ 框架设计与搭建,测试脚本编写,Git版本控制,脚本合并联调 ​ 6、测试执行阶段 ​ 脚本运行环境搭建,手动、半手动半自动方式执行或Jenkins无人值守自动执行 ​ 7、测试总结阶段 ​ 对测试结果文件中报告错误的记录进行分析,如果确实是由于被测系统的缺陷导致,则提交缺陷报告。对自动化测试的结果进行总结,分析系统存在的问题,并提交《测试报告》 ​ 8、脚本维护迭代 ## 演示图片 #### 业务系统 ![输入图片说明](datas/images/%E4%B8%9A%E5%8A%A1%E7%B3%BB%E7%BB%9F1.jpg) ![输入图片说明](datas/images/%E4%B8%9A%E5%8A%A1%E7%B3%BB%E7%BB%9F2.jpg) #### 测试报告 ![输入图片说明](datas/images/%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A1.png) ![输入图片说明](datas/images/%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A2.png) ![输入图片说明](datas/images/%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A3.png) ![输入图片说明](datas/images/%E6%B5%8B%E8%AF%95%E6%8A%A5%E5%91%8A4.png)