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 调试模式了

Mac 下 appium 自动化测试 Android 测试配置和脚本编写(四)_第1张图片

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

Mac 下 appium 自动化测试 Android 测试配置和脚本编写(四)_第2张图片

参数配置
这个时候就能调起我们需要测试的 apk 了

Mac 下 appium 自动化测试 Android 测试配置和脚本编写(四)_第3张图片

  • 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 测试配置和脚本编写(二)

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

Mac 下 appium 自动化测试 Android 测试配置和脚本编写(四)_第4张图片

main.py的执行结果

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

Mac 下 appium 自动化测试 Android 测试配置和脚本编写(四)_第5张图片

main.py 的脚本运行流程

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

你可能感兴趣的