UI自动化测试--- 移动端自动化之Appium常用API - 重要(9)

1、Appium-基础Api

要测试APP,首先就必须打开APP!!!

测试环境准备

1、打开模拟器

2、启动Appium服务器

3、获取要测试APP的包名/界面名  

获取包名/界面名:adb shell dumpsys window windows | findstr mFocusedApp  或者

adb shell dumpsys window windows | findstr usedApp

# 获取包名
adb shell dumpsys window windows | findstr mFocusedApp  

或者

adb shell dumpsys window windows | findstr usedApp

 注意:在获取之前必须先手工进入所要获取的信息的界面

 基础脚本1:最基础的脚本,以后每个脚本都会有的基本配置

"""
   前置:必须启动Appium、模拟器、获取要测试APP的包名/界面名
   参数说明:
            platformName:需要连接的手机的平台(不限制大小写)  只有Android 和 iOS两个取值
            platformVersion:需要连接的手机的版本号(比如 5.2.1 的版本可以填写 5.2.1 或 5.2 或 5 ,以此类推)
            deviceName:需要连接的手机的设备号(andoird平台下,可以随便写,但是不能不写)
            appPackage:需要启动的程序的包名
            appActivity:需要启动的程序的界面名
            长按ctrl点击Remote可查看底层   command_executor: str = 'http://127.0.0.1:4444/wd/hub'

"""

from time import sleep
from appium import webdriver

# 定义字典变量
desired_caps = dict()

# 字典追加启动参数
desired_caps["platformName"] = "Android"
# 注意:版本号必须正确,报错时会提示正确的版本号
desired_caps["platformVersion"] = "6.0.1"
# android不检测内容,但是不能为空
desired_caps["deviceName"] = "192.168.56.101:5555"
desired_caps["appPackage"] = "com.android.settings"
desired_caps["appActivity"] = ".Settings"
# 设置中⽂
desired_caps["nicodeKeyboard"] = True
desired_caps["resetKeyboard"] = True
# 获取driver
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)
# Remote第一个参数: 连接到appium的接口地址,appium服务器部署在本机,4723为应用端口,wd/hub为接口地址

sleep(3)
driver.quit()

app基础操作:应用跳转、获取包名和界面名、关闭app和驱动对象、安装卸载和判断是否安装、置于后台

启动案例:

"""
    需求:
        1、启动设置后,暂停3秒,打开短信应用
        2、打印当前默认应用包名启动名
"""
sleep(3)
#  启动短信
driver.start_activity("com.android.messaging",".ui.conversationlist.ConversationListActivity")
# 打印包名和启动名
print("当前所在应用包名:",driver.current_package)
print("当前所在应用启动名:",driver.current_activity)
driver.quit()

 driver.start_activity(appPackage, appActivity)

appPackage:要打开的程序的包名

appActivity:要打开的程序的界面名

说明:appium⽀持夸应⽤,可以在操作应⽤中切换到B应⽤。

关闭app和驱动对象、安装卸载和判断是否安装、置于后台案例脚本:

"""
    需求:
        1、判断百年奥莱是否安装,如果安装进行卸载,否则安装
        2、启动设置界面
        3、置于后台3秒钟
        4、关闭设置界面
        5、关闭app驱动
"""
# 判断百年奥莱是否安装
if driver.is_app_installed("com.yunmall.lc"):
    print("百年奥莱app已存在正在卸载...")
    # 卸载
    driver.remove_app("com.yunmall.lc")
    print("卸载百年奥莱app成功!")
else:
    print("百年奥莱不存在,正在安装...")
    # 安装
    driver.install_app("/Users/lgy/PycharmProjects/lgy/bj37-web01/day07-appium01//bainianaolaitemai_115.apk")
    print("安装百年奥莱app成功!")

sleep(3)
# 启动设置界面
print("启动设置界面...")
driver.start_activity("com.android.settings",".Settings")
sleep(3)
print("设置应用置于后台3秒钟...")
# 置于后台3秒
driver.background_app(3)
print("关闭设置app...")
# 关闭设置
driver.close_app()
print("获取关闭后的app报名")
print("关闭设置app,后获取包名:",driver.current_package)
sleep(3)
print("退出driver驱动")
driver.quit()

  

元素定位:定位单个元素、定位一组元素

通过UiAutoMatorViewer可以获 取到元素信息,appium提供根据这些信息找到具体元素方法

定位单个元素:

"""
    需求:打开手机《设置》应用,完成下面的步骤
    ①.使用ID定位,定位“放大镜”按钮,并点击
    ②.使用CLASS定位,定位“输入框”,输入“hello”
    ③.使用XPATH定位,定位“返回”,并点击
    ④.使用NAME定位,定位“放大镜”按钮,并点击
    ⑤.等待3s,关闭app
"""

print("使用id点击放大镜...")
# 使用id -> 点击放大镜
driver.find_element_by_id("com.android.settings:id/search").click()
sleep(1)
print("使用class输入搜索hello...")
# 使用class 输入hell
driver.find_element_by_class_name("android.widget.EditText").send_keys("hello")
sleep(1)
print("使用xpath点击返回...")
# 点击返回 xpath
driver.find_element_by_xpath("//*[@class='android.widget.ImageButton']").click()
sleep(1)
print("使用name点击搜索...")
# 使用name定位
driver.find_element_by_accessibility_id("搜索设置").click()
sleep(3)
driver.quit()

定位一组元素:

"""
    需求:打开手机《设置》应用,完成下面的步骤:
        ①.使用ID定位,获取所有 resource-id 为 ”com.android.settings:id/title“ 的元素,并打印其文
        字内容
        ②.使用CLASS定位,获取所有class 为 ”android.widget.TextView“ 的元素,并打印其文
        字内容
        ③.使用XPATH定位,获取所有包含 ”设“ 的元素,并打印其文字内容
        ④.等待3s,关闭app
"""

# 1、获取所有id为:android:id/title
els = driver.find_elements_by_id("android:id/title")
for el in els:
    print("元素id为com.android.settings:id/title 的为本内容有:",el.text)

els = driver.find_elements_by_class_name("android.widget.TextView")
for el in els:
    print("元素class为android.widget.TextView的为本内容有:",el.text)

els = driver.find_elements_by_xpath("//*[contains(@text,'设')]")
for el in els:
    print("文本包含'设'内容有:",el.text)


sleep(3)
driver.quit()

元素操作:点击、输入、清空、获取元素信息、获取属性值信息

"""
    需求:打开手机《设置》应用,完成下面的步骤:
        1.打开《设置》
        2.点击”放大镜”
        3.输入”hello”
        4.暂停2秒
        5.清空所有文本内容
        6.暂停5秒
        7.输入”你好”
"""

# 1、点击放大镜
driver.find_element_by_xpath("//*[@resource-id='com.android.settings:id/search']").click()
# 2、输入hello
el = driver.find_element_by_xpath("//*[@resource-id='android:id/search_src_text']")
el.send_keys("hello")
# 3、2s 清空内容
sleep(2)
el.clear()
# 4、5s 输入你好
sleep(2)
el.send_keys("你好")


sleep(3)
driver.quit()

 获取元素信息案例:

获取⽂本:元素.text

获取⼤⼩:元素.size

获取位置:元素.location



# 点击放大镜
driver.find_element_by_id("com.android.settings:id/search").click()
# 获取 菜单我的文本
text = driver.find_element_by_xpath("//*[@resource-id='android:id/search_src_text']").text
print("我的菜单,文本值为:",text)

location = driver.find_element_by_xpath("//*[@resource-id='android:id/search_src_text']").location
print("位置:",location)

size = driver.find_element_by_xpath("//*[@resource-id='android:id/search_src_text']").size
print("大小为:",size)
x= location.get("x")+ (size.get("width")/2)
y = location.get("y")+ (size.get("height")/2)
print("触摸中心位置x:{} y:{}".format(x,y))

 

 获取元素属性信息案例:

"""
    需求:打开手机《设置》应用,完成下面的步骤:
    1.获取所有 resource-id 为 ”com.android.settings:id/title“ 的元素
    2.使用 get_attribute 获取这些元素的 enabled、text、content-desc、resource-id、class的属性值
"""

# 点击放大镜
els = driver.find_elements_by_id("com.android.settings:id/title")
for el in els:
    print("--"* 50)
    print("1、enabled属性值为:",el.get_attribute("enabled"))
    print("2、text属性值为:",el.get_attribute("text"))
    print("3、content-desc属性值为:",el.get_attribute("name"))
    print("4、resource-id属性值为:",el.get_attribute("resourceId"))
    print("5、class属性值为:",el.get_attribute("className"))
    print("--"* 50)

滑动和拖拽

 swipe(start_x,start_y,end_x,end_y)

特点:精准滑动(基于两个坐标 点滑动)

说明:针对坐标点进⾏操作

"""
    需求:从屏幕100,1000位置滑动到100,400位置
"""
# 练习1
driver.swipe(100,1000,100,400,duration=2000)
driver.implicitly_wait(10)

"""
    需求:从屏幕100,1000位置滑动到100,400位置
    网易新闻滑动到“健康”频道
"""

sleep(2)
# 200,220     920,220
driver.find_element_by_xpath("//*[@text='同意并继续']").click()
sleep(2)
i = 0
while i<=5:
    driver.swipe(920,220,200,220)
    i+=1
driver.find_element_by_xpath("//*[@text='健康']").click()
sleep(3)
driver.quit()

 滚动、拖拽一起使用案例:

scroll :从一个元素滑动到另一个元素,直到页面自动停止

特点:滚动(有惯性存在,滚动下不按下第⼀个元素)

说明:针对两个元素进⾏操作 

场景:scroll滑动是两个元素之间的滑动只适合滑动一次的操作

drag_and_drop【推荐】

drag_and_drop拖拽:从一个元素滑动到另一个元素,第二个元素替代第一个元素原本屏幕上的位置

特点:拖拽(没有惯性,按下开始元素拖拽到指定元素位置)

说明:针对两个元素进⾏精准操作

"""
    需求:
        1、从应用滑动到更多 
        2、从应用拖拽到更多
"""
# exe = driver.find_element_by_xpath("//*[@text='应用']")
save = driver.find_element_by_xpath("//*[@text='存储']")

more = driver.find_element_by_xpath("//*[@text='更多']")

# 1、滚动
# driver.scroll(save,more)
# 2、拖拽
driver.drag_and_drop(save,more)
sleep(3)
driver.quit()

2、Appium-高级Api

高级手势TouchAction:轻敲、按下、抬起、等待、长按、移动,能使用高级手势解决在UI自动化测试中遇到特殊手势操作

说明:

1、appium中封装了⼿势的操作⽅法,都在TouchAction类中,需要导包

2、所有的⼿势操作,最终都需要调⽤perform()⽅法才能执⾏

为什么要使⽤⼿势的操作?

应用场景:红包⾬、九宫格解决,都需使⽤⼿动操作,基础的api最多是⽀持2个元素之间或2个坐标点之间操作。

TouchAction-轻敲案例:

from appium.webdriver.common.touch_action import TouchAction

"""
    手势操作:TaouchAction类
        1、轻敲:tap(元素,x,y)
    重点:执行手势,必须调用perform()方法
    # 需求:
        1、请求WLAN 
"""
# 获取WLAN元素
wlan = driver.find_element_by_xpath("//*[@text='WLAN']")
TouchAction(driver).tap(wlan).perform()

按下与释放案例:

模拟手指一直按下,模拟手指抬起。可以用来组合成轻敲或长按的操作

按下: press(el,x,y)

释放: release()

from appium.webdriver.common.touch_action import TouchAction

"""
    手势操作:TaouchAction类
        1、轻敲:tap(元素,x,y)
        2、按下:press
        3、抬起:release()
    重点:执行手势,必须调用perform()方法
    # 需求:
        1、使用按下和抬起 点击WLAN 
"""
# 获取WLAN元素
wlan = driver.find_element_by_xpath("//*[@text='WLAN']")
loc = wlan.location
print(loc)

# 效果类似点击
TouchAction(driver).press(x=loc.get("x"),y=loc.get("y")).release().perform()

 ⻓按案例

⽅法: long_press(el,x,y)

场景: 在移动应⽤中,有时候需要⻓安才能激活菜单选项

"""
    手势操作:TaouchAction类
        1、轻敲:tap(元素,x,y)
        2、按下:press
        3、抬起:release()
        4、长按:long_press()
    重点:执行手势,必须调用perform()方法
    # 需求:
        1、使用点击WLAN 
        2、长按3秒无线,出现菜单(修改网络)
"""
# 获取WLAN元素
wlan = driver.find_element_by_xpath("//*[@text='WLAN']")
wlan.click()
# 必须暂时一定时间 暂停3秒
sleep(3)
# 效果类似点击
TouchAction(driver).long_press(x=777,y=375).perform()

TouchAction-  移动和思考时间   解锁案例:

手指移动:模拟手指移动操作

思考时间 :模拟手指等待,在执行下一步时等待一段指定时间

移动:move_to(el,x,y)

等待: wait()

实现方法:

1、模拟手指对元素或坐标的移动操作 TouchAction(driver).move_to(el=None,x=None,y=None).perform()

2、模拟手指暂停到当前动作指定时间

TouchAction(driver).wait(ms=time).perform()

练习:给模拟器设置图案解锁。

"""
    需求:绘制解锁图案 Z
    绘制坐标点:
        1、1048,340  1377,340  1707,340
        2、1377,669
        3、1048,999  1377,999  1707,999
"""

# 1、定位WLAN
WLAN = driver.find_element_by_xpath("//*[@text='WLAN']")
# 2、定位应用
app = driver.find_element_by_xpath("//*[@text='应用']")

driver.drag_and_drop(app,WLAN)

# 3、点击安全
driver.find_element_by_xpath("//*[@text='安全']").click()
# 4、点击屏幕锁定方式
driver.find_element_by_xpath("//*[@text='屏幕锁定方式']").click()
# 5、点击图案
driver.find_element_by_xpath("//*[@text='图案']").click()
# 必须暂停,登录绘制页面加载完成
sleep(2)
# 6、绘制
TouchAction(driver).press(x=1048,y=340).wait(100).move_to(x=1377,y=340).wait(100).move_to(x=1707,y=340).wait(100)\
    .move_to(x=1377,y=669).wait(100).move_to(x=1048,y=999).wait(100).move_to(x=1377,y=999).wait(100).move_to(x=1707,y=999).wait(100)\
    .perform()

 3、Appium- 手机操作

常用手机操作Api:获取分辨率、手机截图、获取和设置网络、发 送键到设备、打开和关闭通知栏

在实现自动化测试脚本过程中对于手机本身的操作能使用api来实现

手机操作Api - 获取手机分辨率。 driver.get_window_size()

有些自动化的操作可能没有反应,但并不报错。此时我们就可以将操作过后的关键情况,截图留存。后期也可以根据图片发现问题

手机操作Api -  获取手机截图。 get_screenshot_as_file(filename)

手机操作Api-获取和设置手机网络

获取手机网络: driver.network_connection()     

提示:按住ctrl点击network_connection可查看底层网络设置类型

获取手机网络:driver.set_network_connection(connectionType)

connectionType:表示网络设置类型

"""
    需求:
        1、查看当前网络类型
        2、设置网络类型为飞行模式
        3、获取当前屏幕分辨率
        4、截图保存
"""
# 1、查看当前网络类型
print("当前网络类型为:",driver.network_connection)
# 2、设置网络类型为飞行模式
driver.set_network_connection(6)
print("设置之后的网络类型为:",driver.network_connection)

# 3、获取当前屏幕分辨率
print("当前屏幕分辨率为:",driver.get_window_size())
# 4、截图保存
driver.get_screenshot_as_file("./screen.png")

手机操作Api - 发送键到设备 driver.press_keycode(keycode)

发送键到设备方法:driver.press_keycode(keycode)

keycode:表示手机设备的默认键码

常用可以keycode :

手机操作Api-操作通知栏

"""
    需求:
       1、点击三次音量+  24
       2、点击返回       4
       3、点击两次音量-  25
"""
i = 0
# 三次增大音量
while i < 3:
    driver.press_keycode(24)
    i += 1
sleep(2)
# 点击返回
driver.press_keycode(4)
i = 0
# 两次减小音量
while i < 2:
    driver.press_keycode(25)
    i += 1

注意:有些模拟器测试音量按键可能没效果,可以多更换几个模拟器即可

 手机操作Api - 操作通知栏

打开通知栏。 driver.open_notifications()

应⽤场景:检查服务器发送的通知

注意:appium官方并没有为我们提供关闭通知的api,那么 现实生活中怎么关闭,就怎样操作就行,比如,手指从下往上滑动,或者,按返回键

"""
    需求:打开通知栏,两秒后,关闭通知栏
       1、打开通知栏,点击通知栏的信息
"""

# 打开通知栏
driver.open_notifications()
sleep(2)
# 查找信息并点击
driver.find_element_by_xpath("//*[@text='应用宝.apk']").click()

toast信息获取

说明: toast消息为移动应⽤中,⼀种⿊底⽩字提示信息,有时间限制。

为什么要获取toast消息?  断言内容

如何获取toast信息?

步骤:

1、安装依赖库    pip install Uiautomator2

2、配置driver启⽤参数

desired_caps['automationName'] = 'Uiautomator2'

3、编写代码获取⽂本值 

"""
    需求:
    1、获取网易新闻未同意协议进行登录  --> toast消息

    
    需求:打开《网易新闻》APP
    l、点击未登录菜单栏
    2、在未登录个人中心页面点击登录
    3、在一键登陆窗口点击微信登陆,并获取弹出提示信息

"""


# 点击未登录
driver.find_element_by_xpath("//*[@text='未登录']").click()
# 点击登录
driver.find_element_by_xpath("//*[@text='登录']").click()
# 点击微信登录
driver.find_element_by_xpath("//*[@text='微信登录']").click()

# 获取toast消息
msg = driver.find_element_by_xpath("//*[contains(@text,'请先勾选同意')]").text
print("toast消息为:",msg)

toast封装:

def find_toast(driver, message, timeout=3):
    # 定义定位toast元素xpath表达式字符串
    message = "//*[contains(@text,'" + message + "')]" 
    # 通过显示等待方式定位
    element = WebDriverWait(driver, timeout, 0.1).until(lambda x: x.find_element(By.XPATH, message))
    return element.text

切换webview

WebView App 通过手机浏览器访问的项目

为什么需要切换?  app中嵌套web信息,如果不切换⽆法定位操作

特性:

1、项目页面上的元素不能直接通过 UiAutoMatorView查看元素

2、不能直接进行定位

3、打开项目需要先操作Native App (浏览器)网址的输入框

4、需要浏览器驱动环境才能实现

 如何切换:

1、获取当前环境 --> driver.contexts

2、调⽤切换⽅法 --> driver.switch_to.context("环境")

切换案例:

driver.find_element_by_xpath("//*[@resource-id='com.android.browser:id/url']").send_keys("https://m.baidu.com/")
# 输入回车
driver.press_keycode(66)
sleep(3)
# 获取当前所有的环境
print(driver.contexts)
# 切换环境
driver.switch_to.context("WEBVIEW_com.android.browser")
# 定位元素操作
driver.find_element_by_xpath("//*[@id='index-kw']").send_keys("test")

查看元素信息:

1、在手机浏览器中打开要测试的网址,通常会跳转到该项目手机端网址

2、拷贝手机端网址,直接到PC端浏览器返回,通过web浏览器开发者工具即可查看

4、monkey

概念:主要用于Android 的压力测试 自动的一个压力测试小工具, 主要目的就是为了测 试app是否会Crash

不需要安装,Monkey程序由Android系统自带,使用Java语言写成 ,在Android文件系统中的存放路径是:/system/framework/monkey.jar;

,monkey 启动方式

可以通过PC机CMD窗口中执行: adb shell monkey {+命令参数}来进行Monkey测试;

在PC上adb shell 进入Android系统,通过执行 monkey {+命令参数} 来进行Monkey 测试;

# 使用monkey测试 包 随机事件100次 输入日志文件

adb shell monkey -p cn.goapk.market 100 > 路径/log.txt

adb shell monkey -p fishjoy.control.menu –p cn.goapk.market 100

adb shell monkey -p cn.goapk.market -v -v 100

monkey指令

指定app包名:

-p {被测试的app包名}

用此参数指定一个或多个包。指定包之后,monkey将只允许 系统启动指定的app。如果指定包列表, monkey将允许 系统启动设备中的所有app。

日志级别:

-v 通过多个-v的个数来指定查看日志级别。

 -v :缺省值,仅提供启动提示、测试完成和最终结果等少量 信息

-v -v :提供较为详细的日志,包括每个发送到Activity的事 件信息

-v -v -v:最详细的日志,包括了测试中选中/未选中的 Activity信息

随机种子数:

-s (随机数种子) 用于指定伪随机数生成器的seed值,如果seed相同,则两次Monkey测试所产生的事件序列也相同

说明:设置随机种⼦数(两次执⾏随机种⼦数⼀样,执⾏的事件也是⼀样)

monkey测试1:adb shell monkey -p cn.goapk.market –s 10 100
monkey测试2:adb shell monkey -p cn.goapk.market –s 10 100

时间间隔时间:

--throttle

adb shell monkey -p cn.goapk.market --throttle 3000 100

 事件类型:可通过adb shell monkey --help 查看

序号参数含义
0--pct-touch调整触摸事件的百分比(触摸事件是一个down-up事件,它发生在屏幕上的某单一位置)
1--pct-motion调整动作事件的百分比(动作事件由屏幕上某处的一个down事件、一系列的伪随机事件和一个up事件组成)
2--pct-pinchzoom缩放事件百分比
3--pct-trackball调整轨迹事件的百分比(轨迹事件由一个或几个随机的移动组成,有时还伴随有点击)
4--pct-rotation

屏幕旋转事件百分比

模拟手机的横竖屏切换,degree指的是旋转方向,顺时针旋转,0表示旋转90°,1表示旋转180°,2表示旋转270°,3表示旋转360°

5--pct-nav调整"基本"导航事件的百分比(导航事件由来自方向输入设备的up/down/left/right组成)
6--pct-majornav调整"主要"导航事件的百分比(这些导航事件通常引发图形界面中的动作,如:回退按键、菜单按键)
7--pct-syskeys调整"系统"按键事件的百分比(这些按键通常被保留,由系统使用,如Home、Back、Start Call、End Call及音量控制键
8--pct-appswitch调整启动Activity的百分比。在随机间隔里,Monkey将执行一个startActivity()调用,作为最大程度覆盖包中全部Activity的一种方法
9--pct-flip键盘翻转事件百分比
10--pct-anyevent调整其它类型事件的百分比。它包罗了所有其它类型的事件,如:按键、其它不常用的设备按钮、等等。

monkey测试执行和日志分析

日志查看什么?        搜索:“ANR”、ERROR、null、相关错误

正常情况 :

如果Monkey测试顺利执行完成,在log的最后,会打印出当前执行事件的次数和所花费的时间; //Monkey finished 代表执行完成

异常情况

执行过程中出现无响应、崩溃或异常退出后,打开日志进行分析

 1. 程序无响应的问题: 在日志中搜索 “ANR” (可能仅仅是因为卡)

2. 崩溃问题:在日志中搜索 “Exception” (如果出现空指针, NullPointerException) 肯定是有bug Monkey执行中断,在log最后也能 看到当前执行次数

执行方式:

一般在功能测试完毕之后

多次小批量事件测试 ≤10W次事件

大批量随机性测试

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值