Appium [求助] 想写一个测试用例在 Android 和 iOS 端都能跑通,出现的定位问题

张大萌 · 2016年10月14日 · 最后由 aster30 回复于 2016年10月19日 · 3487 次阅读

想写一个测试用例能在 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 端里的必然联系。也没法使用

所以想请教一下该怎么办……还有什么办法能同时定位到吗?

共收到 18 条回复 时间 点赞

入口区分就行了,判断当前是 ios 或者 android,ios 和 android 准备两套不同的 case

#1 楼 @lose 恩恩你说的很对,我一开始就是这么做的。
可是想减少工作量。如果只写一套,有没有什么好的办法呢,困扰好几天了,求解。

可以考虑一下页面元素层写 2 套(android 和 IOS),case 层这样一套就够了

#3 楼 @yzx200712256 好像懂你的意思,但是具体感觉不清楚怎么做。页面元素层是哪部分?能具体介绍一下吗😇 麻烦了

给你参考我做的吧,我是分三层做的,,第一层主要是 driver 启动类,以及与 driver 相关的方法比如截图,对 findElement 的封装,还有其他等等很多,这层还有日志相关的以及其他,第二层是页面元素层(这层下面包含很多类,每个类其实就是一个页面,每个类下定义这个页面下所有页面元素 (写 2 套,一个 android 一个是 IOS)),第三层是 case 层,每个类写对应的页面的 case。

#5 楼 @yzx200712256 所以写 case 的时候是直接调用第二层的元素是吗

#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。但是也是需要自己定义每一个用到的元素

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册