Appium核心应用(二)
利用原生的移动操作系统提供的接口开发的应用程序,功能最强大,但是在兼容性方面相对容易出问题。尤其是在Android端,由于过多的定制Android系统,设备生产商,不同的分辨率等。所以原生应用在研发过程中也是成本最高的一种,其测试工作也非常复杂繁琐,当然,也正因为如此,针对原生应用的自动化测试产生的价值也最明显,尤其是在名目繁多的设备上进行兼容性测试。
本周分享《Appium核心应用》实验中的界面对象识别。
回顾上周内容,请点击
:
在利用Selenium针对标准Web应用进行测试时,我们可以使用浏览器自带的开发人员工具来识别元素的各种属性,也可以利用Selenium IDE插件来获取到HTML元素的属性,并用于测试脚本中。这个过程同样适应于Appium的移动设备,主要利用Android SDK自带的UI Automator Viewer工具进行元素的属性识别。通常情况下,在移动端的应用有三种类型:
(1)原生应用(Native App):利用原生的移动操作系统提供的接口开发的应用程序,功能最强大,但是在兼容性方面相对容易出问题。尤其是在Android端,由于过多的定制Android系统,设备生产商,不同的分辨率等。所以原生应用在研发过程中也是成本最高的一种,其测试工作也非常复杂繁琐,当然,也正因为如此,针对原生应用的自动化测试产生的价值也最明显,尤其是在名目繁多的设备上进行兼容性测试。
(2)Web应用(Web App):WebApp严格意义上来说就是一个浏览器应用,对移动端的分辨率,功能方面进行了适配。Web应用的优势在于轻量级,满足W3C定义的规范,兼容性高,一次开发,到处运行,不需要经常提醒用户更新,对兼容性测试的要求不高,能够节省大量人力成本和时间成本。但是由于浏览器对直接操作手机端的权限的控制,导致WebApp除了利用HTML+JavaScript能做的事情外,很难直接与操作系统对接,完成一些底层的操作,比如直接操作移动设备硬件如相机,GPS等。
(3)混合应用(Hybrid App):正因为上述两种应用程序的优势和不足都非常明显,所以目前更多的时候大家会选择使用混合应用,即利用原生应用做窗口和框架,利用Web应用完成基本功能实现。能实现混合应用的核心在于原生应用内置的WebView控件(即WebKit渲染引擎,用于对Web页面进行渲染,对JavaScript脚本进行解析等),无论是Android还是iOS,其WebView控件均使用的是WebKit引擎。这种混合应用可以很好地结合原生应用和Web应用的优点,从而提升用户体验,降低研发成本。
事实上,无论针对哪种应用程序类型,Appium都可以完成测试,并且使用同样的一套标准测试接口,对于对象的识别和操作也都是一致的。目前将对象识别的常用API列举如下:
(1)driver.find_element_by_id(“resouce-id”):根据元素的resouce-id属性进行识别。
(2)driver.find_element_by_name(“text”):根据元素的text属性进行识别。目前该查找方式在最新版本的Appium中已经被取消,但是我们可以通过修改Appium源代码的方式继续启用,因为这个API也是使用频率非常高的。只需要修改文件C:\Users\Denny\AppData\Roaming\npm
\node_modules\appium\node_modules\appium-android-driver\build\lib\driver.js,找到“this.locatorStrategies = ['xpath', 'id', 'class name', 'accessibility id', '-android uiautomator'];”在其列表最后添加’name’字段变成“this.locatorStrategies = ['xpath', 'id', 'class name', 'accessibility id', '-android uiautomator', 'name'];”并重启Appium服务器即可生效。
(3)driver.find_element_by_xpath(“xpath”):利用XPath对元素进行识别。
(4)driver.find_element_by_link_text(“link”):根据Web页面的超链接文本对元素进行识别。
(5)driver.find_element_by_partial_link_text(“link”):根据超链接的部分文本进行识别。
(6)driver.find_element_by_class_name(“css”):根据元素的Class属性进行识别。
(7)driver.find_element_by_css_selector(“selector”):根据CSS选择器进行识别。
(8)driver.find_element_by_tag_name(“tag”):根据标签名称进行识别。
(9)driver.find_element_by_accessibility_id(“content-desc”):根据可访问到的文本即content-desc属性进行识别。
(10)driver..find_element_by_android_uiautomator(“uia-selector”):根据Android原生的UI Automator库的识别对象的方式进行识别。Appium本身就是对UIAutomator进行的二次封装,所以不太会用到。
(11)driver.find_element_by_ios_uiautomation(“ios-selector”):根据iOS原生框架的识别方式进行识别。
(12)driver.find_elements_by_xxxxx():针对上述识别方式的复数形式,即识别1个或多个元素,识别到的元素将返回在一个列表中,通常情况下,如果我们利用相对的识别属性无法精准地定位某一个特定元素时,可以使用复数进行识别。再通过遍历的方式来判断这些识别到的元素的某些属性来进一步找到测试过程中需要的那一个。
下周推送:原生应用测试