基于WebDriverAgent +facebook-wda的iOS自动化测试

简介

WebDriverAgent 是Facebook在 iOS 端实现的一个 WebDriver server ,当iOS设备安装了这个server(即WebDriverAgent app),我们就可以通过给这个server发送HTTP请求来远程控制 iOS 设备。

facebook-wda是一个Python库,通过直接构造HTTP请求跟WebDriverAgent通信。它是一个非常短小精悍的库,并不像appium、macaca还有一个中间转发服务且支持多种语言。

facebook-wda虽然代码比较精炼,但是能完成的功能却非常强大。你能在appium里面找到的功能,这个库有提供,找不到的功能,这个库也有提供。它已经在开源项目AutomatorX 中使用。

安装准备

在写测试代码之前,需要把下面的环境安装部署好:

1.部署WebDriverAgent,参考

https://testerhome.com/topics/7220

2.安装Python库(目前这个版本的库支持py2.7~3.5之间的版本)

pip install --pre facebook-wda

3.有些国产的iPhone机器通过手机的IP和端口还不能访问,此时需要将手机的端口转发到Mac上。安装iproxy工具,用法非常简单 iproxy <local port><remote port> [udid]。端口转发后,浏览器访问 http://localhost:8100/status会看到一个json字符串,即说明WebDriverAgent安装成功。

基础的facebook-wda库-API使用

**首先在文件中import wda**


# DEBUG设为True可以看到http请求发送和返回的具体信息

wda.DEBUG = True

# 设置连接本地地址失败超时时间,默认是1分钟

wda.HTTP_TIMEOUT = 10.0 

# 连接iOS真机

c = wda.Client('http://localhost:8100')

# 单击HOME键

c.home()

# 启动应用,应用名通过命令:ideviceinstaller -l 查看

s = c.session("com.netease.cloudmusic") 

# 启动设置

c.session("com.apple.Preferences") 

# 关闭应用

s.close() 

# 定位元素

el = s(name='登录',className='Button')

# 判断元素存不存在,返回true/false

el.exists()

# 清空输入框

s(type='TextField').clear_text()

# 输入值

s(type='TextField').set_text("xxx")

# 点击元素

s(type='TextField').tap()

s(name='登录',className='Button').tap()

# 点击坐标点

s.tap(144,234)  

# 长按2秒坐标点

s.tap_hold(144,234,2.0)

# 点到点滑动

s.swipe(x1,y1,x2,y2)

# 已封装好的固定方向的滑动

s.swipe_left()     # 手机最右面向左滑

s.swipe_right()    # 手机最左面向右滑

s.swipe_up()       # 手机最下面向上滑

s.swipe_down()     # 手机最上面向下滑

更多更复杂的元素操作、会话操作可以参考ATX文档-iOS控件操作API。

使用facebook-wda丰富的API结合Python自动化测试框架(如unittest等),即可方便快速地构建我们的自动化测试项目,如下图所示。

可以看出,相比基于appium的自动化测试项目,使用facebook-wda的测试项目的项目结构、基本操作命令和元素定位都更加简明清晰,大大提高了我们设计和调试测试用例的效率。

进阶:定制个性化的facebook-wda API

当我们使用一个facebook-wda API接口时,可以跳到定义处看到它的具体实现形式。在__init__.py文件中,可以看到几乎每一个API都是在对传递参数做一定的处理后,再给WebDriverAgent发送http请求。例如下图所示send_keys()命令(它的作用是在iOS设备上的定位处输入字符)。

更进一步,通过在WebDriverAgent工程中搜索地址/wda/keys,我们可以定位WebDriverAgent在收到这个post请求后做了哪些操作。可以看到,send_keys()对应的操作是由handleKeys函数完成的。

这条逻辑理清之后,如果你有一定的objective-c语言基础,就可以通过修改WebDriverAgent中函数的具体实现来定制它对iOS设备的操作。举一个简单的例子,例如在handleKeys函数中把字符输入的速度直接设置为最大值。

如果想增加自己的定制API,实现对iSO设备的定制操作,则需要同时修改facebook-wda和WebDriverAgent。举一个简单实例,增加API接口s.quicktap(x1, y1),实现对屏幕点坐标的快速单击,则对应的修改如下:

facebook-wda端,在__init__.py文件中添加自定义quicktap函数。

WebDriverAgent端,添加url到函数quicktap的route,和quicktap函数实现对真机的操作。

facebook-wdaWebDriverAgent本身的功能已足够强大,掌握了这些原理和方法,能使我们更加灵活的应用它们,服务于测试工作。

参考文献

https://www.helplib.com/GitHub/article_142159

转载自 360质量效能

关闭