移动测试Appium之API手册

移动测试Appium之API手册

前言

本文对Appium Python Client中webdriver.py代码进行分析说明。

笔者使用python3.6版本,安装在C:\Python36目录下,在C:\Python36\Lib\site-packages\appium\webdriver\webdriver.py找到本文要分析的目标模块文件。

源码概要

我们先看一下webdriver.py中源码概要情况,如图:

从上图来看,整个模块分为两大块:

  1. 导入相关的基础模块或资源
  2. 从webdriver.Remote继承,定义和实现了Appium Python版本的客户端驱动webdriver类

由此我们可以清楚的得出以下几个结论:

  1. Appium Python的webdriver客户端是依赖selenium2中的webdriver的
  2. Appium-Python-Client定义和实现了针对android和ios移动设备专用的方法
  3. 只要是selenium2中定义的webdriver方法在移动设备端可用,那么在移动测试时,可以直接用

API说明

下面我们把上述的API以一个表格的方式进行说明,以便后续大家在使用appium进行自动化测试时使用,这些API是必须熟练掌握的。

def __init__(self, 
        command_executor='http://127.0.0.1:4444/wd/hub',
        desired_capabilities=None, 
        browser_profile=None, proxy=None, keep_alive=False):
        # 调用父类的__init__进行初始化
        super(WebDriver, self).__init__(command_executor, 
            desired_capabilities, 
            browser_profile, 
            proxy, 
            keep_alive)        
        # 初始化command_executor
        if self.command_executor is not None:
            self._addCommands()        
        # 初始化错误处理器
        self.error_handler = MobileErrorHandler()        
        # 切换至默认上下文
        self._switch_to = MobileSwitchTo(self)        
        # 初始化默认定位方式
        # add new method to the `find_by_*` pantheon
        By.IOS_UIAUTOMATION = MobileBy.IOS_UIAUTOMATION
        By.IOS_PREDICATE = MobileBy.IOS_PREDICATE
        By.IOS_CLASS_CHAIN = MobileBy.IOS_CLASS_CHAIN
        By.ANDROID_UIAUTOMATOR = MobileBy.ANDROID_UIAUTOMATOR
        By.ACCESSIBILITY_ID = MobileBy.ACCESSIBILITY_ID

关键函数分析

在webdirver类中,主要定义了以下函数,本文只将常用的函数进行说明,其他的请自行查阅代码:

函数:contexts 参数:无 描述:返回当前会话所有的上下文 用法:driver.contexts

函数:current_context 参数:无 描述:返回当前会话中当前的上下文 用法:driver.current_context

函数:context 参数:无 描述:返回当前会话中当前的上下文 用法:driver.context

函数:find_element_by_ios_uiautomation 参数:uia_string 描述:通过元素名称查找一个ios元素 用法:driver.find_element_by_ios_uiautomation('.elements()[1].cells()[2]')

函数:find_elements_by_ios_uiautomation 参数:uia_string 描述:通过元素名查找N个ios元素 用法:driver.find_elements_by_ios_uiautomation('.elements()[1].cells()[2]')

函数:find_element_by_ios_predicate 参数:predicate_string 描述:通过一个谓词查找一个ios元素 用法:driver.find_element_by_ios_predicate('label == "myLabel"')

函数:find_elements_by_ios_predicate 参数:predicate_string 描述:通过一个谓词查找N个ios元素 用法:driver.find_elements_by_ios_predicate('label == "myLabel"')

函数:find_element_by_ios_class_chain 参数:class_chain_string 描述:通过class chain字符串查找一个ios元素 用法:driver.find_element_by_ios_class_chain

函数:find_elements_by_ios_class_chain 参数:class_chain_string 描述:通过class chain字符串查找N个ios元素 用法:driver.find_elements_by_ios_class_chain('XCUIElementTypeWindow[2]/XCUIElementTypeAny[-2]')

函数:find_element_by_android_uiautomator 参数:uia_string 描述:通过元素名称查找一个android元素 用法:driver.find_element_by_android_uiautomator('.elements()[1].cells()[2]')

函数:find_elements_by_android_uiautomator 参数:uia_string 描述:通过元素名称查找N个android元素 用法:driver.find_elements_by_android_uiautomator('.elements()[1].cells()[2]')

函数:find_element_by_accessibility_id 参数:id 描述:通过元素accessibility id查找一个元素 用法:driver.find_element_by_accessibility_id()

函数:find_elements_by_accessibility_id 参数:id 描述:通过元素accessibility id查找N个元素 用法:driver.find_elements_by_accessibility_id()

函数:create_web_element 参数:element_id 描述:使用指定的element id创建一个web元素

函数:scroll 参数:origin_el, destination_el 描述:从一个元素位置滚动到另一个元素位置 用法:driver.scroll(el1, el2)

函数:drag_and_drop 参数:origin_el, destination_el 描述:将一个元素从一个位置拖曳到另外一个位置 用法:driver.drag_and_drop(origin_el, destination_el)

函数:tap 参数:positions, duration 描述:点击屏幕指定位置,并在该位置停留duration指定的时长 用法:driver.tap([(100, 20), (100, 60), (100, 100)], 500)

函数:swipe 参数:start_x, start_y, end_x, end_y, duration=None 描述:从一个位置到另外一个位置滑动屏幕 用法:driver.swipe(100, 100, 100, 400)

函数:flick 参数:start_x, start_y, end_x, end_y 描述:从一个位置到另外一个位置快速滑动 用法:driver.flick(100, 100, 100, 400)

函数:pinch 参数:element=None, percent=200, steps=50 描述:捏 用法:driver.pinch(element)

函数:zoom 参数:element=None, percent=200, steps=50 描述:缩放屏幕 用法:driver.zoom(element)

函数:app_strings 参数:language=None, string_file=None 描述:获取应用字符串

函数:reset 参数:无 描述:重置设备当前的app 用法:driver.reset()

函数:hide_keyboard 参数:key_name=None, key=None, strategy=None 描述:隐藏键盘

函数:current_activity 参数:无 描述:获取设备当前app的activity 用法:driver.current_activity

函数:current_package 参数:无 描述:获取设备当前运行app的package 用法:driver.current_package

函数:set_value 参数:element, value 描述:给指定元素设置值 用法:driver.set_value(element, value)

函数:pull_file 参数:path 描述:从设备拉取文件 用法:driver.pull_file(path)

函数:push_file 参数:path, base64data 描述:以Base64编码方式向设备推送文件 用法:driver.push_file(path, base64data)

函数:background_app 参数:seconds 描述:将指定的app放在后端运行一段时间 用法:driver.background_app(seconds)

函数:is_app_installed 参数:bundle_id 描述:根据bundle id判断app是否已经安装 用法:driver.is_app_installed(bundle_id)

函数:install_app 参数:app_path 描述:安装app到设备 用法:driver.install_app(app_path)

函数:remove_app 参数:app_id 描述:卸载指定的app 用法:driver.remove_app(app_id)

函数:launch_app 参数:无 描述:启动desired capabilities指定的app 用法:driver.launch_app

函数:close_app 参数:无 描述:停止desired capabilities指定的app 用法:driver.close_app()

函数:start_activity 参数:app_package, app_activity, **opts 描述:启动指定参数的app, android专用

函数:lock 参数:seconds 描述:锁屏一段时间,ios专用 用法:driver.lock(5)

函数:shake 参数:无 描述:摇动设备 用法:driver.shake()

函数:open_notifications 参数:无 描述:打开通知,android专用,要求API level 18及以上 用法:driver.open_notifications()

函数:get_settings 参数:无 描述:获取当前appium服务端的设置 用法:driver.get_settings

函数:update_settings 参数:settings 描述:重设当前会话的设置,请参见 https://github.com/appium/appium/blob/master/docs/en/advanced-concepts/settings.md

函数:device_time 参数:无 描述:返回设备的日期时间 用法: driver.device_time

原文发布于微信公众号 - 开源优测(DeepTest)

原文发表时间:2017-12-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏上善若水

040android初级篇之标准java版的HelloWorld编译及运行

运行的时候,如果 .class文件不在当前目录则需要使用-classpath 指定所在目录。

9830
来自专栏JetpropelledSnake

Python面试题之Python反射机制

 我们要导入另外一个模块,可以使用import.现在有这样的需求,我动态输入一个模块名,可以随时访问到导入模块中的方法或者变量,怎么做呢?

39820
来自专栏Python小屋

Python面向对象程序设计中属性的作用与用法

公开的数据成员可以在外部随意访问和修改,很难保证用户进行修改时提供新数据的合法性,数据很容易被破坏,并且也不符合类的封装性要求。解决这一问题的常用方法是定义私有...

26240
来自专栏Young Dreamer

简易前端模板引擎

模板解析 解决的问题: 将data和js+html片段解析成html片段,完成赋值和js逻辑,如下所示: 输入: var data = {     name: ...

230100
来自专栏null的专栏

Python技巧——list与字符串互相转换

在Python的编程中,经常会涉及到字符串与list之间的转换问题,下面就将两者之间的转换做一个梳理。 1、list转换成字符串 命令:list() 例子: ?...

27630
来自专栏Java学习网

Java中的内存泄漏学习

Java中的内存泄漏学习   Java语言的一个关键的优势就是它的内存管理机制。你只管创建对象,Java的垃圾回收器帮你分配以及回收内存。然而,实际的情况并没...

24280
来自专栏Deep learning进阶路

C++随记(一)---字符串数组的输入问题

首先来看一段程序: #include<iostream> using namespace std; int main(){ char name[10],s...

20700
来自专栏WebDeveloper

php缓冲区与header函数之间的秘密

我们在实际的开发中,是否听说过在header之前不能有任何的实际输出。甚至有的认为header函数必须写在代码的最前面。可是你是否试验过header函数之前输出...

13820
来自专栏Jackson0714

【.Net底层剖析】3.用IL来理解属性

34770
来自专栏java一日一条

JVM 进行线程同步背后的原理

所有的 Java 程序都会被翻译为包含字节码的 class 文件,字节码是 JVM 的机器语言。这篇文章将阐述 JVM 是如何处理线程同步以及相关的字节码。

10910

扫码关注云+社区

领取腾讯云代金券