随笔 - 12  文章 - 2  评论 - 0  阅读 - 6342

Appium+Python 搭建自动化测试框架

作者的配置环境和版本:

win10 + python3.6 +  Appium v1.4.16 

  

1.下载node   https://nodejs.org/en/download/

下载node.js   验证安装: node -v

 

2.下载jdk 

https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html?utm_source=androiddevtools&utm_medium=website

 配置环境变量:

  •  JAVA_HOME     jdk安装路径

  •  CLASSPATH  变量值为:%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar

  •  path 里新建如下图:

  

3.下载 安装Android SDK    http://tools.android-studio.org/index.php/sdk

SDK Manager安装API包遇到安装不了的问题:

解决: 以管理员的身份打开SDK Manager.exe

 https://www.androiddevtools.cn/index.html(很好的网站,可以下很多Android相关的包)

配置环境变量:

新建环境变量ANDROID_HOME,变量值为sdk的路径:E:\Android\android-sdk

在Path变量中增加两个路径:E:\Android\android-sdk\platform-tools和E:\Android\android-sdk\tools

配置了环境变量后,在命令行窗口中运行adb -version

 

4.安装python 下载地址:https://www.python.org/downloads/

 

5.安装Appium   

AppiumForWindows下载地址:https://bitbucket.org/appium/appium.app/downloads/

运行Appium需要依赖.NET Framework 4.5(一般都不需要安装,Windows会自带)

 

也可以通过命令装appium:

先安装taobaoNPM镜像:npm install -g cnpm --registry=https://registry.npm.taobao.org

再命令安装appium  :

cnpm install -g appium     (安装最新版本)

cnpm install  appium@version -g     (安装指定版本,version是版本号)

 

6.安装Appium-doctor: cnmp install  appium-doctor -g

appium-doctor可以检测appium整体依赖环境配置情况

cmd中输入appium-doctor命令,提示’appium-doctor’ 不是内部或外部命令,也不是可运行的程序

解决方法: 

将Appium安装目录中的.bin添加到环境变量Path中,例如: 

C:\Program Files (x86)\Appium\node_modules.bin 

验证:

 

7. 下载Appium-Python-Client   https://pypi.python.org/pypi/Appium-Python-Client/

  也可以用命令直接:pip install Appium-Python-Client

  

8.安装PyCharm 

下载地址  https://www.jetbrains.com/pycharm/download/#section=windows

 

 

 

9.  AppiumDesktop下载

下载地址https://github.com/appium/appium-desktop/releases/tag/v1.3.1

 

10.下载夜神模拟器,自行百度。。。。。。。。。。。。。。。

 

11.连接模拟器(夜神模拟器)
 
连接时先打开模拟器的开发者usb调试开关:
 
adb connect 127.0.0.1:62001 (默认第一个模拟器的端口是62001)
adb connect 127.0.0.1:62025  (第二个是62025 ,以后依次+1)
 
adb devices 查看当前连接的设备
 
查看app:adb shell pm list package
取文件:adb pull 文件路径 目的路径
截图: adb shell screencap 路径
adb服务启动和关闭: adb kill-server /adb start-server
 
获取app的  activity
aapt dump badging 包路径 | findstr "launchable"
常用的一些adb命令及详细介绍:参照 https://www.cnblogs.com/mliangchen/p/5114149.html
 

Appium元素定位:

工具:Android\android-sdk\tools    uiautomatorviewer.bat

 

1. id定位:

self.driver.find_element_by_id('com.tencent.mobileqq:id/btn_login').click()

 

2. class定位:

self.driver.find_element_by_class_name('android.widget.Button').click()

(注:一般一个页面上的class属性不唯一,元素不唯一的话定位会报错了)

 

 

3. 相对定位:

相对定位是先找到该元素的有对应属性的父元素节点,然后基于父元素进行元素定位。

代码举例:

此处只是举例什么是相对定位,一般有id直接可以定位当然不这么干,在没有id的情况下可以这么定位。。。。。。。。。。。

self.driver.find_element_by_id('com.tencent.mobileqq:id/name')
self.driver.find_element_by_class_name('android.widget.Button').click()

uiautomatorviewer截屏:

 

4. xpath定位:

 

代码举例:

 name = self.driver.find_element_by_xpath('//android.widget.EditText[@text="QQ号/手机号/邮箱"]').send_keys('********')
 name = self.driver.find_element_by_xpath('//*[@class="android.widget.EditText" and @index="3"]').send_keys('********')

uiautomatorviewer截屏:

 

 

5. List定位:

List定位首先是使用find_elements_by_id(class_name/path)获取一组相同的class属性的的元素,然后使用数组下标来区分标记不同元素进行相关操作

代码举例:

一般从相册设置头像或是选择照片时,会用到list定位,因为每一张照片的id是相同,那就要通过下标来定位所选的照片了..............

images = self.driver.find_elements_by_id('id')
images[5].click

 

 

6. Appium元素等待:

强制等待:设置固定的等待时间,使用sleep()方法即可实现

from time import sleep
#强制等待5秒
sleep(5)

隐式等待:针对全部元素设置等待时间

driver.implicitly_wait(20)

显示等待:针对某个元素来设置的等待时间,方法WebDriverWait()一般和until()或until_not()方法配合使用,另外,lambda提供了一个运行时动态创建函数的方法

from selenium.webdriver.support.ui import WebDriverWait
WebDriverWait(self.driver,3).until(lambda x:x.find_element_by_id('com.tencent.mobileqq:id/btn_login'))

 

 

7. Toast元素识别:

下图为一般的toast提示,uiautomatorviewer工具是无法获取到这种toast的任何信息

代码实现:

注意如果内容为中文,必须注释#coding=utf-8,否则会因为编码导致文字识别失败

复制代码
复制代码
 #适用toast弹窗
 def get_toast(self):
error_message= "账号或密码错误,请重新输入"
limit_message=""
message1 ='//*[@text=\'{}\']'.format(error_message)
#message2 = '//*[@text=\'{}\']'.format(limit_message)
toast_element = WebDriverWait(self.driver,5).until(lambda x:x.find_element_by_xpath(message1))
print(toast_element.text)
 
复制代码
复制代码

 

 

8. 屏幕截图:

方法一:save_screenshot()该方法直接保存当前屏幕截图到当前脚本所在的文件位置

self.driver.save_screenshot('login.png')

 

方法二:get_screenshot_as_file(self,filename)将截图保存在指定文件路径

self.driver.get_screenshot_as_file('.\screenshots\login.png')

 

 

9. 连续滑动操作_TouchAction:

Touch Action包含一系列操作,比如按压,长按,点击,移动,暂停,组成一套动作。

按压:press()

TouchAction(driver).press(x=0,y=308)

长按:longPress() ,比press多个按的时间参数duration,以毫秒为单位

long_press(x=0,y=308,duration=1000)

点击:tap()对一个元素或是控件执行点击操作

tap(self, element=None, x=None, y=None, count=1)

移动:move_to()将指针从上一个点一道指定的元素或点

move_to(self, element=None, x=None, y=None)

暂停:Wait(),暂停脚本的执行,单位为毫秒

wait(self, ms=0)

释放:release()结束行动,取消屏幕上的指针

release(self)

执行:perform()执行的操作发送到服务器的命令操作

perform(self)

 

代码举例:已设置手势密码锁为例,先进入密码锁的设置页面:

复制代码
复制代码
#导入模块
from appium.webdriver.common.touch_action import TouchAction

for i in range(2):
    TouchAction(driver).press(x=243,y=381).wait(2000)\
        .move_to(x=455,y=390).wait(1000) \
        .move_to(x=455, y=390).wait(1000) \
        .move_to(x=455, y=390).wait(1000) \
        .release().perform()
复制代码
复制代码

 

 

10. 多点触控操作_MultiAction:

多点触控的类,可以模拟用户多点操作,主要包含add()和perform()两个方法

 

代码举例:以放大缩小百度地图为例

复制代码
复制代码
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction
from appium.webdriver.common.multi_action import MultiAction
from time import sleep

desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1.1'
desired_caps['deviceName'] = '127.0.0.1:62001'
desired_caps['app'] = r'C:\Users\heber\Downloads\baidumap.apk'  # 被测试的App在电脑上的位置
desired_caps['appPackage'] = 'com.baidu.BaiduMap'
desired_caps['appActivity'] = 'com.baidu.baidumaps.WelcomeScreen'
desired_caps['noReset'] = True
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)  # 启动app


x = driver.get_window_size()['width']
y = driver.get_window_size()['height']

def pinch():
    action1 = TouchAction(driver)
    action2 = TouchAction(driver)
    pinch_action = MultiAction(driver)

    action1.press(x=x*0.2, y=y*0.2).wait(1000).move_to(x=x*0.4, y=y*0.4).wait(1000).release()
    action2.press(x=x*0.8, y=y*0.8).wait(1000).move_to(x=x*0.6, y=y*0.6).wait(1000).release()

    pinch_action.add(action1,action2)
    print("start pinch....")
    pinch_action.perform()

def zoom():
    action1 = TouchAction(driver)
    action2 = TouchAction(driver)
    zoom_action = MultiAction(driver)

    action1.press(x=x*0.4, y=y*0.4).wait(1000).move_to(x=x*0.2, y=y*0.2).wait(1000).release()
    action2.press(x=x*0.6, y=y*0.6).wait(1000).move_to(x=x*0.8, y=y*0.8).wait(1000).release()

    zoom_action.add(action1,action2)
    print("start zoom....")
    zoom_action.perform()

Pycharm 创建 Project,搭建 APPTEST框架如下图:
 

 

1.框架功能

  • 业务功能的封装
  •  测试用例封装
  • 测试包管理
  • 截图处理
  • 断言处理
  • 日志获取
  • 测试报告生成
  • 数据驱动
  • 数据配置

 

2. driver封装

  • config文件夹创建app_config.yaml 文件,存放配置app的配置信息
复制代码
复制代码
platformName: Android
platformVersion: 5.1.1
deviceName: 127.0.0.1:62001

#mx4真机
#platformVersion: 5.1.1
#udid:
#deviceName: MX4

app: qq.apk
appPackage: com.tencent.mobileqq
appActivity: com.tencent.mobileqq.activity.SplashActivity
noReset: True
unicodeKeyboard: True
resetKeyboard: True

ip: 127.0.0.1
port: 4723
复制代码
复制代码

 

 

3. 公共模块封装

 

4. Login模块封装原理

if __name__ == '__main__': for i in range(3): pinch() for i in range(3): zoom()
复制代码
posted on   xiao321  阅读(836)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示