3.自动获取设备、app信息

执行我们的测试用例我们发现,每次更换测试手机都要修改desired_caps的参数

import unittest
from time import sleep
from appium import webdriver

class Login(unittest.TestCase):

    def setUp(self):
        desired_caps = {}
        desired_caps['platformName'] = 'Android'
        desired_caps['platformVersion'] = '6.0'
        desired_caps['deviceName'] = 'Huawei'
        desired_caps['appPackage'] = 'com.happy.food'
        desired_caps['appActivity'] = 'com.happy.food.activity.LauncherActivity'
        desired_caps["unicodeKeyboard"] = True
        desired_caps["resetKeyboard"] = True

        url = "http://127.0.0.1:4723/wd/hub"

        global driver
        driver = webdriver.Remote(url,desired_caps)
        sleep(3)

    def test_login(self):
        EditText = driver.find_elements_by_class_name("android.widget.EditText")
        #获取所有的输入框
        EditText[0].send_keys("13410066133")
        EditText[1].send_keys("1234567a")
        driver.find_element_by_id("com.happy.food:id/login").click()
        sleep(3)

    def tearDown(self):
        driver.quit()

if __name__ == '__main__':
    unittest.main()

所以在这里我们写一个方法来自动获取设备信息、app信息等。

我们先了解怎么获取设备信息、APP信息

获取安卓等级
adb shell getprop ro.build.version.release

获取安卓机的型号
adb shell getprop ro.product.model

获取已连接的设备
adb devices

aapt dump badging+app包的路径,可以获取appPackage和appActivity,如:


红线部分就是appPackage

灰线部分就是appActivity

现在我们可以开始写我们的方法

#encoding:utf-8
import re
import subprocess

#app安装包的路径
appLocation = "//Users//yaulola//Public//appium-Android//app//android-debug.apk"

def get_desiredCaps():
    desired_caps = {}
    desired_caps['platformName'] = 'Android'
    desired_caps['platformVersion'] = platformVersion()
    desired_caps['deviceName'] = deviceName()
    desired_caps['appPackage'] = appPackage()
    desired_caps['appActivity'] = appActivity()
    desired_caps["unicodeKeyboard"] = True
    desired_caps["resetKeyboard"] = True
    return desired_caps

def url():
    u = "http://127.0.0.1:4723/wd/hub"
    return u

def deviceName():
    cmd = "adb devices"
    result = ""
    p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
                         stderr=subprocess.PIPE,
                         stdin=subprocess.PIPE, shell=True)
    (output, err) = p.communicate()
    if output != "":
        result = output.split()[4].decode()
    return result

def platformVersion():
    cmd = "adb shell getprop ro.build.version.release"
    result = ""
    p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
                         stderr=subprocess.PIPE,
                         stdin=subprocess.PIPE, shell=True)
    (output, err) = p.communicate()
    if output != "":
        result = output.split()[0].decode()
    return result

def deviceModel():
    cmd = "adb shell getprop ro.product.model"
    result = ""
    p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
                         stderr=subprocess.PIPE,
                         stdin=subprocess.PIPE, shell=True)
    (output, err) = p.communicate()
    if output != "":
        result = ''.join(output.decode().split())
    return result

def appPackage():
    cmd = "aapt dump badging "+appLocation
    result = ""
    p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
                         stderr=subprocess.PIPE,
                         stdin=subprocess.PIPE, shell=True)
    (output, err) = p.communicate()
    if output != "":
        #通过正则获取appPackage
        result = re.findall(r"name='(.+?)' versionCode",output.decode())[0]
    return result

def appActivity():
    cmd = "aapt dump badging "+appLocation
    result = ""
    p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
                         stderr=subprocess.PIPE,
                         stdin=subprocess.PIPE, shell=True)
    (output, err) = p.communicate()
    if output != "":
        #通过正则获取appActivity
        result = re.findall(r"name='(.+?)'  label",output.decode())[0]
    return result

我们暂时先把这个方法放在测试用例的同级目录,随便命名。这里我命名为common。

现在我们需要修改下我们的用例:

import unittest
from time import sleep
from appium import webdriver
import common

class Login(unittest.TestCase):

    def setUp(self):
        desired_caps = common.get_desiredCaps()
        url = common.url()
        global driver
        driver = webdriver.Remote(url,desired_caps)
        sleep(3)

    def test_login(self):
        EditText = driver.find_elements_by_class_name("android.widget.EditText")
        EditText[0].send_keys("13410066133")
        EditText[1].send_keys("1234567a")
        driver.find_element_by_id("com.happy.food:id/login").click()
        sleep(3)

    def tearDown(self):
        driver.quit()

if __name__ == '__main__':
    unittest.main()

现在再来运行一下用例:

/Users/yaulola/Public/appium-Android/venv/bin/python /Users/yaulola/Desktop/appium/test.py
.
----------------------------------------------------------------------
Ran 1 test in 45.980s

OK

Process finished with exit code 0

运行成功

你可能感兴趣的:(3.自动获取设备、app信息)