想写一个测试用例能在 Android 和 iOS 都能跑通。
我用了 ClassName 和 Xpath,有些控件 ClassName 相同我就用了 Xpath 定位,
Android 用 “//android.widget.button[@text="xxx"]”,iOS 用 “//UIAButton[@name="xxx"]” 这样.
但是有的控件 text,name,value,类似的属性都没有,该怎么定位呢?
1.我想过用 xpath 的绝对路径,但是 Android 和 iOS 中绝对路径不一样,连嵌套层数都不一样。想取其中一部分路径,然而定位不到。
2.后来又想用 location 定位,但不同机器屏幕大小也不一样。也没法定位。
3.Android 里面有 content-desc 这个属性,但是找不到和 iOS 端里的必然联系。也没法使用
所以想请教一下该怎么办……还有什么办法能同时定位到吗?
入口区分就行了,判断当前是 ios 或者 android,ios 和 android 准备两套不同的 case
可以考虑一下页面元素层写 2 套(android 和 IOS),case 层这样一套就够了
#3 楼 @yzx200712256 好像懂你的意思,但是具体感觉不清楚怎么做。页面元素层是哪部分?能具体介绍一下吗 麻烦了
给你参考我做的吧,我是分三层做的,,第一层主要是 driver 启动类,以及与 driver 相关的方法比如截图,对 findElement 的封装,还有其他等等很多,这层还有日志相关的以及其他,第二层是页面元素层(这层下面包含很多类,每个类其实就是一个页面,每个类下定义这个页面下所有页面元素 (写 2 套,一个 android 一个是 IOS)),第三层是 case 层,每个类写对应的页面的 case。
#5 楼 @yzx200712256 所以写 case 的时候是直接调用第二层的元素是吗
@zhangdameng 是的
#7 楼 @yzx200712256 所以是要遍历整个页面的所有元素吗
@zhangdameng 你 case 需要哪些元素全在这个里面定位好啊
#9 楼 @yzx200712256 。。。。所以这个工作量其实是变大了是吗,需要在第二层里把用的的元素全部单独定义?
#10 楼 @zhangdameng 要用到的元素全部写一遍定位
可以将元素定位信息外提形成对象库,Android 和 iOS 分别使用各自的对象库,业务逻辑写一套就行
给你一种比较简单的思路:
假设你们那边能做到 安卓的 desc 是 xxx.xx.TesterHome IOS 的 lable 、Name 也是 xxx.xx.TesterHome
那么你可以这样写一套 Case 咯(当然这只是一个非常非常简单的情况,碰到其他复杂的交互场景还需要不断的扩充方法):
/**
* weex
* @param name
*/
public void ShowDemo(String Element) {
WebElement Demo = driver.findElementByAccessibilityId(Element);
Demo.click();
}
-Android iOS 执行这样调就行咯-
ShowDemo(“xxx.xx.TesterHome”);
反对楼上一切的答案,不好意思跑错片场了....
其实最简单的就是以业务流来封装自动化脚本 比如这样
step1.登录
attr.loginname xxxxx
attr.password xxxxx
step2.业务
attr.数据 a xxxx
attr.数据 b xxxx
至于脚本里面你想学 qtp 那样建对象库 那看你喜欢
#5 楼 @yzx200712256 写页面元素类有没有什么好的办法,我现在也是这么做的,但是感觉一个一个写好累啊~
#5 楼 @yzx200712256 然后还有一个问题想请教下:一个页面,其中可能会有点击打开的 popwindow,然后也可能点击打开是省份城市选择的新页面,这些是写在同一个页面类里好,还是都分开写比较好?或者说如果写在一起会有什么暗坑嘛?
#5 楼 @yzx200712256 嗯 是这个思路
如果 iOS 和 android 的业务流程是一样的,只是页面元素的定位不一样,不知道是不是能看做是数据驱动呢?就是把 iOS 和 android 分别定义两套数据,然后作为 data provider 传给 case,testng 有 dataprovider。但是也是需要自己定义每一个用到的元素