精华内容
参与话题
问答
  • Appium

    千次阅读 2018-10-10 16:49:52
    使用Appium进行自动化测试 Appium简介 Appium是一个开源测试自动化框架,可用于原生,混合和移动Web应用程序测试。 它使用WebDriver协议驱动iOS,Android和Windows应用程序。 appium通过对布局的检测实现控件...

    使用Appium进行自动化测试

    Appium简介

    • Appium是一个开源测试自动化框架,可用于原生,混合和移动Web应用程序测试。
      它使用WebDriver协议驱动iOS,Android和Windows应用程序。

    • appium通过对布局的检测实现控件点击/滑动/输入等事件,因此需要定位控件位置非常精确,否则就会停止工作。

    • 支持多种语言,java、python、php、Ruby等等

    • 如果你有selenium经验,直接上手

    • 我们的电脑(client)上运行自动化测试脚本,调用的是webdriver的接口,appium server接收到我们client上发送过来的命令后他会将这些命令转换为UIautomator认识的命令,然后由UIautomator来在设备上执行自动化,由客户端(Appium Client)和服务器(Appium Server)两部分组成,客户端与服务器端通过JSON Wire Protocol进行通信。

    平台支持

    为什么使用appium

    在进行UI功能测试时,经常需要对某个test case重复进行以复现某个bug或检测功能是否稳定,一个test case通常包含某几个固定的点击/滑动/输入事件,如果使用自动化测试控制手机模拟test case中的操作,那么应该可以减少工作量。

    缺陷

    1. 自动化测试的最大弊端是沒有应对措施,appium可以重复进行操作,但是缺少灵活性,人为操作时可以进行精细化的控制,比如输入不同的文字/在等待的同时进行其他操作等等,因此appium只适合固定重复操作的场景。

    2. appium对手机的控制使用的是python脚本,因此需要再次开发。

    安装及配置环境

    参考

    环境依赖

    • Node.js
    • Appium
    • Appium-desktop
    • Appium-doctor
    • Appium-Python-Client
    • Python
    • JDK
    • Andriod SDK

    安装Node.js

    下载地址:https://nodejs.org/en/download/releases/

    Appium 安装

    npm install -g cnpm --registry=https://registry.npm.taobao.org
    
    cnpm install -g appium
    
    cnpm install appium@1.7.2 -g
    

    安装Appium-desktop

    下载地址:https://github.com/appium/appium-desktop/releases

    上面提到的问题可以使用前面我们已经介绍了Appium Server来解决,Appium-desktop工具其实也封装了Appium server和Node.js依赖环境。可以直接安装Appium-desktop就不需要重复安装上面的环境。

    python环境安装配置

    参考python官网或者使用Anaconda/MiniConda

    安装Appium-Python-Client

    通过命令: pip install Appium-Python-Client 进行安装。

    输入命令“from appium import webdriver” 回车,如果控制台没有报错,则说明安装成功。

    JDK安装配置

    jdk下载地址:

    http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

    jdk环境变量配置

    http://jingyan.baidu.com/article/624e74599e8ad834e8ba5a94.html

    Andriod sdk 安装

    下载地址:
    http://tools.android-studio.org/index.php/sdk

    安装 appium-doctor

    appium-doctor可以检测Appium整体依赖环境配置情况。

    cnpm install appium-doctor -g
    

    在控制台输入命令:appium-doctor 看到如下提示说明整体环境配置成功。

    C:\Users\Tao Zhou>appium-doctor
    info AppiumDoctor Appium Doctor v.1.4.3
    info AppiumDoctor ### Diagnostic starting ###
    info AppiumDoctor  ✔ The Node.js binary was found at: D:\Program Files\nodejs\node.exe
    info AppiumDoctor  ✔ Node version is 8.11.3
    info AppiumDoctor  ✔ ANDROID_HOME is set to: C:\Android\sdk
    info AppiumDoctor  ✔ JAVA_HOME is set to: C:\Program Files\Java\jdk1.8.0_171
    info AppiumDoctor  ✔ adb exists at: C:\Android\sdk\platform-tools\adb.exe
    info AppiumDoctor  ✔ android exists at: C:\Android\sdk\tools\android.bat
    info AppiumDoctor  ✔ emulator exists at: C:\Android\sdk\tools\emulator.exe
    info AppiumDoctor  ✔ Bin directory of %JAVA_HOME% is set
    info AppiumDoctor ### Diagnostic completed, no fix needed. ###
    info AppiumDoctor
    info AppiumDoctor Everything looks good, bye!
    info AppiumDoctor
    

    如果上面某一项显示为“X”则说明相关环境没有配置好,需要重新安装配置。

    Appium capability参数配置简介

    什么是Capability

    desired capability的功能是配置Appium会话。他们告诉Appium服务器您想要自动化的平台和应用程序。

    Desired Capabilities是一组设置的键值对的集合,其中键对应设置的名称,而值对应设置的值。(如:”platformName”: “Android”)Desired Capabilities主要用于通知Appium服务器建立需要的Session。

    Session

    Appium的客户端和服务端之间进行通信都必须在一个Session的上下文中进行。客户端在发起通信的时候首先会发送一个叫作“Desired Capabilities”的JSON对象给服务器。服务器收到该数据后,会创建一个session并将session的ID返回到客户端。之后客户端可以用该session的ID发送后续的命令。

    常用Capability配置

    Capability官方完整文档

    公用Capability
    在这里插入图片描述

    Android独有Capability

    avatar

    desired capability参数json

    • platformName - 设备平台
    • platformVersion - Android版本
    • deviceName - 真机是adb devices给出的id,模拟器是ip
    • appPackage - 应用的包
    • appActivity - 启动应用的activity
    • noReset - 不重置应用状态,默认为false,会导致应用清除数据

    {
    “platformName”: “Android”,
    “platformVersion”: “8.0.0”,
    “deviceName”: “d25bb163”,
    “appPackage”: “us.zoom.videomeetings”,
    “appActivity”: “com.zipow.videobox.LauncherActivity”,
    “noReset”: true
    }

    Inspector元素获取

    启动成功之后就可以使用 Inspector来进行元素空间获取了。

    注意:默认的元素定位有一些不准,需要切换到第二个坐标点定位选项后再切换回来才能准确定位。

    代码演示

    通过使用脚本可以实现循环发送消息的功能

    #coding=utf-8
    import os, subprocess
    from time import sleep
    
    import unittest
    
    from appium import webdriver
    from appium.webdriver.common.touch_action import TouchAction
    from appium.webdriver.connectiontype import ConnectionType
    
    class SimpleAndroidTests(unittest.TestCase):
        # 首先需要在setup中定义capability参数,和之前是差不多的,这里多了unicodeKeyboard和resetKeyboard是为了禁用输入法,便于后面使用sendkeys
        def setUp(self):
            desired_caps = {}
            desired_caps['unicodeKeyboard']='True'
            desired_caps['resetKeyboard']='True'
            desired_caps['platformName'] = 'Android'
            desired_caps['platformVersion'] = '8.0.0' # 8.0.0 / 6.0.1
            desired_caps['deviceName'] = 'd25bb163' # d25bb163 / 4200024cee07b3b3 / 3d22a523
    
            desired_caps['appPackage'] = 'us.zoom.videomeetings'
            desired_caps['appActivity'] = 'com.zipow.videobox.LauncherActivity'
            # desired_caps['app'] = r'C:\Users\Tao Zhou\zoom.5.1.25288.0824.apk'
            desired_caps['noReset'] = 'True'
    
            self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
    
        # 定义一个发送消息的方法,通过self.driver.find_element_by_xpath和self.driver.find_element_by_id找到布局按钮或输入框,
        # 使用self.driver.implicitly_wait(1)实现等待,因为某些布局加载需要时间,也可以使用异常捕捉来取代全局等待
        def sendMsg(self, msg = 'hahahhah'):
            
            self.driver.find_element_by_xpath('//android.widget.RelativeLayout[@content-desc="联系人选项卡。"]').click()
    
            self.driver.find_element_by_id('us.zoom.videomeetings:id/btnSearch').click()
            self.driver.implicitly_wait(1)
            
            self.driver.find_element_by_id('us.zoom.videomeetings:id/edtSearch').send_keys('tao')
            self.driver.implicitly_wait(1)
    
            self.driver.find_element_by_id('us.zoom.videomeetings:id/txtTitle').click()
            self.driver.implicitly_wait(3)
    
            self.driver.find_element_by_id('us.zoom.videomeetings:id/edtMessage').send_keys(msg)
            self.driver.implicitly_wait(1)
            
            self.driver.find_element_by_id('us.zoom.videomeetings:id/btnSend').click()
            self.driver.back()
            self.driver.back()
        
        # 所有以test开头的方法都视为一个用例,脚本会直接从这个方法进入,那么可以使用一个for循环执行发送消息20次
        def test_login(self):
    
            self.driver.implicitly_wait(5)
    
            self.driver.find_element_by_xpath('//android.widget.RelativeLayout[@content-desc="电话标签。"]').click()
    
            self.driver.find_element_by_xpath('//android.widget.RelativeLayout[@content-desc="联系人选项卡。"]').click()
    
            self.driver.implicitly_wait(2)
    
            self.driver.back()
            self.driver.implicitly_wait(2)
    
            for i in range(20):
                SimpleAndroidTests.sendMsg(self, "hahha %d" % i)
    
    if __name__ == '__main__':
        # deviceId = 'd25bb163'
        # subprocess.Popen("adb uninstall us.zoom.videomeetings")
        # appiumServer = subprocess.Popen("appium -U%s --no-reset" % deviceId, shell=True)
        # sleep(5)
        suite = unittest.TestLoader().loadTestsFromTestCase(SimpleAndroidTests)
        unittest.TextTestRunner(verbosity=2).run(suite)
    

    元素定位

    • id
    • name
    • class
    • List定位
    • 相对定位
    • Xpath定位
    • H5页面元素定位
    • Uiautomator定位

    一般常用xpath和id,定位比较准确,而且可以配合Inspector使用,直接找到对应的控件的id或xpath

    展开全文
  • appium

    2018-07-10 12:01:21
    APPium环境部署 安装appium之前要确定下自己要用的是语言是java语言还是python语言(此处我选择的是python): 了解Appium 安装包准备 安装步骤 了解APPium 简单介绍下appium Appium是一个开源、跨平台的...

    APPium环境部署

    安装appium之前要确定下自己要用的是语言是java语言还是python语言(此处我选择的是python):

    • 了解Appium
    • 安装包准备
    • 安装步骤

    了解APPium

    简单介绍下appium
    Appium是一个开源、跨平台的测试框架,可以用来测试原生及混合的移动端应用。Appium支持IOS、Android及FirefoxOS平台。Appium使用WebDriver的json wire协议,来驱动Apple系统的UIAutomation库、Android系统的UIAutomator框架。Appium对IOS系统的支持得益于Dan Cuellar’s对于IOS自动化的研究。Appium也集成了Selendroid,来支持老android版本。

    Appium支持Selenium WebDriver支持的所有语言,如java、Object-C、JavaScript、Php、Python、Ruby、C#、Clojure,或者Perl语言,更可以使用Selenium WebDriver的Api。Appium支持任何一种测试框架。如果只使用Apple的UIAutomation,我们只能用javascript来编写测试用例,而且只能用Instruction来运行测试用例。同样,如果只使用Google的UIAutomation,我们就只能用java来编写测试用例。Appium实现了真正的跨平台自动化测试。

    appium选择了client-server的设计模式。只要client能够发送http请求给server,那么的话client用什么语言来实现都是可以的,这就是appium及webdriver如何做到支持多语言的;


    展开全文
  • Appium使用教程_Android篇

    万次阅读 多人点赞 2016-05-16 16:40:39
    一、Appium介绍 Appium是一个开源的自动化测试工具,其支持iOS和安卓平台上的原生的,基于移动浏览器的,混合的应用。 1、Appium 理念 Appium是基于以下的四个理念设计来满足移动平台测试自动化的要求的: 1)您不...

     

    --by keeng2008@qq.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('123456')

    注意: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/50416860

     

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

    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/50416860

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

     

     

     

     

    展开全文
  • 想想看appium入门已经做了半个多月了,不说掌握所有的文章,但掌握百分之八十,一定就能达到入门的程度了 入门篇也是完结的时候了,进阶篇什么时候做呢就看时间吧,下一个系列先预定为selenium的入门篇(说不定,...

    想想看appium入门已经做了半个多月了,不说掌握所有的文章,但掌握百分之八十,一定就能达到入门的程度了

    入门篇也是完结的时候了,进阶篇什么时候做呢就看时间吧,下一个系列先预定为selenium的入门篇(说不定,可能鸽了

    这篇文章主要是考虑到有不少人问我在appium中的一些英文参数、关键字是什么意思,特地查询了些各种资料,自己整理了一番(后来才发现有官方文档

    第一类:【appium】appium自动化入门之环境搭建(上)

    第二类:【appium】appium自动化入门之API(上)

    书接上文:【appium】appium自动化入门之ios软件如何测试

    下文:估计没了

    这些天都在整合资料,appium进阶资料肯定是有的,需要的可以点击并输入暗号:CSDN在这里插入图片描述

    特别版 基本参数

    通用

    参数 描述 实例
    automationName 自动化测试引擎 Appium 或 Selendroid
    platformName 手机操作系统 iOS, Android, 或 FirefoxOS
    platformVersion 手机操作系统版本 如: 7.1, 4.4;ios 的 9.0
    deviceName 手机或模拟器设备名称 android 的 忽 略 , ios如 iPhoneSimulator
    app .ipa .apk 文件路径 比 如 /abs/path/to/my.apk 或 http://myapp.com/app.ipa
    browserName 启动手机浏览器 iOS 如 :Safari , Android 如:Chrome,Chromium,Browser
    newCommandTimeout 设置命令超时时间,单位: 秒。 比如 60
    autoLaunch Appium 是否需要自动安装 和启动应用。默认值 truetrue, false
    language (Sim/Emu-only) 设定模拟器 ( simulator / emulator ) 的语言。 如: fr
    locale (Sim/Emu-only) 设定模拟器 ( simulator / emulator ) 的 区域设置。 如: fr_CA
    udid ios 真机的唯一设备标识 如: 1ae203187fc012g
    orientation 设置横屏或竖屏 LANDSCAPE (横向) 或 PORTRAIT (纵向)
    autoWebview 直接转换到 WebView 上 下文。 默认值 false true, false
    noReset 不要在会话前重置应用状 态。默认值 false。 true, false
    fullReset (iOS) 删除整个模拟器目 录。(Android)通过卸载默认 值 false true, false

    Android 特有

    关键字 描述 实例
    appActivity 启动 app 包,一般点开头 如:.MainActivity, .Settings
    appPackage Android 应用的包名 比如 com.example.android.myApp
    appWaitActivity 等待启动的 Activity 名称 SplashActivity
    deviceReadyTime out 设置超时时间 5
    androidCoverage 用 于 执 行 测 试 的 instrumentation 类 com.my.Pkg/com.my.Pkg.instrumenta tion.MyInstrumentation
    enablePerforman ceLogging ( 仅 适 用 于 Chrome 和 webview) 开 启 Chromedriver 的 性 能 日 志。(默认 false) true, false
    androidDeviceRe adyTimeout 等待设备在启动应用后超 时时间,单位秒 如 30
    androidDeviceSo cket 开发工具的 socket 名称。 Chromedriver 把它作为开 发者工具来进行连接。 如 chrome_devtools_remote
    avd 需要启动的 AVD (安卓模 拟器设备) 名称。 如 api19
    avdLaunchTimeou t 以毫秒为单位,等待 AVD 启动并连接到 ADB 的超 时时间。(默认值 120000) 300000
    avdReadyTimeout 以毫秒为单位,等待 AVD 完成启动动画的超时时 间。(默认值 120000) 300000
    avdArgs 启动 AVD 时需要加入的 额外的参数。 如 -netfast
    useKeystore 使 用 一 个 自 定 义 的 keystore 来对 apk 进行重 签名。默认值 false true or false
    keystorePath 自定义 keystore 路径。默 认~/.android/debug.keystore 如 /path/to.keystore
    keystorePassword 自定义 keystore 的密码。 如 foo
    keyAlias key 的别名 如 androiddebugkey
    keyPassword key 的密码 如 foo
    chromedriverExe cutable webdriver 可执行文件的绝 对 路 径 应 该 用 它 代 替 Appium 自带的 webdriver) /abs/path/to/webdriver
    autoWebviewTime out 毫秒为单位,Webview 上 下文激活的时间。默认 2000 如 4
    intentAction 用于启动 activity 的 intent action 。 ( 默 认 值 android.intent.acti on.MAIN) 如 android.intent.action.MAIN, android.intent.action.VIEW
    intentCategory 用 于 启 动 activity 的 intent category。 (默认值 android.intent.cate gory.LAUNCHER) 如android.intent.category.LAUNCHER, android.intent.category.APP_CONTA CTS
    intentFlags 用于启动 activity 的标识 (flags) ( 默 认 值 0x10200000) 如 0x10200000
    optionalIntentA rguments 用于启动 activity 的额外 intent 参 数 。 如 --esn <EXTRA_KEY> <EXTRA_KEY> <EXTRA_BOOLEAN,_VAL-U-Ee>
    dontStopAppOnRe set 在使用 adb 启动应用时不 要停止被测应用的进 程。默认值: false true 或 false
    unicodeKeyboard 使用 Unicode 输入法。默 认值 false true 或 false
    resetKeyboard 重置输入法到原有状态, 默认值 false true 或 false
    noSign 跳过检查和对应用进行 debug 签名的步骤。默认 值 false true 或 false
    ignoreUnimporta ntViews 调用 uiautomator 的函数 这个关键字能加快测试执 行的速度。默认值 false true 或 false
    disableAndroidW atchers 关闭 android 监测应用无 响 ANR 和崩溃 crash 的监 视器默认值: false。 true 或者 false
    chromeOptions 允 许 传 入 chrome driver 使用的 chromeOptions 参 数 。 chromeOptions: {args: [‘–disable-popup-blocking‘]}

    iOS特有

    关键字 描述 实例
    calendarFormat (Sim-only) 为 iOS 的模拟 器设置日历格式 如 gregorian (公历)
    bundleId 被测应用的 bundle ID, 真机上执行测试时,你可 以不提供 app 关键字, 但你必须提供 udid 如 io.appium.TestApp
    udid 连接真机的唯一设备编 号 ( Unique device identifier ) 如 1ae203187fc012g
    launchTimeout 以 毫 秒 为 单 位 , 在 Appium 运行失败之前设 置一个等待 instruments 的时间 比如: 20000
    locationServicesEnabled (Sim-only) 强制打开或关 闭定位服务。默认值是保 持当前模拟器的设定 true 或 false
    locationServicesAuthorize d 使用这个关键字时,你同 时需要使用 bundleId 关键字来发送你的应用 的 bundle ID 。 true 或者 false
    autoAcceptAlerts 当 iOS 的个人信息访问 警告 (如 位置、联系人、 图片) 出现时,自动选择 接受( Accept )。默认值 false。 true 或者 false
    autoDismissAlerts 当 iOS 的个人信息访问 警告 (如 位置、联系人、 图片) 出现时,自动选择 不接受( Dismiss )。默认值 false。 true 或者 false
    nativeInstrumentsLib 使用原生 intruments 库 ( 即 关 闭 instruments-without-dela y ) true 或者 false
    nativeWebTap (Sim-only) 在 Safari 中允 许"真实的",默认值: false。注意: 取决于 viewport 大小/比例, 点 击操作不一定能精确地 点中对应的元素。 true 或者 false
    safariInitialUrl (Sim-only) (>= 8.1) Safari 的初始地址。默认值是一 个本地的欢迎页面 例 如 : https://www.github.com
    safariAllowPopups (Sim-only) 允 许 javascript 在 Safari 中创 建新窗口。默认保持模拟 器当前设置。 true 或者 false
    safariIgnoreFraudWarning (Sim-only) 阻 止 Safari 显示此网站可能存在风 险的警告。默认保持浏览器当前设置。 true 或者 false
    safariOpenLinksInBackgrou nd (Sim-only) Safari 是否允许 链接在新窗口打开。默认 保持浏览器当前设置。 true 或者 false
    keepKeyChains (Sim-only) 当 Appium 会话开始/结束时是否保 留 存 放 密 码 存 放 记 录 (keychains) ( 库 (Library)/ 钥匙串(Keychains)) true 或者 false
    localizableStringsDir 从哪里查找本地化字符 串。默认值 en.lproj en.lproj
    processArguments 通过 instruments 传递到 AUT 的参数 如 -myflag
    interKeyDelay 以毫秒为单位,按下每一 个按键之间的延迟时间。 如 100
    showIOSLog 是否在 Appium 的日志 中显示设备的日志。默认 值 false true 或者 false
    sendKeyStrategy oneByOne (一个接着一 个) 。真实设备默认值: grouped (分组输入)
    screenshotWaitTimeout 以秒为单位,生成屏幕截 图的最长等待时间。默认值: 10。 如5
    waitForAppScript 用于判断 "应用是否被启动“的iOS子哦的自动化脚本代码。默认情况下系统 等待直到页面内容非空。 结果必须是布尔类型。 例 如 true; target.elements().length, > 0;, $.delay(5000); true;

    一定要看

    以上就是appium的最后一节了,上述关键字觉得有用的记得收藏一下哦,英语好的也可以点击官方文档 去查看

    下次更新selenium工具的入门学习,一起学习的大家点个关注不迷路

    觉得有必要的小伙伴也可以点击并输入暗号:CSDN来一起交流学习,入门知识、进阶问题、前沿讨论都欢迎大家
    在这里插入图片描述

    展开全文
  • Appium Recipes

    2018-04-19 09:25:30
    Appium Recipes Appium Recipes Appium Recipes Appium Recipes
  • appium案例

    2018-06-29 09:22:37
    appium案例,很详细!appium案例,很详细!appium案例,很详细!
  • appium demo

    2019-01-11 15:04:58
    appium 代码示例,这里展示了怎么写一个appium的自动化实例
  • Appium Essentials

    热门讨论 2015-06-28 19:16:04
    Appium Essentials,appium的具体操作
  • Appium Desktop Appium Desktop is a suite of apps for Mac, Windows, and Linux which gives you the power of the Appium automation server in a beautiful and flexible UI. It is a combination of a few ...
  • appium+python解决每次appium启动都重新安装Appium Setting和Unlock和输入法
  • appium支持多种语言平台,这里给出java的小例子,并进行appium的原理分析
  • Appium源码

    2013-12-31 12:02:26
    Appium源码
  • Appium简介

    2019-02-28 13:09:37
    什么是Appium Appium是一个开源测试自动化框架,可用于原生,混合和移动Web应用程序测试。 它使用WebDriver协议驱动iOS,Android和Windows应用程序。 官方中文文档 Testerhome中文社区 Appium官网 Appium的优势 ...
  • appium——安装appium Server

    千次阅读 2019-05-17 15:54:57
    进入官网下载appium相应的版本 https://bitbucket.org/appium/appium.app/downloads/ 1.然后解压安装 2.配置环境变量 根据实际的安装位置 在path里添加C:\Program Files (x86)\Appium\node_modules.bin;%Appium_...
  • Appium文档

    2015-12-10 16:53:58
    Appium的Api文档,分享给大家,一起学习。
  • 安装Python3的Appium库 安装Android SDK 安装JDK 安装Appium 安装模拟器 编写测试脚本并生成测试报告 正文 一、安装Python3 直接登录Python官网https://www.python.org/,下载最新版本即可。 然后安装...
  • 前戏前面我们都是在cmd下通过输入appium加端口号来启动服务的,在我们做自动化的时候,我们当然不希望我们手动启动appium服务,而是希望通过脚本自动启动appium服务。我们可以使用subprocess模块,该模块可以创建新...
  • Appium安装

    2020-02-20 12:37:46
    Appium安装 1. 安装客户端包 pip install Appium-Python-Client 注:一般来说appium客户端安装时会自动卸载低版本selenium并安装匹配版本,若后续还是出现版本问题,建议升级下selenium,如下: pip install -U ...

空空如也

1 2 3 4 5 ... 20
收藏数 20,991
精华内容 8,396
关键字:

appium