Mac 下 appium 自动化测试 Android 测试配置和脚本编写(四)

Mac 下 appium +python 自动化测试系列:
Mac 下搭建 appium+ios+python 自动化测试环境(一)
Mac 下 appium 自动化测试iOS 测试配置和脚本编写(二)
Mac 下 搭建appium +android+python 自动化测试环境(三)
Mac 下 appium 自动化测试 Android 测试配置和脚本编写(四)

书接上回,我们把 android 的 appium 测试环境搭建好了之后,也该开始我们的 android 脚本的编写了!

  • 1.appium参数配置

首先,配置完 appium + python + android 的环境之后,我们 use 连接上安卓手机,开启终端输入以下命令:

adb devices

出现下图说明连接成功,可以开启 usb 调试模式了


获取连接的安卓机器

这时候我们启动 appium,开始配置参数


参数配置

这个时候就能调起我们需要测试的 apk 了
启动之后的首页图
  • 2.android的 py脚本编写
    万变不离其宗,android 的 py 脚本其实跟 iOS 的几乎一致,只是一些参数和元素查找的方式有些差点而已。废话不多说,直接上代码。
    desired_capabilities.py的代码如下:
#!/usr/bin/python
# -*- coding: UTF-8 -*-

def get_desired_capabilities():
    desired_caps = {
        "platformName": "Android",
        "platformVersion": "6.0.1",
        "udid": "b166ef99",
        "app": "/Users/xxxx/Desktop/appium自动化测试/AndroidTest-8.0.apk",
        "automationName": "Appium",
        "deviceName": "Galaxy A9",
        "newCommandTimeout": 60,
        "appWaitActivity": "com.ut.roidpt.engine.app.core.BootActivity",
        "unicodeKeyboard": True,
        "resetKeyboard": True,
        "autoGrantPermissions": True,
        "noReset": True


    }
    return desired_caps

def get_uri():
    return 'http://localhost:4723/wd/hub'

main.py的代码如下:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

from appium import webdriver

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import  expected_conditions as EC

import unittest

import time

from time import sleep

import desired_capabilities



class AndroidTest(unittest.TestCase):


    @classmethod
    def setUpClass(self):
        desired_cap = desired_capabilities.get_desired_capabilities()

        uri = desired_capabilities.get_uri()

        self.driver = webdriver.Remote(uri,desired_cap)


    @classmethod
    def tearDownClass(self):
        self.driver.quit()


    def leftSwipe(self):
        window_size = self.driver.get_window_size()
        self.driver.swipe(start_x=window_size["width"] * 0.8,
                          start_y=window_size["height"] * 0.5,
                          end_x=window_size["width"] * 0.1,
                          end_y=window_size["height"] * 0.5 )

    def wait_for_element(self,xpath=None, id=None, index=None, timeOut=20):
        startTime = time.time()
        nowTime = time.time()
        while nowTime - startTime < timeOut:
            try:
                if xpath is not None:
                    el = self.driver.find_element_by_xpath(xpath)
                    return el
            except:
                pass

            try:
                if id is not None:
                    if index is not None:
                        return self.driver.find_element_by_id(id)[index]
                    else:
                        return self.driver.find_element_by_id(id)
            except:
                pass

            sleep(1)

            nowTime = time.time()

        raise Exception("Element xpath[%s] id[%s] index[%s] is not found" % (xpath, id, index))


    def test_a_utFrame(self):

        print(self.driver.current_activity)
        self.wait_for_element(id="com.ut.androidtest:id/downloadBtn").click()

        time.sleep(8)
        circulation = 2

        while circulation > 0:
            time.sleep(1)
            self.leftSwipe()
            self.leftSwipe()


            self.wait_for_element(xpath="//*[@text='欢迎使用']").click()
            time.sleep(1)

            loginBtn = self.wait_for_element(xpath="//*[@text='登    录']")
            loginBtn.click()
            time.sleep(1)

            self.wait_for_element(xpath="//*[@text='XX申请']").click()
            time.sleep(1)

            item = self.wait_for_element(xpath="//android.widget.LinearLayout/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.ListView/android.widget.LinearLayout[1]")
            item.click()
            time.sleep(1)


            backBtn = self.wait_for_element(id="com.ut.androidtest:id/imageTextBt_imageBt")
            backBtn.click()
            time.sleep(.5)

            #系统返回键
            self.driver.press_keycode(keycode=4)
            time.sleep(1)

            self.wait_for_element(xpath="//*[@text='日志查询']").click()
            time.sleep(1.5)

            self.wait_for_element(xpath="//*[@text='录像日志']").click()
            self.wait_for_element(xpath="//*[@text='领用日志']").click()
            self.wait_for_element(xpath="//*[@text='归还日志']").click()
            self.wait_for_element(xpath="//*[@text='报警日志']").click()
            time.sleep(.5)

            self.wait_for_element(xpath="//*[@text='消息']").click()
            self.wait_for_element(xpath="//*[@text='首页']").click()
            self.wait_for_element(xpath="//*[@text='我']").click()
            time.sleep(1)

            updateBtn = self.wait_for_element(xpath="//*[@text='版本更新']")
            updateBtn.click()
            time.sleep(10)

            self.assertIsNotNone(self.wait_for_element(xpath="//*[@text='Hello world']"), "版本更新失败")

            circulation -= 1




if __name__=='__main__':
    suite = unittest.TestSuite()
    suite.addTest(AndroidTest("test_a_utFrame"))
    unittest.TextTestRunner(verbosity=2).run(suite)

里面参数和一些函数符号的具体意思可以参照(二)Mac 下 appium 自动化测试iOS 测试配置和脚本编写

这个时候我们就可以开始运行我们的脚本了!直接上图


main.py的执行结果

由于 mac 的安卓真机录屏的软件的原因,跟 appium 有冲突,只能存在一个,所以补录的图大概就是脚本的测试流程,主要测试版本更新的功能(好尴尬啊,感觉作假一样),上个 gif 的操作图吧!


main.py 的脚本运行流程

至此,我们 appium + python + android 的脚本测试基本就完成了!当然:真正的测试哪有这么简单,有些测试的测试用例可能高达几百几千个!我只是简单的介绍了大概的写法,想多了解自动化测试的可以看我以下参考的网页。 后续还会放出一些我认识测试的一系列简单文章

参考:

TesterHome这个是测试必逛的社区,很多问题我都是在这个社区翻出来得到帮助的!可惜我以前的测试小妹这么好的资源我没去找她帮忙,果然我这种老狗逼拉不下脸啊!

http://www.51testing.com/html/10/448910-3648852.html

appium +Python自动化 appium 常用元素定位法

Desired Capabilities Documentation
--appium capabilities 的参数详解

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342