=
本篇文仅仅是对基本操作做了介绍。
真实过程,关键的地方没有讲到,不过么,还是可以不错的。
=
from:http://www.cnblogs.com/7chentest/p/6396551.html
APPIUM 常用API
(1)获取当前页面的activity名,比如: (.ui.login.ViewPage)
比如我们需要实现这个登录的功能时,主要思路为如果当前界面为登录页面时,就进行登录行为,否则就跳转到登录页面。其伪代码为:
1 if driver.current_activity == ".ui.login.ViewPage": 2 // To login_action 3 else: 4 // Trun to loginPage
(2)获取当前页面的树形结构源代码,与uiautomatorviewer截屏所展示出来的结构是相同的
例如当我们完成登录流程之后,要判断登录是否成功,则可以判断登录后的页面有没有出现特定的内容(比如:运动圈、发现、运动、商城、我的),其伪代码实现如下:
driver \ .page_source.find(u"运动圈") != -1 and .page_source.find(u"发现") != -1 and .page_source.find(u"运动") != -1 and .page_source.find(u"商城") != -1 and .page_source.find(u"我的") != -1 and
page_source()的返回数据类型为str。python中,str的find(context)方法,如果str存在context返回值为context在str的index,如果不存在,则返回值为-1。因此只需要判断以上代码块返回的布尔值是True or False,就可以判断是否登录成功。
(3)获取到当前窗口的所有context的名称
在native和html5混合页面测试时,需要在native层和H5层切换,所以首先需要得到context层级的名称
print driver.contexts
>>> ['NATIVE_APP', 'WEBVIEW_com.codoon.gps']
由此可见,我们知道App的H5层名称为"WEBVIEW_com.codoon.gps"后,使用driver.switch_to.context("WEBVIEW_com.codoon.gps")就可以实现NATIVE和H5层的切换了。
二、获取控件类API
(1)通过元素id查找当前页面的一个目标元素
通过源码注释可以得到find_element_by_id这一类的api主要有两个使用途径:
driver.find_element_by_id("com.codoon.gps:id/tv_login") // from webdriver.py
在driver下通过id查找一个元素,此用法通常适用于当前界面的driver有且仅有一个唯一的id元素标示,通过调用find_element_by_id可以准确到找到目标元素;另一种使用途径主要如下:
driver_element = driver.find_element_by_xpath("//android.widget.ListView/android.widget.LinearLayout")
// from webdriverelement.py
driver_element.find_element_by_id("com.codoon.gps:id/activity_active_state")
在driver.find_element_by_xpath返回了driverElement类型,调用find_element_by_id在driverElement下的子元素以id匹配目标元素。
上图为uiautomatorviewer对id,name,class的图示说明。特别说明:若id、name、xpath等在当前driver或者driverElement查找的目标元素不是唯一元素,此时调用find_element_by_id(name\xpath)时,会返回查找匹配到的第一个元素。
(2)通过元素id查找当前页面的多个目标元素
在driver下通过id查找多个目标元素,其返回值类型为list。此用法通常适用于当前driver下查询listView、LinearLayout、 RelativeLayout等有相同布局结构的Item;同样除了driver之外,在driverElement下页可以跳用find_elements_by_id来匹配listView、LinearLayout、 RelativeLayout。
driver.find_elements_by_id("com.codoon.gps:id/tv_name") // from webdriver.py
driver.find_element_by_id("com.codoon.gps:id/webbase_btn_share") \
.find_elements_by_id("com.codoon.gps:id/ll_layout") // from driverelement.py
Tips: 带有find_elements关键字的方法函数的返回类型都是list数据类型,只有driver与driverelement的实例化有find_element(s)等一系列方法,list类型是不能用find_element(s)方法定位数据的。在实际的项目中可能会遇到这样的问题,只有遍历list,取出每一个element实例化对象再进行查找定位元素。
(3) 通过元素name查找当前页面的一个元素
使用方式与find_element_by_id相同,只是把匹配条件由id变为name。请参考find_element_by_id的调用方式
driver.find_element_by_name("foo") driver.find_element_by_id("com.codoon.gps:id/tv_name").find_element_by_name("foo")
>>> return the driverElement(obj)
(4) 通过元素name查找当前页面的多个目标元素
使用方式与find_elements_by_id相同,只是把匹配条件由id变为name。请参考find_elements_by_id的调用方式,注意其返回数据类型是List,并不是driverElement。
driver.find_elements_by_name("foo") driver.find_element_by_id("com.codoon.gps:id/tv_name").find_elements_by_name("foo") ### return the List<driverElement> >>> ['driverElement1', 'driverElement2', 'driverElement3', ....]
(5)通过元素xpath查找当前页面的一个目标元素
关于find_element_by_xpath的调用方法与通过id、name略有不同,有关Xpath的相关知识点在本章节暂且不表,后续在项目实践中若有需求再另起专题介绍。
driver.find_element_by_xpath("//android.widget.TextView[contains(@text, '开始')]") driver.find_element_by_xpath("//android.widget.LinearLayout/android.widget.TextView")
在Appium中,xpath所需相关的lib库并没有完全支持,所以使用方法是以上两种(即仅支持在driver下的xpath匹配)。目前的Appium版本无法支持driverelement下的xpath查找,如
driver.find_element_by_xpath("//android.widget.LinearLayout/android.widget.TextView") \
.find_element_by_xpath("//android.widget.TextView[contains(@text, '开始')]") // This is the Error!
按上面的写法Appium就会报错,原因是“.find_element_by_xpath("//android.widget.TextView[contains(@text, '开始')]")”不能在Element下查找子元素。
(6) 通过元素xpath查找当前页面的多个目标元素
参照find_element_by_xpath的调用方式,需注意返回类型为List,用法参考find_elements_by_name()的例子
(7) 通过元素class name查找当前页面的的一个元素
在实际项目中,测试app中class name并不能做为界面的唯一标示定位,所以在实际中几乎没有使用class name在driver查看元素,在driverelement下查找子元素用class name才是正确的使用方式。
(8) 通过元素accessibility_id (content-desc)查找当前页面的一个元素
在uiautomatorviewer中,content-desc内容即为accessibility_id,在selenium库里可以用find_element_by_name()来匹配content-desc的内容;在Appium库里则用find_element_by_accessibility_id()来匹配content-desc的内容。因为Appium继承了Selenium类,所以如果find_element_by_name无法准确定位时,请试试看find_element_by_accessibility_id。
常用的获取控件类API就是以上这些。其他的查找和匹配的api还有find_element_by_link_text、find_elements_by_link_text、find_element_by_tag_name、find_elements_by_tag_name、find_element_by_css_selector、find_elements_by_css_selector等,用法都与上述类似。
三、元素操作类API
我们在实现PC端浏览器Webdriver自动化时,对于网页上的目标的操作主要有:点击(click)、 双击(double_click)、滚动(scroll)、输入(send_keys),而移动端特有的辅助类api:轻击(tap)--支持多点触控,滑动(swipe),放大元素(pinch),缩小元素(zoom)
(1)点击事件
click和tap都能实现单击的效果。其区别在于click是作用于driverelement的实例化对象,而tap是对屏幕上的坐标位置进行点击。前者对元素的位置变化并不敏感,而后者是针对具体的像素坐标点击,受分辨率和元素位置影响较大。
(2)输入事件
send_keys和set_text也都能满足输入文本内容的操作。其区别在于send_keys会调用设备当前系统输入法键盘,而set_text直接对目标元素设置文本。由此可推,send_keys的输入内容往往和预期内容不一致,而set_text的输入则是直接赋值,并不是键盘事件。
(3)滑动(翻屏)事件
swipe和flick都是滑动操作,它们都是从[start_x, start_y]划到[end_x, end_y]的过程,唯一不同的是swipe比flick多了一个duration参数,有了这个参数就可以自定义从start到end动作的作用时间,以达到快速滑动或者慢速滑动的效果。
(4)缩放事件
默认会对目标元素进行放大一倍或者缩小一半的操作,此api方法适合于在测试运动地图的缩放时的变化。
(5)长按事件
长按方法是在TouchAction类中,所以在使用时需要先import TouchAction。在删除运动历史记录时,在记录列表长按删除,
action1 = TouchAction(self.driver) driver_element = driver.find_element_by_xpath("sport_history_item_xpath") action1.long_press(driver_element).wait(i * 1000).perform() // i为长按控件的时间,单位秒
(6)keyevent事件(android only)
在Android keyevent事件中,不同的值代表了不同的含义和功能,比如手机的返回键:keyevent(4); 手机的HOME键: keyevent(3)等等,具体keyevent与对应值关系请参考http://blog.csdn.net/yun90/article/details/51036544
四、元素事件类API
(1) reset
用法:driver.reset(),重置应用(类似删除应用数据),如首次登录app时出现的引导页,则可以用reset来实现需求。
(2) is_app_installed
检查app是否有安装 返回 True or False。例如:在微信登录时,选择登录方式时会判断是否已安装微信,若未安装则有dialog弹框,已安装则跳转到微信登录页面,
driver.find_element_by_id("weixin_login_button").click() if driver.is_app_installed("weixin.apk"): // To do input User, Passwd else: // show dialog
(3)install_app
接上个例子,若未安装微信出现dialog弹框,检查完dialog后再安装微信app。特别说明:例子中的"weixin.apk"是指app_path + package_name,
driver.find_element_by_id("weixin_login_button").click() if driver.is_app_installed("weixin.apk"): // To do input User, Passwd else: check_dialog() driver.install_app("weixin.apk")
(4) remove_app
在测试老版本兼容用例时,用老版本替换新版本时,需要卸载新版本,再安装老版本,所以需要调用到此方法,
driver.remove_app("new_app.apk") # 卸载 driver.install_app("old_app.apk") # 安装
(5) launch_app
打开一个capabilities配置的设备应用。此方法目前并没有使用。待以后用到时再来做更新。
(6) close_app
关闭app应用程序。此方法常用在代码末尾,在清理和释放对象时使用。结合unittest框架常见tearDown()里使用,
import unittest class demo(unittest.TestCase): def setUp(self): pass def tearDown(self): driver.close_app() driver.quit()
(7) start_activity
此方法适用于测试中需使用两个及以上的app程序。例如,在运动相关的测试时,首先需要打开Gps模拟打点工具,开始打点。然后打开咕咚选择运动类型开始运动,那么可以在启动capabilities配置时打开Gps工具,开启配速打点后再打开咕咚app,
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps={'platformName': 'Android', 'deviceName': 'Android Mechine', 'appPackage': ' Package of GpsTools', 'unicodeKeyboard':True, 'resetKeyboard':True, 'noReset':True, 'appActivity': 'activity of GpsTools'}) # TO DO Gps Mock action driver.start_activity("com.codoon.gps", "ui.login.welcomeActivity")
(8) wait_activity
此方法适属于appium等待方法的一种。不论是webdriver还是appium,等待方法分为三种类型:显式等待、隐式等待,time.sleep;从wait_activity的源码可以看出,是属于隐式等待。有关等待方式以后可以另开专题详细说明,这里不做赘述。
此方法主要使用在需要网络加载时的等待,比如在用户登录作为前提条件时,wait_activity接受三个参数: 需要等待加载的activity的名称,timeout超时时间(秒),检测间隔时间(秒),
driver.login_action() driver.wait_activity("homepage.activity", 30, 1) driver.find_element_by_id("我的").click()
其含义是,等待加载app的homepage的activity出现,等待最长时间30秒,每隔1秒检测一次当前的activity是否等于homepage的activity。若是,则推出等待,执行点击我的tab的action;若否,则继续等待,30秒后提示超时抛出异常。
四、其他(此类别下主要对上述没有提到的api方法的补充)
(1) 截屏
用法:driver.get_screenshot_as_file('../screenshot/foo.png'),接受参数为保存的图片路径和名称
(2)size 和 location
size 和 location是对element位置和尺寸的获取,这两个属性主要运用在有可划动的控件,如完善个人资料页,生日、身高和体重都需要划动。之前我们提到的swipe和flick是针对设备屏幕进行划动,显然在这里不适用。而且没有一个特定的方法,所以需要我们自己针对可划动控件进行划动,
(3)获取控件各种属性
用法: driver.find_element_by_id().get_attribute(name),name即是左侧的标志(class,package,checkable,checked....),返回值为str类型,即便是true or false,但是其实是"true" or "false"
(4)pull_file
将设备上的文件pull到本地硬盘上,在手机号注册时需要获取手机验证码,此时的实现方式是用另一个apk提取到验证码存在手机内存中,再用pull_file获取到验证码内容,使得appium可以将正确的验证码填入。
本章节Appium常用的一些API函数,日后有需要会慢慢地进行补充。虽然不能面面俱到,但在实际项目中涉及到的都已经差不多提到了。当我们对某个功能进行测试的时候,首先要对其进行操作,这个时候就要考虑到找到相应的对象元素,调用具体的事件类函数,验证结果的时候,我们要检测操作产生的结果是不是与我们预期的一致?那这就要去考虑相应的Assert函数(即断言)了。所以记住这六字箴言:对象-事件-断言,便可以使你可以着手对任何一个App编写对应的自动化测试用例了。
=
=
=
相关推荐
appium提供常用api详解,方法功能解释,参数详细介绍,中文解释
自动化测试,一个项目教会你app自动化和web自动化!了解自动化执行时机以及自动化常用的工具环境。...技术点:元素定位、API交互操作、po模式、数据驱动、工具环境、Appium常用Api等常用知识点,学会直接工作上手。
本知识点集将基于“appium-java中文api.pdf”文档中的内容,详细介绍Appium与Java结合使用的常用方法和相关API,以帮助读者更好地理解和掌握在Java环境下如何进行移动端的自动化测试。 1. 获取应用资源文件信息 ...
- **基于WebDriver协议**:Appium通过实现WebDriver API来驱动移动应用,这意味着开发者可以使用任何支持WebDriver的语言来编写测试脚本。 - **跨平台支持**:支持iOS和Android两大主流操作系统,能够对多种类型的...
10. **Appium API的常用方法**:了解常用的测试方法,如点击、输入文本等。 11. **实践案例**:通过编写计算器乘法口诀表的自动化测试用例,加深对Appium的理解。 12. **真实APP的登录注册自动化测试**:结合实际...
以上是Appium Python API中的一些常用方法和技术点介绍。掌握这些API对于进行高效、准确的自动化测试至关重要。通过合理地组合使用这些方法,可以实现对各种移动应用的全面自动化测试。希望本文能帮助开发者和测试...
由于WebDriver API本身是一个正在被W3C起草标准的协议,Appium没有创造新的协议,而是基于WebDriver扩展了移动端自动化所需的API。这种设计允许测试人员使用任何支持HTTP客户端API的语言编写测试脚本,并且可以结合...
Python是Appium的一个常用绑定库,它提供了丰富的API供测试开发者编写测试脚本。通过Python与Appium结合,可以实现对Windows应用程序的自动化控制,比如模拟用户交互、检测UI元素状态等。 在Appium-for-windows-...
在实际应用中,Appium自动化框架提供了一整套API,用于创建、控制和管理测试会话。例如,`driver.findElement()`方法可以帮助我们定位到应用中的特定元素,而`click()`方法则可以执行点击操作。此外,还有`sendKeys...
- **步骤**: 下载并安装Android SDK,确保安装了API Level 17或以上版本。 - **环境变量**: - 设置`ANDROID_HOME`系统变量为Android SDK路径,例如`D:\android-sdk`。 - 更新`Path`环境变量,添加`%ANDROID_HOME...
在iOS测试场景中,Appium-Python-Client扮演着至关重要的角色,因为它提供了丰富的API,可以方便地与iOS设备进行交互。 首先,要理解Appium的核心概念。Appium是一个开源自动化测试框架,支持iOS、Android以及Web...
标题中的 "Appium-mac-1.19.1.dmg" 指的是Appium的Mac版安装包,版本号为1.19.1,而文件格式是.dmg,这是苹果 macOS 系统中常用的安装镜像文件。 "appium最新版2021" 这个描述表明这个版本的Appium是在2021年发布的...
- **MD5**:是另一种常用的哈希函数,生成的是128位的哈希值。尽管安全性较低,但在某些场景下仍然被广泛使用。 2. **主体(body)**:这里的主体指的是App中需要抓取的主要内容,包括但不限于用户界面元素、网络...
以下是对描述中提到的一些Appium常用方法的详细解释: 1. `driver.runAppInBackground(5);` 这个方法将当前正在运行的应用程序推送到后台,并让它在那里运行指定的时间(5秒)。这在模拟用户切换应用或执行其他任务...
Java作为编程语言,是Appium的常用绑定之一,提供了一套丰富的API来编写测试脚本。因此,【AppiumDemo1】中的Java代码很可能是用于驱动Appium执行这些自动化测试的逻辑。 测试脚本通常会包括以下几个关键部分: 1. ...
它支持iOS和Android应用,允许测试人员使用相同的API来编写测试脚本,不论是原生应用、混合应用还是Web应用。Appium基于WebDriver协议,使得测试脚本可以用多种编程语言(如Java、Python、Ruby等)编写。 在搭建...
- 使用Java或Python等语言编写测试脚本,通过Selenium WebDriver API与Appium服务器交互。 - 示例代码通常包括启动应用、定位元素、执行操作等步骤。 #### 四、Appium实现原理 1. **Appium在Android端的工作模式...
- **Java**:Java是企业级开发常用的语言,其Appium客户端库Junit和TestNG提供了强大的测试框架支持。 - **Ruby**:Ruby语言的Gems库提供了Appium的支持,使开发者能够利用Ruby的灵活性进行测试脚本编写。 5. **...
在Pytest中整合Appium,我们可以创建自定义的测试类和方法,使用Appium提供的API来操作移动设备。例如,`adb_shell`方法允许我们通过Appium直接执行ADB命令,这在某些情况下非常有用,比如获取设备信息、安装或卸载...