Appium使用教程_Android篇

Appium使用教程_Android篇2016 05 16 一 Appium 介绍 Appium 是一个开源的自动化测试工具 其支持 iOS 和安卓平台上的原生的 基于移动浏览器的 混合的应用 1 Appium 理念 Appium 是基于以下的四个理念设计来满足移动平台测试自动化的要求的 1 您不应该因为需要自动化测试您的应用而不得不以任何形式去重新编译或者修改你的 app2 您不应该

 

–by keeng2008@.com 2016-05-16

一、Appium介绍

Appium是一个开源的自动化测试工具,其支持iOS和安卓平台上的原生的,基于移动浏览器的,混合的应用。

1、Appium 理念

Appium是基于以下的四个理念设计来满足移动平台测试自动化的要求的:

1)您不应该因为需要自动化测试您的应用而不得不以任何形式去重新编译或者修改你的app

2)您不应该把自己固定在一门特定的语言和一个特定的框架上去实现和运行你的测试

3)当说到测试自动化APIs的时候,一个移动测试框架不应该做“重新发明轮子”的事情,

4)一个移动测试自动化框架应该是开源的,无论是在精神上,实际上,还是名义上!

2、使用Appium进行自动化测试有两个好处

Appium在不同平台中使用了标准的自动化APIs,所以在跨平台时,不需要重新编译或者修改自己的应用。

Appium支持Selenium WebDriver支持的所有语言,如java、Object-C、JavaScript、Php、Python、Ruby、C#、Clojure,或者Perl语言,更可以使用Selenium WebDriver的Api。Appium支持任何一种测试框架.Appium实现了真正的跨平台自动化测试。(本文主要介绍Python的用法)

3、Appium架构

Appium 是一个用Node.js编写的HTTP server,它创建、并管理多个 WebDriver sessions 来和不同平台交互,如 iOS ,Android等等. 

Appium 开始一个测试后,就会在被测设备(手机)上启动一个 server ,监听来自 Appium server的指令. 每种平台像 iOS 和Android都有不同的运行、和交互方式。所以Appium会用某个桩程序“侵入”该平台,并接受指令,来完成测试用例的运行。

 

 

 

二、Appium环境搭建(Android)

1、首先需要准备

1) jdk(步骤不再啰嗦)

2) android SDK,下载地址:http://developer.android.com/sdk/index.html,下载sdk tools,可能需要FQ,提供一个国内下载地址:http://www.androiddevtools.cn/

3) appium,下载地址:http://appium.io/

4) nodejs,下载地址:https://nodejs.org/en/

5) appium lib,下载地址:http://appium.io/downloads.html

     选择Python版本的Lib: Appium-Python-Client-0.22.tar.gz

     由于Appium依赖于Selemium,所以还要下载 Selemium Lib: selenium-2.53.2.tar.gz   https://pypi.python.org/pypi/selenium

6) python, 下载地址:https://www.python.org/, 下载2.X 的版本。

上述软件都准备好后,则进入搭建步骤。

2、安装、配置

将上述软件依次安装。

1) android sdk安装完毕后,需要配置环境变量

新建ANDROID_HOME    D:\ProgramFiles (x86)\Android\android-sdk

在PATH中添加:%ANDROID_HOME%\platform-tools;%ANDROID_HOME%\tools;

2)  nodejs安装完毕后,需要配置环境变量

在PATH中添加:D:\Program Files\nodejs;

3) appium安装完毕后,需要配置环境变量

D:\Program Files (x86)\Appium\node_modules\.bin;

4) 配置好后,启动cmd,

输入node -v,查看node安装版本

输入appium-doctor检查appium的安装环境是否成功,如下图:

 

 

5) 安装Python,配置环境变量,如C:\Python27,检查是否设置成功,如下图:

 

 

三、开始例子(Python)

1) 启动Appium

打开命令行,输入appium, 显示成功启动:

 

 

2)连接Android手机(或者模拟器)

3)编写客户端代码

假设我们的代码放在目录E:\PythonTest\AppiumClientPython 中。首先把 Appium-Python-Client-0.22.tar.gz 里面的 appium 目录解压到AppiumClientPython 中, 把 selenium-2.53.2.tar.gz里面的 selenium 目录解压到AppiumClientPython中。

创建文件hello_appium.py , 编辑内容:

#coding=utf-8

from appium import webdriver

 

desired_caps = {}

desired_caps[‘platformName’] = ‘Android’

desired_caps[‘platformVersion’] = ‘4.4.2’

desired_caps[‘deviceName’] = ‘Android Emulator’

desired_caps[‘appPackage’] = ‘com.android.calculator2’

desired_caps[‘appActivity’] = ‘.Calculator’

 

driver = webdriver.Remote(‘http://localhost:4723/wd/hub’, desired_caps)

driver.find_element_by_name(“1”).click()

driver.find_element_by_name(“5”).click()

driver.find_element_by_name(“9”).click()

driver.find_element_by_name(“9”).click()

driver.find_element_by_name(“5”).click()

driver.find_element_by_name(“+”).click()

driver.find_element_by_name(“6”).click()

driver.find_element_by_name(“=”).click()

driver.quit()

 

4)运行

打开命令行,cd到E:\PythonTest\AppiumClientPython 中,运行 python hello_appium.py, 正常情况可以看到手机按照代码控制,打开计算器,逐个点击按钮完成计算。

四、Appium文档

1、安装应用后打开

import os

from appium import webdriver

APK_PATH = ‘apk/my-debug.apk’

COMMAND_EXECUTOR_URL = ‘http://localhost:4723/wd/hub’

  

    desired_caps = {}

    desired_caps[‘platformName’] = ‘Android’

    desired_caps[‘platformVersion’] = ‘5.0’

    desired_caps[‘deviceName’] = ‘Android Emulator’

    desired_caps[‘app’] = os.path.abspath(APK_PATH)

 

    driver = webdriver.Remote(COMMAND_EXECUTOR_URL, desired_caps)

 

2、查找控件

1)通过名称查找

btn = driver.find_element_by_name(“+”)

2)  通过ID查找

start_btn =driver.find_element_by_id(‘com.cn21.myapp:id/instruction_close_btn’)

或 start_btn = driver.find_element_by_id(‘instruction_close_btn’)

3)通过类名查找

child_text =parent.find_element_by_class_name(‘android.widget.TextView’)

4)通过android_uiautomator查找

start_btn =driver.find_element_by_android_uiautomator(‘new UiSelector().clickable(true)’)

以上find_element_by_XX 都是返回符合条件的第一个控件,如果要返回多个控件,可以调用 find_elements_by_XX, 返回的是一个list。

注意:如果找不到符合条件的控件,会抛出异常。

5)查找结点,不希望返回异常,写个函数就行了

def find_element_by_id_no_except(driver, id):

    element = None

    try :

        element = driver.find_element_by_id(id)

    except Exception,e:

        print Exception, ‘:’, e

    return element

 

3、模拟按钮点击

login_btn.click()

注意:有的点击如果需要等待动画、或者网络请求,建议等待一会:

import time

time.sleep(2)  # 睡眠2秒

 

4、输入框输入文本

user_input.send_keys(”)

注意:Android如果要正确输入,需要把使用系统自带的输入法,第三方输入法无法正确输入。

5、模拟点击返回键

driver.press_keycode(4)

其中按钮的定义,由Android里的KeyEvent.java里定义的,所以其它的Android按钮也是支持的。

6、关闭driver

driver.quit()

注意:一定要记得关闭driver, 否则下次连接的时候可能会出异常,因为Appium以为你上次未关闭,会创建Session失败。

为了避免代码出现异常而没有关闭,可以在捕获异常时再关闭。

7、滑动界面

下面的例子,演示点击屏幕中间,并向上拉动(相当于查看列表下面的内容了)。

from appium.webdriver.common.touch_action import TouchAction

def test_scroll_down(driver):

    screen = driver.get_window_size()

    action = TouchAction(driver)

    action.press(x=screen[‘width’]/2,y=screen[‘height’]/2)

    action.move_to(x=0,y=-screen[‘height’]/10)

    action.release()

    action.perform()

 

等等,怎么获取界面的属性来验证正确性?

8、获取界面属性,控件属性

1)获取当前Activity名称

activity = driver.current_activity

2) 获取屏幕宽高

screen = driver.get_window_size()

3)获取控件文本

mobile_name.get_attribute(‘text’) 或者 mobile_name.text

4)获取控件类名

mobile_name.get_attribute(‘className’)

5)判断控件是否显示

mobile_name.is_displayed() 或者 mobile_name.get_attribute(‘displayed’)

6)获得控件位置

mobile_name.location

7)获得控件大小

mobile_name.size

8)查找控件子结点

parent.find_elements_by_class_name(‘android.widget.TextView’)

同样:查找控件的其它方法,也适用于查找子结点。

 

对于交互后的验证,无法验证到具体的数据内容,可以验证当前的Activity,或者文本,或者列表是否为空等等。

更多参考:http://blog.csdn.net/crisschan/article/details/

 

五、结合单元测试框架编写用例

Python自带有unittest用于单元测试,其结构类似于JUnit。

一个测试类需要继承于unittest.TestCase, 方法setUp 用于测试初始化,每个用例开始前都会调用,tearDown用于用例结束时调用,每个以test开始的函数被当成一个用例。

test_random.py

import random

import unittest

 

class TestSequenceFunctions(unittest.TestCase):

 

    def setUp(self):

        self.seq = range(10)

 

    def test_shuffle(self):

        # make sure the shuffled sequence does not lose any elements

        random.shuffle(self.seq)

        self.seq.sort()

        self.assertEqual(self.seq, range(10))

 

        # should raise an exception for an immutable sequence

        self.assertRaises(TypeError, random.shuffle, (1,2,3))

 

    def test_choice(self):

        element = random.choice(self.seq)

        self.assertTrue(element in self.seq)

 

    def test_sample(self):

        with self.assertRaises(ValueError):

            random.sample(self.seq, 20)

        for element in random.sample(self.seq, 5):

            self.assertTrue(element not in self.seq)

 

if __name__ == ‘__main__’:

    unittest.main(verbosity=2)

 

运行此测试: python test_random.py 可以查看测试的结果

 

 

上面结果显示,有2个用例测试通过,1个用例不通过。

可以在一个目录下写多个以test开头的测试文件,然后通过以下命令运行所有测试类:

python -m unittest discover . -v

 

六、完整例子

1、测试登陆登出功能

test_myapp_login_logout.py

#coding=utf-8
#
测试登陆登出功能
#
用例1:快速登陆,验证登陆后的Activity为MainActivity
# 用例2:普通登陆,输入用户名密码,验证登陆后的Activity为MainActivity
# 用例3:快速登陆后注销,验证注销后的Activity为LoginActivity

import unittest
import appium_myapp
import appium_util
from appium import webdriver
import os

class LoginLogoutTest(unittest.TestCase):
   
   
def setUp(self):
        #print(‘Installing …’)
       
desired_caps = {}
        desired_caps[‘platformName’] = ‘Android’
       
desired_caps[‘platformVersion’] = ‘5.0’
       
desired_caps[‘deviceName’] = ‘Android Emulator’
       
desired_caps[‘app’] = os.path.abspath(appium_myapp.APK_PATH)
        self.driver = webdriver.Remote(appium_util.COMMAND_EXECUTOR_URL, desired_caps)
       
    def tearDown(self):
        self.driver.quit()
       
    def test_FastLogin(self):
        appium_myapp.agree_document(self.driver)
        appium_myapp.quick_login(self.driver)
        self.assertTrue(self.driver.current_activity.endswith(‘MainActivity’))
       
    def test_SlowLigin(self):
        appium_myapp.agree_document(self.driver)
        appium_myapp.slow_login(self.driver)
        self.assertTrue(self.driver.current_activity.endswith(‘MainActivity’))
       
    def test_Logout(self):
        appium_myapp.agree_document(self.driver)
        appium_myapp.quick_login(self.driver)
        if (self.driver.current_activity.endswith(‘MainActivity’)):
            appium_myapp.test_logout(self.driver)
            self.assertTrue(self.driver.current_activity.endswith(‘LoginActivity’))

if __name__ == ‘__main__’:
    unittest.main(verbosity=2)

   
       





































 

 

2、自动乱点测试崩溃的情况

auto_test_myapp.py

#coding=utf-8
import random
import time
import traceback

import appium_myapp

def auto_interact(driver):
    activity = driver.current_activity
    # 一定的机率滑动,返回键,点击
   
rate = random.random()
    if rate < 0.1:
        print activity + ‘ Scroll Down’
       
appium_myapp.test_scroll_down(driver)
    elif rate < 0.2:
        print activity + ‘ Scroll Up’
       
appium_myapp.test_scroll_up(driver)
    elif rate < 0.3:
        print activity + ‘ Key Back’
       
driver.press_keycode(4)
    else:
        btn_list = driver.find_elements_by_android_uiautomator(‘new UiSelector().clickable(true)’)
        if (len(btn_list) > 0):
            index = random.randint(0, len(btn_list) – 1)
            print activity + ‘ Click Button index = %d’ % (index,)
            btn_list[index].click()

def main():
    driver = None
    try
:
        driver = appium_myapp.install_app()
        time.sleep(appium_myapp.LONG_WAIT_TIME)
        appium_myapp.agree_document(driver)
        appium_myapp.quick_login(driver)
        step = 0
       
while step < 100:
            if (driver.current_activity.endswith(‘LoginActivity’)):
                appium_myapp.test_login(driver)
            elif (driver.current_activity.endswith(‘.Launcher’)):
                driver.background_app(1)
                driver.launch_app()
            else:
                auto_interact(driver)
                time.sleep(appium_myapp.CLICK_WAIT_TIME)
            step += 1
       
# 正常退出
       
driver.quit()

    except Exception, e:
        print Exception, “:”, e
        traceback.print_exc()
        # 异常退出
       
if (driver != None):
            driver.quit()

if __name__ == ‘__main__’:
    for i in range(20000):
        try:
            main()
        except Exception, e:
            print Exception, “:”, e
            traceback.print_exc()

   
       

























































       

 

注:为了更方便的编写python代码,推荐使用PyCharm IDE,编辑代码跟Java一样方便。

 

七、参考资料:

1)官网 http://appium.io/index.html

2)appium/python-client使用文档https://github.com/appium/python-client

3)搭建appium的android环境http://www.cnblogs.com/qiaoyeye/p/5131382.html

4)Appium移动自动化测试(四)http://www.cnblogs.com/fnng/p/4579152.html

5)AppiumPython API http://blog.csdn.net/crisschan/article/details/

6)appium常用方法总结 http://www.cnblogs.com/fanxiaojuan/p/4882676.html

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/227951.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午8:08
下一篇 2026年3月16日 下午8:08


相关推荐

  • YUI Compressor插件压缩后war中的js/css文件未压缩的解决方法(被maven打包顶替了)

    YUI Compressor插件压缩后war中的js/css文件未压缩的解决方法(被maven打包顶替了)YUICompressorMaven插件可以压缩/合并js或css文件,经常用在Maven项目中,但最近发现在wabapp中执行了mvninstall命令进行发布之后,终端中显示插件已经执行了压缩的动作,但在输出文件夹或者war包中js和css文件都还是未压缩的原始文件。这样执行mvninstall命令之后发现虽然执行了压缩任务,但是在目标目录下和war包中的js和css…

    2022年7月18日
    24
  • CRC校验码的计算

    CRC校验码的计算循环冗余检验的原理 在发送端 先把数据划分为组 假定每组 k 个比特 假定一个待传送的数据 M k 位 CRC 运算就是在数据 M 的后面添加供差错检测用的 n 位冗余码 然后构成一个帧发送出去 一共发送 k 1 位 在所要发送的数据后面增加 n 位的冗余码 虽然增大了数据传输的开销 但却可以进行差错检测 当传输可能出现差错时 付出这种代价往往是很值得的 下面通过一个具体的例子来进行分析计算 例 要发送的数据为

    2026年3月19日
    2
  • 股票实盘交易接口API(招商证券交易接口api)

    股票配资系统实盘交易接口怎么做有没有好用的实盘交易接口股票实盘交易接口做股票配资系统难免会用到交易接口,好用的能用的接口也少。券商那边也不提供,那索性自己开发股票配资实盘交易接口了。经过多次尝试,总算搞出来了,实时交易接口可以获取用户数据,实时对接,账户信息,委托买入卖出,支持多家券商。我们做股票配资系统的时候遇到过很多次交易接口问题,然后后面终于是解决了,现在我们的股票配资系统已经很完善…

    2022年4月15日
    581
  • python自动炒股软件下载_python自动股票交易软件

    python自动炒股软件下载_python自动股票交易软件获取数据是数据分析中必不可少的一部分,而网络爬虫是是获取数据的一个重要渠道之一。鉴于此,我拾起了Python这把利器,开启了网络爬虫之路。本篇使用的版本为python3.5,意在抓取证券之星上当天所有A股数据。程序主要分为三个部分:网页源码的获取、所需内容的提取、所得结果的整理。一、网页源码的获取很多人喜欢用python爬虫的原因之一就是它容易上手。只需以下几行代码既可抓取大部分网页的源码。imp…

    2022年6月19日
    44
  • 讲解最到位的粒子群算法,附matlab代码求解函数最优值

    讲解最到位的粒子群算法,附matlab代码求解函数最优值从鸟群觅食行为到粒子群算法粒子群算法的核心例:求解函数最小值粒子群算法的驱动因素从鸟群觅食行为到粒子群算法鸟群寻找食物的过程中,鸟与鸟之间存在着信息的交换,每只鸟搜索目前离食物最近的鸟的周围区域是找到食物的最简单有效的办法。粒子群算法(以下简称PSO)就是模拟鸟群觅食行为的一种彷生算法。解=粒子=鸟(鸟的位置象征着离食物的距离,粒子的位置也象征着…

    2022年5月31日
    70
  • C语言大数运算-大数运算库篇

    C语言大数运算-大数运算库篇前言 通过前面的 3 篇文章我们已经实现了大数的四则运算 本篇博客我们会把这是几个个方法做成一个库文件 可以供自己日后使用 细心的读者可能意到了 每个程序都引用了 big h 但是都被注释掉了 big h 就是头文件只要将函数的声明放到该文件中 然后在其它程序中引用该文件就可以使用大数运算的方法 重复的代码我就不再写了 其实有了算法你们自己就可以实现 所以我就简单的说几句 文件命名 头文件 b

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号