执行我们的测试用例我们发现,每次更换测试手机都要修改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
运行成功