轉:https://blog.csdn.net/Tigerdong1/article/details/80159156
前段時間用一種流行語言,一個主流工具,一個實用框架,寫了一個美團app自動化測試的Demo,利用appium+python+unittest+uiautomatorviewer,編寫了測試用例,並通過HTMLTestRunner輸出測試報告。Appium環境搭建的過程就不說了(這種內容百度一搜一大把)。我是利用uiautomatorviewer進行元素定位的,當然如果比較簡單也可以用appium-desktop自帶功能的進行元素定位。下面是面向過程對美團APP進行自動化測試的一個Demo:from appium import webdriver
import time
import time
desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '4.4.2'
desired_caps['deviceName'] = '127.0.0.1:62001'
desired_caps['appPackage'] = 'com.sankuai.meituan'
desired_caps['appActivity'] = '.activity.MainActivity'
desired_caps['autoAcceptAlerts'] = 'True' # 自動確認彈窗
desired_caps['unicodeKeyboard'] = 'True' #處理無法輸入中文的問題,使用unicodeKeyboard的編碼方式來發送字符串
desired_caps['resetKeyboard'] = 'True' #將鍵盤給隱藏起來
d = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '4.4.2'
desired_caps['deviceName'] = '127.0.0.1:62001'
desired_caps['appPackage'] = 'com.sankuai.meituan'
desired_caps['appActivity'] = '.activity.MainActivity'
desired_caps['autoAcceptAlerts'] = 'True' # 自動確認彈窗
desired_caps['unicodeKeyboard'] = 'True' #處理無法輸入中文的問題,使用unicodeKeyboard的編碼方式來發送字符串
desired_caps['resetKeyboard'] = 'True' #將鍵盤給隱藏起來
d = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
time.sleep(3) # app啟動后等待3秒,方便元素加載完成
d.find_element_by_id('com.sankuai.meituan:id/citylist_search').send_keys('深圳')
time.sleep(3)
d.find_element_by_id('com.sankuai.meituan:id/citylist_textview').click()
time.sleep(3)
d.tap([(75, 400)])
time.sleep(3) # 臨時取消彈框
d.tap([(0,270),(180,450)],500)
time.sleep(3) # 定位元素美食,按住500毫秒
d.tap([(218,406)]) # 定位商家
time.sleep(2)
d.tap([(191,654)]) # 查看商品詳情
time.sleep(2)
d.find_element_by_id("com.sankuai.meituan:id/buy").click() #立即購買
d.find_element_by_id("com.sankuai.meituan:id/mobile").send_keys("15623512919") # 輸入手機號
d.find_element_by_id("com.sankuai.meituan:id/get_code").click() # 獲取驗證碼
#異常處理(解決有時候需要輸入圖片驗證碼,有時候又不需要輸入的問題)
try:
print('請輸入圖片驗證碼')
picutrecode = input()
d.find_element_by_id('com.sankuai.meituan:id/captcha').send_keys(picutrecode)
d.find_element_by_class_name('android.widget.Button').click()
time.sleep(5)
except:
print('請輸入短信驗證碼')
code = input()
d.find_element_by_id('com.sankuai.meituan:id/code').send_keys(code)
d.find_element_by_id('com.sankuai.meituan:id/submit').click()
else:
print('在輸入圖片驗證碼后,請再次輸入短信驗證碼')
code = input()
d.find_element_by_id('com.sankuai.meituan:id/code').send_keys(code)
d.find_element_by_id('com.sankuai.meituan:id/submit').click()
print('程序運行正常')
time.sleep(2)
# 通過查找不到元素從而報錯來判斷是否登錄成功(相當於斷言)
try:
d.find_element_by_id('com.sankuai.meituan:id/submit').click()
print('登錄下單成功啦')
except:
d.find_element_by_id('android:id/button1').click()
print('登錄失敗啦')
d.get_screenshot_as_file(u'F:\自動化截圖\美團.png') #是否登錄成功截圖備注:第一個異常處理,主要是因為輸入手機號后,點擊獲取驗證碼,可能會讓你直接輸入短信驗證碼,也可能需要你輸入圖片驗證碼后再次輸入短信驗證碼,所以用了try-except-else來規避這個問題,當try下面語句報錯(也就是不用輸入圖片驗證碼時),直接執行except中的內容(直接輸入短信驗證碼),當try下面語句未報錯時(也就是輸入圖片驗證碼后需要再次輸入短信驗證碼時),try下面語句執行完后,繼續執行else語句(輸入短信驗證碼的過程)。因為try語句未報錯時候,將不會執行except語句,所以需要加else語句。將面向過程的Demo封裝成類與函數,如下所示:import unittest
from appium import webdriver
from time import sleep
d.find_element_by_id('com.sankuai.meituan:id/citylist_search').send_keys('深圳')
time.sleep(3)
d.find_element_by_id('com.sankuai.meituan:id/citylist_textview').click()
time.sleep(3)
d.tap([(75, 400)])
time.sleep(3) # 臨時取消彈框
d.tap([(0,270),(180,450)],500)
time.sleep(3) # 定位元素美食,按住500毫秒
d.tap([(218,406)]) # 定位商家
time.sleep(2)
d.tap([(191,654)]) # 查看商品詳情
time.sleep(2)
d.find_element_by_id("com.sankuai.meituan:id/buy").click() #立即購買
d.find_element_by_id("com.sankuai.meituan:id/mobile").send_keys("15623512919") # 輸入手機號
d.find_element_by_id("com.sankuai.meituan:id/get_code").click() # 獲取驗證碼
#異常處理(解決有時候需要輸入圖片驗證碼,有時候又不需要輸入的問題)
try:
print('請輸入圖片驗證碼')
picutrecode = input()
d.find_element_by_id('com.sankuai.meituan:id/captcha').send_keys(picutrecode)
d.find_element_by_class_name('android.widget.Button').click()
time.sleep(5)
except:
print('請輸入短信驗證碼')
code = input()
d.find_element_by_id('com.sankuai.meituan:id/code').send_keys(code)
d.find_element_by_id('com.sankuai.meituan:id/submit').click()
else:
print('在輸入圖片驗證碼后,請再次輸入短信驗證碼')
code = input()
d.find_element_by_id('com.sankuai.meituan:id/code').send_keys(code)
d.find_element_by_id('com.sankuai.meituan:id/submit').click()
print('程序運行正常')
time.sleep(2)
# 通過查找不到元素從而報錯來判斷是否登錄成功(相當於斷言)
try:
d.find_element_by_id('com.sankuai.meituan:id/submit').click()
print('登錄下單成功啦')
except:
d.find_element_by_id('android:id/button1').click()
print('登錄失敗啦')
d.get_screenshot_as_file(u'F:\自動化截圖\美團.png') #是否登錄成功截圖備注:第一個異常處理,主要是因為輸入手機號后,點擊獲取驗證碼,可能會讓你直接輸入短信驗證碼,也可能需要你輸入圖片驗證碼后再次輸入短信驗證碼,所以用了try-except-else來規避這個問題,當try下面語句報錯(也就是不用輸入圖片驗證碼時),直接執行except中的內容(直接輸入短信驗證碼),當try下面語句未報錯時(也就是輸入圖片驗證碼后需要再次輸入短信驗證碼時),try下面語句執行完后,繼續執行else語句(輸入短信驗證碼的過程)。因為try語句未報錯時候,將不會執行except語句,所以需要加else語句。將面向過程的Demo封裝成類與函數,如下所示:import unittest
from appium import webdriver
from time import sleep
class MeituanTest(unittest.TestCase):
#手機初始化進入APP
def setUp(self):
print('開始跑用例啦--setup')
desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '4.4.2'
desired_caps['deviceName'] = '127.0.0.1:62001'
desired_caps['appPackage'] = 'com.sankuai.meituan'
desired_caps['appActivity'] = '.city.CityActivity'
desired_caps['unicodeKeyboard'] = 'True'
desired_caps['resetKeyboard'] = 'True'
self.d = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
sleep(3)
#手機初始化進入APP
def setUp(self):
print('開始跑用例啦--setup')
desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '4.4.2'
desired_caps['deviceName'] = '127.0.0.1:62001'
desired_caps['appPackage'] = 'com.sankuai.meituan'
desired_caps['appActivity'] = '.city.CityActivity'
desired_caps['unicodeKeyboard'] = 'True'
desired_caps['resetKeyboard'] = 'True'
self.d = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
sleep(3)
#選擇地區購買商品流程
def test_goshopping(self):
d = self.d
d.find_element_by_id('com.sankuai.meituan:id/citylist_search').send_keys('深圳')
sleep(3)
d.find_element_by_id('com.sankuai.meituan:id/citylist_textview').click()
sleep(3)
d.tap([(75, 400)])
sleep(3) # 臨時取消彈框
d.tap([(0, 270), (180, 450)], 500)
sleep(3) # 定位元素美食,按住500毫秒
d.tap([(218, 406)]) # 定位商家
sleep(2)
d.tap([(191, 654)]) # 查看商品詳情
sleep(2)
d.find_element_by_id("com.sankuai.meituan:id/buy").click() # 立即購買
d.find_element_by_id("com.sankuai.meituan:id/mobile").send_keys("15623512919") # 輸入手機號
d.find_element_by_id("com.sankuai.meituan:id/get_code").click() # 獲取驗證碼
# 異常處理(解決有時候需要輸入圖片驗證碼,有時候又不需要輸入的問題)
try:
print('請輸入圖片驗證碼')
picutrecode = input()
d.find_element_by_id('com.sankuai.meituan:id/captcha').send_keys(picutrecode)
d.find_element_by_class_name('android.widget.Button').click()
sleep(5)
except:
print('請輸入短信驗證碼')
code = input()
d.find_element_by_id('com.sankuai.meituan:id/code').send_keys(code)
d.find_element_by_id('com.sankuai.meituan:id/submit').click()
else:
print('在輸入圖片驗證碼后,請再次輸入短信驗證碼')
code = input()
d.find_element_by_id('com.sankuai.meituan:id/code').send_keys(code)
d.find_element_by_id('com.sankuai.meituan:id/submit').click()
print('程序運行正常')
sleep(2)
# 通過查找不到元素從而報錯來判斷是否登錄成功(相當於斷言)# 是否登錄成功校驗
try:
d.find_element_by_id('com.sankuai.meituan:id/submit').click()
print('登錄下單成功啦')
except:
d.find_element_by_id('android:id/button1').click()
print('登錄失敗啦')
d.get_screenshot_as_file(u'F:\自動化截圖\美團.png') # 是否登錄成功截圖
def test_goshopping(self):
d = self.d
d.find_element_by_id('com.sankuai.meituan:id/citylist_search').send_keys('深圳')
sleep(3)
d.find_element_by_id('com.sankuai.meituan:id/citylist_textview').click()
sleep(3)
d.tap([(75, 400)])
sleep(3) # 臨時取消彈框
d.tap([(0, 270), (180, 450)], 500)
sleep(3) # 定位元素美食,按住500毫秒
d.tap([(218, 406)]) # 定位商家
sleep(2)
d.tap([(191, 654)]) # 查看商品詳情
sleep(2)
d.find_element_by_id("com.sankuai.meituan:id/buy").click() # 立即購買
d.find_element_by_id("com.sankuai.meituan:id/mobile").send_keys("15623512919") # 輸入手機號
d.find_element_by_id("com.sankuai.meituan:id/get_code").click() # 獲取驗證碼
# 異常處理(解決有時候需要輸入圖片驗證碼,有時候又不需要輸入的問題)
try:
print('請輸入圖片驗證碼')
picutrecode = input()
d.find_element_by_id('com.sankuai.meituan:id/captcha').send_keys(picutrecode)
d.find_element_by_class_name('android.widget.Button').click()
sleep(5)
except:
print('請輸入短信驗證碼')
code = input()
d.find_element_by_id('com.sankuai.meituan:id/code').send_keys(code)
d.find_element_by_id('com.sankuai.meituan:id/submit').click()
else:
print('在輸入圖片驗證碼后,請再次輸入短信驗證碼')
code = input()
d.find_element_by_id('com.sankuai.meituan:id/code').send_keys(code)
d.find_element_by_id('com.sankuai.meituan:id/submit').click()
print('程序運行正常')
sleep(2)
# 通過查找不到元素從而報錯來判斷是否登錄成功(相當於斷言)# 是否登錄成功校驗
try:
d.find_element_by_id('com.sankuai.meituan:id/submit').click()
print('登錄下單成功啦')
except:
d.find_element_by_id('android:id/button1').click()
print('登錄失敗啦')
d.get_screenshot_as_file(u'F:\自動化截圖\美團.png') # 是否登錄成功截圖
def tearDown(self):
sleep(2)
self.d.quit()
if __name__ == "__main__":
unittest.main()接下來就是把編寫好的測試用例執行,利用HTMLTestRunner生成測試報告:
import unittest,time
from HTMLTestRunner import HTMLTestRunner
sleep(2)
self.d.quit()
if __name__ == "__main__":
unittest.main()接下來就是把編寫好的測試用例執行,利用HTMLTestRunner生成測試報告:
import unittest,time
from HTMLTestRunner import HTMLTestRunner
if __name__ == "__main__":
test_dir = (r'F:\appiumtest')
discover = unittest.defaultTestLoader.discover(test_dir,'*case.py')
testReportDir = (r'F:\report')
nowTime = time.strftime("%Y-%m-%d-%H_%M_%S",time.localtime())
fileName = nowTime+".html"
report_Name = testReportDir+fileName
fp = open(report_Name,"wb")
runner = HTMLTestRunner(stream=fp,title="美團自動化測試報告",description="測試結果")
runner.run(discover)
fp.close()備注:discover=...是匹配以case結尾的文件(也就是編寫測試用例的文件)
---------------------
作者:Tigerdong1
來源:CSDN
原文:https://blog.csdn.net/Tigerdong1/article/details/80159156
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
test_dir = (r'F:\appiumtest')
discover = unittest.defaultTestLoader.discover(test_dir,'*case.py')
testReportDir = (r'F:\report')
nowTime = time.strftime("%Y-%m-%d-%H_%M_%S",time.localtime())
fileName = nowTime+".html"
report_Name = testReportDir+fileName
fp = open(report_Name,"wb")
runner = HTMLTestRunner(stream=fp,title="美團自動化測試報告",description="測試結果")
runner.run(discover)
fp.close()備注:discover=...是匹配以case結尾的文件(也就是編寫測試用例的文件)
---------------------
作者:Tigerdong1
來源:CSDN
原文:https://blog.csdn.net/Tigerdong1/article/details/80159156
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
