> 本文节选自霍格沃兹测试学院内部教材
本章节主要讲解 iOS 自动化真机配置以及在 iOS 真机执行自动化时常见问题与解决方法。
真机使用的Capability
与模拟器不同,真机测试需要如下的 Capability
方式一:设置 App 路径,启动 App(自动安装 App)
{ "app": "/Users/seveniruby/Library/Developer/Xcode/DerivedData/UICatalog-ftyzdbgapjmxxobezrnrxsshpdqh/Build/Products/Debug-iphoneos/UICatalogapp", "automationName": "XCUITest", "platformName": "ios", "xcodeOrgId": "xxxxxx", "xcodeSigningId": "iPhone Developer", "udid": "9df22446af15919c494c85b4c1c8b00eaa3a5bd0"}
方式二:根据 App 包名启动 App
{ "platformName": "ios", "bundleId": "comexampleapple-samplecodeUICatalog", "automationName": "XCUITest", "deviceName": "iPhone", "udid": "auto", "xcodeOrgId": "xxxxx", "xcodeSigningId": "iPhone Developer"}
app: Xcode 选择真机编译后的 app 位置
bundleId: 每个 App 的标识,相当于 Android App 的 appPackage
xcodeOrgId: Team ID,获取方法详见`>
这时候我们也可以通过TCP/IP协议来连接:
步骤:
1、手机跟电脑连接同一个网络下
2、使用usb线连接手机
3、打开手机端口: adb tcpip 5555 (默认是5555端口,可自己修改)
4、查看手机ip地址:adb shell ip -f inet addr show wlan0
5、连接设备:adb connect 192xxxxxxxxx:5555 (前面打印的手机ip地址)
6、查看是否连接成功
即连接成功
接下来可以拔掉usb线,电脑已经链接上我们的安卓设备了,可以直接运行脚本进行调试了
Desired Capabilities在启动session的时候是必须提供的。
Desired Capabilities本质上是key value的对象,它告诉appium server这样一些事情:
本次测试是启动浏览器还是启动移动设备?
是启动andorid还是启动ios?
启动android时,app的package是什么?
启动android时,app的activity是什么?
Appium的Desired Capabilities是扩展了webdriver的Desired Capabilities的,下面的一些通用配置是需要指定的:
automationName:使用哪种自动化引擎。appium(默认)还是Selendroid?
platformName:使用哪种移动平台。iOS, Android, orFirefoxOS?
deviceName:启动哪种设备,是真机还是模拟器?iPhone Simulator, iPad Simulator, iPhone Retina 4-inch, Android Emulator, Galaxy S4, etc
app:应用的绝对路径,注意一定是绝对路径。如果指定了appPackage和appActivity的话,这个属性是可以不设置的。另外这个属性和browserName属性是冲突的。
browserName:移动浏览器的名称。比如Safari' for iOS and 'Chrome', 'Chromium', or 'Browser' for Android;与app属性互斥。
udid:物理机的id。比如1ae203187fc012g。
下面这些属性是android平台特定的:
appActivity:待测试的app的Activity名字。比如MainActivity, Settings。注意,原生app的话要在activity前加个""。
appPackage:待测试的app的java package。比如comexampleandroidmyApp, comandroidsettings。
本文主要讨论android平台的appium测试方法和技巧,因此在这里就不列出ios设备特定的属性了。
更多信息请参考 官方文档
在这里我们发现,我们经常要获取app的package和activity名字,那么有什么工具可以让我们方便的获取到这些信息呢?下一节讲回答这个问题。
在APPium+Robotframework框架上一台电脑连接多台安卓手机的自动化测试,结果见下。多台手机的运行的脚本必须按照顺序执行,不能同步执行。每个脚本之间可以相互独立也可以高度重合,区别仅仅在于设备号 deviceName和udid(一定得加上udid,否则会出现串设备号的问题)的不同。
要保证填写不同的udid(cmd中执行adb devices即可查询到),以此来确保在不同的设备中运行相应的自动化测试用例。
大多数安卓手机会自动安装unlock和settings两个应用,为了保证重复执行成功,得在脚本中执行完用例后删除这两个应用,执行dos口令就可以实现。
一、常见属性的用法
二、通过截图就可以看到元素的属性,那怎么元素定位呢?
三、问题
xpath 相对定位:如果相对定位中这个元素是有 id 的,这个 id 是唯一的,xpath 定位中优先通过 id 来定位。
class 属性对应的值是元素类型(是一个文本视图工具),Web 自动化中元素类型代表 Input、image、button 这样的标签名。
「resource-id 是唯一的,但是在 App 页面中并不绝对唯一。大部分情况下是唯一的,小部分情况下是重复的。」
如果一个页面中,元素的样式非常像,那很有可能它们的 id 就是一样的。UIAutomator Viewer 这个自带的工具是不能看出这个 id 是不是绝对唯一的。
「假设 resource-id 是唯一的,用相对定位这样定位:」
和 Web 自动化一样的玩法: 元素类型[@属性名称=属性值]
这里的 class 不是 Web 网页中的 class 属性了,这里代表它的标签名和元素类型(它是一个、一个文字、链接还是一个按钮呢?学会区分)。
如果 resource-id 不是唯一的,那么上面那个表达式是不够的,还会追加到上层的 Linearlayout 、 RelativeLayout 、包括祖先里面的一些层级都会放进来。
如果没有安装“升级 uiaumatorview-添加元素定位”就只能靠自己来判断。看下其它和它长得很像、元素的格式、风格、样式、页面布局都和它一模一样的元素,看下各位的 id 是否全都是一样的。
如果用了“升级 uiaumatorview-添加元素定位”,可以根据它的表达式自己来判断。
任何一个元素一定会有个 class,因为它是一个类别。Linearlayout 是一样的,布局也是安卓的控件,所以也会有控件名称、控件类型。
以下这些东西只有 2 个值,False 和 True。
以上这些属性在很多情况下是没有用的,但是在关键的时刻是很有用的。
例如想筛选当前页面中可以滚动的元素,通过 scrollable 等于 True 来过滤。
和 Web 自动化一样的,都是通过元素属性来定位,而且比 Web 自动化简单。
App 中只支持 5 种元素定位方式。虽然继承了 Web 自动化的元素定位,它之所以继承呢,是用到了其中的一个部分。
1、通过 id 定位元素:resrouce-id
2、通过 ClassName 定位:classname
3、通过 AccessibilityId 定位:content-desc
4、通过 AndroidUiAutomator 定位
5、通过 xpath 定位
1、通过 id 定位元素:resrouce-id
2、通过 ClassName 定位:classname
3、通过 xpath 定位
有 find_element_by_id() 就有 find_elements_by_id()
可以找到多个,它的返回值一样是列表。它的返回对象一样是 Web element 。
在它的下面有个 find_element_by_id() 。它的方法和 Web 自动化是一样的。
虽然这里代表的是元素类型,但它同样是 class 属性。
这里有点区别,但是方法名还是没有区别的。这个 class 的属性其实没有多大用处,一个页面中肯定很多属性的值和它很像的。所以这种用法不多。
既然是类别,可能有好多种,输入框也有好多种,它代表的是一种元素的类型。
「Web 自动化中 xpath 定位是最常用的,但是 App 自动化中 xpath 是最不想用的。原因是它的效率太低了。」
「如果全部只用 xpath 定位,问题会比较大,能不用 xpath 就不用 xpath」 。
AccessibilityId 是移动端特有的定位方式。
这是之前看到的类,这个类当中除了继承了 Web 自动化之外,对于安卓有 2 种,其中一种是 ACCESSIBILITY_ID 。
如果通过这种方式定位,对应的方式就是:
此处应输入 content-desc 的值,但是这里是空的,所以不能通过它定位。
但是 find_element_by_accessibility_id() 是另外一种 id,代表它在当前这个页面中也是很独特的。只要它有值,基本上可以通过它来定位。
用的是安卓 UiAutomator 这个自动化框架中提供的元素定位方式。所以想用这种元素定位方式,就必须了解它到底是怎么做的。
UiAutomator 自动化库是 Java 语言写的,所以它的参数是 Java 代码。UiAutomator 自动化库提供了 text。而 「元素有文本内容就可以通过文本内容来定位。」
这个里面的参数就必须是 UiAutomator 当中提供的定位方式。UiAutomator 是 Java 实现的,那么它的定位类型肯定也是 Java 实现的。
>
官方网站是有这方面的资料,给出了如下的命令。
$ appium -p 4736 -bp 4836 -U b33aa57c --session-override
// -p Appium的主要端口
// -bp Appium bootstrap端口
// -U 设备id
其实就是启动多个端口来实现多设备并行。然后以此为基础再自己封装方法就行了,不同的设备-p -bp -U都不同
以上就是关于iOS自动化真机测试验证环境过程中常见问题解析全部的内容,包括:iOS自动化真机测试验证环境过程中常见问题解析、史上最全-Appium自动化测试框架、appium自动化测试 电脑无线连接手机等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)