appium自动化测试(三)

1|0一. 层级定位和list


先通过find_element_by_XXX找到父级元素webelement,再通过webelement.find_element_by_XXX寻找子元素

2|0二. 滑动屏幕


2|1滑动接口:


swipe(起始X,起始Y,结束X,结束Y)

 

结束X - 起始X:X轴滑动的距离

结束Y - 起始Y:Y轴滑动的距离

 

 

Q:手机的屏幕尺寸有很多,如何兼容?进入app时的导航页面

 

2|2原理:


1. 先获取设备的屏幕大小(宽、高)

2. 再设置滑动的距离与屏幕大小的百分比

3. 调用滑动接口执行滑动操作

 

获取当前窗口大小的接口:

get_window_size:返回窗口的宽和高

 

滑动接口:

swipe(起始X,起始Y,结束X,结束Y)

 

2|3实例:


#获取屏幕尺寸 size = self.driver.get_window_size() #swipe还有一个参数duration,单位是ms,防止操作过快 #向左滑动 self.driver.swipe(size["width"]*0.9, size["height"]*0.5, size["width"]*0.1, size["height"]*0.5, 200) #向右滑动 self.driver.swipe(size["width"]*0.1, size["height"]*0.5, size["width"]*0.9, size["height"]*0.5, 200)

多个屏幕需要滑屏时,最好在每个页面滑屏操作之后,利用time.sleep()稍微等待一下,防止操作过快

3|0三. 模拟触屏


TouchAction类

将一系列的动作放在一个链条中,然后将该链条传递给服务器。服务器接收到该链条后,解析各个动作,逐个执行

短按(press)

长按(longPress)

点击(tap)

移动到(move to)     x, y为相对上一个坐标的移动距离

等待(wait)

释放(release)

执行(perform)

取消(cancel)

 

3|1实例


#引入TouchAction from appium.webdriver.common.touch_action import TouchAction ta = TouchAction(driver) #获取九宫格的起点坐标和大小 ele = driver.find_element_by_id("com.xxzb.fenwoo:id/gesturepwd_create_lockview") #九宫格的大小 size = ele.size #获取坐标:九宫格起点坐标 start_point = ele.location #参数是元素或者坐标,没有元素取坐标,wait是为了防止操作过快,单位是ms,绘制九宫格最后要释放release()(即抬起),完成后要perform() ta.press(x=start_point["x"] + size["width"]*1/6, y=start_point["y"] + size["height"]*1/6).wait(200).\ move_to(x=size["width"]*2/6, y=0).wait(200).\ move_to(x=size["width"]*2/6, y=0).wait(200).\ move_to(x=-size["width"]*2/6, y=size["height"]*2/6).wait(200).\ move_to(x=0, y=size["height"]*2/6).wait(200).\ release().wait(200).\ perform()

4|0四. 多点触控


MultiAction类,引入

from appium.webdriver.common.multi_action import MultiAction

5|0五. 安装/卸载/关闭/启动


启动Activity:

driver.start_activity()

在当前app打开一个activity,或者新打开一个应用并启动一个activity,仅支持Android

 

安装应用:

driver.install_app('path/to/my.apk')

 

卸载应用:

driver.remove_app('com.example.android.apis')

 

关闭应用:

driver.close_app()

 

应用是否已安装:检测应用是否已被安装

driver.is_app_installed('com.example.android.apis')

6|0六. 拉取/推送文件


拉取(pull)文件

从设备上拉取文件

driver.pull_file('Library/AddressBook/AddressBook.sqlitedb')

 

推送(push)文件

推送文件到设备

data = "some data for the file"

path = "/data/local/tmp/file.txt"

driver.push_file(path, data.encode('base64'))

7|0七. 锁定/将应用切换至后台


锁定屏幕(IOS):

driver.lock(秒)

 

将应用切换至后台:

background_app({"timeout": secs})

将当前的应用切换到后台,然后可以让其在指定时间内回到前台,或者让它一直留在后台

递给这个方法的参数有两种类型:

 

一个整型(秒):表示后台状态维持多久。 -1表示持续置于后台。这种风格的参数已经被废弃

一个看起来像("timeout": secs)的对象。里面的secs是含义和第一个类型一样的整型数字(即表示置于后台多少秒),或者为null(表示持续置于后台)

 

driver.background_app(5)   #置于后台,持续5s

driver.background_app(-1)   #持续置于后台

driver.background_app({"timeout": None})    #持续置于后台

driver.background_app({"timeout": 5})    #置于后台5s,5s后自动回到前台

8|0八. 打开通知栏/摇一摇


打开通知栏:仅支持Android

driver.open_notifications()

 

摇一摇:模拟摇晃设备的操作

driver.shake()

9|0九. 手势


捏(Pinch)手势:缩小(默认缩小一倍)

在屏幕上使用捏(Pinch)手势

driver.pinch(element=el)

 

放大屏幕(Zoom)(默认放大一倍)

在屏幕上使用放大手势

driver.zoom(element=el)

 

scroll:滚动

10|0十. 按键操作


按键发送(Android):

driver.press_keycode(键的keycode)

11|0十一. 上下文切换


可用的上下文(Contexts)

列出所有可用的上下文(contexts)

driver.contexts

 

当前上下文(context):列出当前的上下文(context)

driver.current_context

 

切换至默认的上下文(context)

切换回默认的上下文(context)  (注:一般就是原生上下文 "NATIVE_APP")

driver.switch_to.context(None)

 

当前Activity:获取当前的Activity。仅支持Android

driver.current_activity

 

当前包名(package):获取当前包名(package)。仅支持Android

driver.current_package

 

11|1步骤:


1. 识别——识别当前是否有webview视图,是否需要进入webview页面当中进行元素操作

识别方式一:看class或者content-desc是否包含WebView字段

方式二:

tips:

1) 在手机/模拟器中点击关于手机中的版本号5下,出来开发者选项

 

2) 在开发者选项中勾选上显示布局边界

 

3) 如果是html的界面,那界面不会有布局边界显示,如有则说明是native的界面

 

2. 获取——获取所有的contexts: driver.contexts

常见问题

contexts只能获取NATIVE_APP,无法获取WEBVIEW

使用uiautomatorview定位元素,显示class值为:android.webkit.WebView

但是driver.contexts只打印了 'NATIVE_APP'

 

解决办法:

1) app打包的时候需要开放webview的debug属性 setWebContentDebuggingEnabled(true),这个直接让开发加上就好

2) 模拟器的contexts中有webview,但有些手机没有,官方给出的答案是:需要将手机root,然后再去获取

 

3. 切换——切换到webview视图: driver.switch_to.context(webview视图)

4. 定位——定位webview中的元素,并执行操作:web网页元素定位和操作

5. 切换——切换回默认的视图:driver.switch_to.context(None)

 

 

 

12|0参考文章


https://blog.csdn.net/crisschan/article/details/50419963

 


__EOF__

本文作者cnhkzyy
本文链接https://www.cnblogs.com/my_captain/p/9335398.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   cnhkzyy  阅读(681)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示