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 测试配置和脚本编写
这个时候我们就可以开始运行我们的脚本了!直接上图
由于 mac 的安卓真机录屏的软件的原因,跟 appium 有冲突,只能存在一个,所以补录的图大概就是脚本的测试流程,主要测试版本更新的功能(好尴尬啊,感觉作假一样),上个 gif 的操作图吧!
至此,我们 appium + python + android 的脚本测试基本就完成了!当然:真正的测试哪有这么简单,有些测试的测试用例可能高达几百几千个!我只是简单的介绍了大概的写法,想多了解自动化测试的可以看我以下参考的网页。 后续还会放出一些我认识测试的一系列简单文章
参考:
TesterHome:这个是测试必逛的社区,很多问题我都是在这个社区翻出来得到帮助的!可惜我以前的测试小妹这么好的资源我没去找她帮忙,果然我这种老狗逼拉不下脸啊!
http://www.51testing.com/html/10/448910-3648852.html
appium +Python自动化 appium 常用元素定位法
Desired Capabilities Documentation
--appium capabilities 的参数详解