这两天开始真正开始根据用例写自动化测试脚本,但是遇到了一个问题,特别是当遇到inspector展示的页面控件元素为:

1
2
3
4
5
6
7
8
9
10
11
12
Class:
Image
Raw identifier:
run_history_arrow
Name:
run_history_arrow
Rect:
{{206.5, 238.5}, {16, 16}}
isEnabled:
Yes
isVisible:
No

总是发现使用,自己封装的find_name(text=name,className=classname)找不到控件,为解决这个问题,我感觉自己走了个乌龙,但是我还是记述一下,当做对自己的警醒吧。

现象是:当控件元素为isVisible=NO时候,无法定位?

思路一:使用类似于appium中的TouchAction实现。

1、因为在appium使用过程中,同样的控件,使用
driver.find_name('run_history_arrow').click()是没有效果的,当时是使用类似于
TouchAction(driver).press(driver.find_name('run_history_arrow')).perform()
实现,因而第一思路是通过方法touch action实现。
可是WDA内又没有这样的api,该怎么办呢?
想到macaca封装的是WDA,去参考一下macaca是怎么实现的就可以了。
由于之前配置过macaca的环境,具体环境配置可见macaca官方链接
调出macaca的执行用例:

1
2
3
4
5
6
7
8
9
10
it('#1 test', function() {
return driver
.sleep(1000)
.waitForElementByName('发现')
.click()
.sleep(1000)
.performTouchAction(wd.TouchAction.press(
driver.waitForElementByName('智玩')))
.sleep(5000);
});

发现怎么都执行不成功,也无法查看发起的请求是什么?后来联系了达峰,他告诉我,服务端暂时未实现
touch action的功能,只能通过在macaca内的代码里大致看到请求格式为:

1
Post /session/sessionid/touch/perform

2、既然macaca走不通,就去查看appium的源码,因为appium也封装了touch action,我知道
appium是完全可执行成功的。
appium_request打断点,print request等等,终于可以捞出了完全的请求格式:

1
2
3
4
curl -X POST -H "Content-Type: application/json" -d "{"actions": [{"action":
"press", "elementId": "4B72992B-0B42-4A14-9127-06F217CAA5DB"}]}"
http://192.168.1.101:8100/session/C8C847CF-AD3D-4F5F-B51B-EA67788875DE/touch/
perform

可是奇怪的是,仍然没有起到任何效果,而且获取的返回值status=1显然是一个错误的请求。

思路二:观察inspector展示的isVisible=NO,思考是否跟此有关?

1、看到isVisible=NO的都无法定位,但是只要是isVisible=YES的却都可以点击触发。
所以尝试通过xcode更改isVisible=NO的属性,查看了大量的链接和咨询了开发,无法给出定论说如何更改此属性,我显示有点儿灰心。。。。
2、尝试通过自己发起请求来定位此控件,发现竟然有返回值:

1
2
3
4
5
6
7
8
9
10
11
{
"value" : [
{
"ELEMENT" : "0BCEDAB9-66DE-413B-B78D-4AF15C67476A",
"type" : "XCUIElementTypeImage",
"label" : null
}
],
"sessionId" : "8BFE332C-4954-4F5C-BAAA-330DCD49E61E",
"status" : 0
}

这个时候才注意到,label值为空,突然联想到之前封装的client端有一句代码是:

1
2
if self._text and elem.get('label') != self._text:
continue

我立马恍然,原来是自己走了弯路,封装错了。

解决方法

其实很简单,只是注销这一句

1
2
if self._text and elem.get('label') != self._text:
continue

程序可以执行成功。
好吧,我浪费了将近两天的时间,功能自动化测试继续。。。。