Appium+python測試app實例


Appium和selenium差不到,只是一個用於測web,一個用於測APP。下面記錄一下我搭的測試框架,同樣是基於PO模式,用的unittest.

         最后測試報告如下:

 

 

 

1.1      代碼結構

 

 

         這個結構是不是很熟悉,都是基於PO模式,用的是unittest框架。

1.2      配置文件globalparameter.py

 

 1 # coding:utf-8
 2 __author__ = 'Helen'
 3 '''
 4 description:配置全局參數
 5 '''
 6 import time,os
 7 
 8 # 獲取項目路徑
 9 # project_path = os.path.abspath(os.path.join(os.path.dirname(os.path.realpath(__file__)[0]), '.'))
10 project_path = os.path.abspath(os.path.join(os.path.dirname(os.path.split(os.path.realpath(__file__))[0]), '.'))
11 # 測試用例代碼存放路徑(用於構建suite,注意該文件夾下的文件都應該以test開頭命名)
12 test_case_path = project_path+"\\src\\test_case"
13 # print u'日志路徑:'+log_path
14 # 測試報告存儲路徑,並以當前時間作為報告名稱前綴
15 report_path = project_path+"\\report\\"
16 report_name = report_path+time.strftime('%Y%m%d%H%S', time.localtime())
17 # 設置發送測試報告的公共郵箱、用戶名和密碼
18 smtp_sever = 'smtp.exmail.qq.com'  # 郵箱SMTP服務,各大運營商的smtp服務可以在網上找,然后可以在foxmail這些工具中驗正
19 email_name = "888@x88.com"  # 發件人名稱
20 email_password = "*888"  # 發件人登錄密碼
21 email_To = '888@qq.com;88@88.com'  # 收件人

 

 

1.3      配置文件driver_configure.py

 

 1 # coding:utf-8
 2 __author__ = 'Helen'
 3 '''
 4 description:driver配置
 5 '''
 6 from appium import webdriver
 7 
 8 
 9 class driver_configure():
10     def get_driver(self):
11         '''獲取driver'''
12         try:
13             self.desired_caps = {}
14             self.desired_caps['platformName'] = 'Android'  # 平台
15             self.desired_caps['platformVersion'] = '6.0'  # 系統版本
16             # self.desired_caps['app'] = 'E:/autotestingPro/app/UCliulanqi_701.apk'   # 指向.apk文件,如果設置appPackage和appActivity,那么這項會被忽略
17             self.desired_caps['appPackage'] = 'com.xsteach.appedu'     # APK包名
18             self.desired_caps['appActivity'] = 'com.qihoo.util.StartActivity'     # 被測程序啟動時的Activity
19             self.desired_caps['unicodeKeyboard'] = 'true'   # 是否支持unicode的鍵盤。如果需要輸入中文,要設置為“true”
20             self.desired_caps['resetKeyboard'] = 'true' # 是否在測試結束后將鍵盤重軒為系統默認的輸入法。
21             self.desired_caps['newCommandTimeout'] = '120' # Appium服務器待appium客戶端發送新消息的時間。默認為60秒
22             self.desired_caps['deviceName'] = '612QKBQD225A2'     # 手機ID
23             self.desired_caps['noReset'] = True # true:不重新安裝APP,false:重新安裝app
24             self.driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub",self.desired_caps)
25             return self.driver
26         except Exception,e:
27             raise e

 

 

1.4      公共類Base_page.py

 

# coding:utf-8
__author__ = 'Helen'
'''
description:UI頁面公共類
'''
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


class Base_page:
    def __init__(self,driver):
        self.driver = driver

    def find_element(self,*loc):
        '''重寫find_element方法,顯式等待'''
        try:
            WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located(loc))
            return self.driver.find_element(*loc)
        except Exception as e:
            raise e

    def send_keys(self,value,*loc):
        try:
            self.find_element(*loc).clear()
            self.find_element(*loc).send_keys(value)
        except AttributeError,e:
            raise e

 

 

1.5      公共類gesture_mainpulation

 

# coding:utf-8
__author__ = 'Helen'
'''
description:手勢操作
'''
class gesture_mainpulation:
    def swipe_left(self,driver):
        '''左滑'''
        x = driver.get_window_size()['width']
        y = driver.get_window_size()['height']
        driver.swipe(x*3/4,y/4,x/4,y/4)

    def swipe_right(self,driver):
        '''右滑'''
        x = driver.get_window_size()['width']
        y = driver.get_window_size()['height']
        driver.swipe(x/4,y/4,x*3/4,y/4)

    def swipe_down(self,driver):
        '''下滑'''
        x = driver.get_window_size()['width']
        y = driver.get_window_size()['height']
        driver.swipe(x/2,y*3/4,x/2,y/4)

    def swipe_up(self,driver):
        '''上滑'''
        x = driver.get_window_size()['width']
        y = driver.get_window_size()['height']
        driver.swipe(x/2,y/4,x/2,y*3/4)

 

 

1.6      公共類send_email

 

 1 # coding:utf-8
 2 __author__ = 'Helen'
 3 '''
 4 description:郵件發送最新的測試報告
 5 '''
 6 import os,smtplib,os.path
 7 from config import globalparameter as gl
 8 from email.mime.multipart import MIMEMultipart
 9 from email.mime.text import MIMEText
10 
11 
12 class send_email:
13     # 定義郵件內容
14     def email_init(self,report,reportName):
15         with open(report,'rb')as f:
16             mail_body = f.read()
17 
18         # 創建一個帶附件的郵件實例
19         msg = MIMEMultipart()
20         # 以測試報告作為郵件正文
21         msg.attach(MIMEText(mail_body,'html','utf-8'))
22         report_file = MIMEText(mail_body,'html','utf-8')
23         # 定義附件名稱(附件的名稱可以隨便定義,你寫的是什么郵件里面顯示的就是什么)
24         report_file["Content-Disposition"] = 'attachment;filename='+reportName
25         msg.attach(report_file) # 添加附件
26         msg['Subject'] = '88APP自動化測試報告:'+reportName # 郵件標題
27         msg['From'] = gl.email_name  #發件人
28         msg['To'] = gl.email_To  #收件人列表
29         try:
30             server = smtplib.SMTP(gl.smtp_sever)
31             server.login(gl.email_name,gl.email_password)
32             server.sendmail(msg['From'],msg['To'].split(';'),msg.as_string())
33             server.quit()
34         except smtplib.SMTPException:
35             self.mylog.error(u'郵件發送測試報告失敗 at'+__file__)
36 
37     def sendReport(self):
38         # 找到最新的測試報告
39         report_list = os.listdir(gl.report_path)
40         report_list.sort(key=lambda fn: os.path.getmtime(gl.report_path+fn) if not os.path.isdir(gl.report_path+fn) else 0)
41         new_report = os.path.join(gl.report_path,report_list[-1])
42         # 發送郵件
43         self.email_init(new_report,report_list[-1])

 

 

1.7      頁面事件login_page.py(只記錄一個,其他的都一樣)

 

 1 # coding:utf-8
 2 __author__ = 'Helen'
 3 '''
 4 description:登錄頁
 5 '''
 6 from src.common import Base_page
 7 from appium.webdriver.common import mobileby
 8 
 9 
10 class login_page(Base_page.Base_page):
11     by = mobileby.MobileBy()
12     etUser_loc = (by.ID,"com.xsteach.appedu:id/etUser")
13     etPws_loc = (by.ID,"com.xsteach.appedu:id/etPwd")
14     btnLogin_loc = (by.ID,"com.xsteach.appedu:id/btnLogin")
15 
16     def input_user(self,username):
17         self.send_keys(username,*self.etUser_loc)
18 
19     def input_Pws(self,password):
20         self.send_keys(password,*self.etPws_loc)
21 
22     def click_btnLogin(self):
23         self.find_element(*self.btnLogin_loc).click()

 

1.8      測試用例test_appium.py

 

 1 # coding:utf-8
 2 __author__ = 'Helen'
 3 '''
 4 description:測試登錄和退出功能
 5 '''
 6 import unittest
 7 
 8 from src.pages import index_page,myInfo_page,login_page,relative_page
 9 from src.common import gesture_manipulation
10 from config import driver_configure
11 
12 
13 class test_appium(unittest.TestCase):
14     @classmethod
15     def setUpClass(cls):
16         dconfigur = driver_configure.driver_configure()
17         cls.driver = dconfigur.get_driver()
18         cls.GM = gesture_manipulation.gesture_mainpulation()
19 
20     def test_01login(self):
21         '''測試登錄功能'''
22         # 主頁面
23         self.index_page = index_page.index_page(self.driver)
24         self.index_page.click_btnCancel()
25         self.GM.swipe_down(self.driver)
26         self.index_page.click_inXSTeach()
27         # 我在邢帥
28         self.myInfo_page = myInfo_page.myInfo_page(self.driver)
29         self.myInfo_page.click_login_btn()
30         # 登錄頁
31         self.login_page = login_page.login_page(self.driver)
32         self.login_page.input_user("lihailing@xsteqach.com")
33         self.login_page.input_Pws("123456")
34         self.login_page.click_btnLogin()
35         self.assertEqual(u'簽到',self.myInfo_page.getText_signHint())
36 
37     def test_02loginOut(self):
38         '''測試退出功能'''
39         self.myInfo_page = myInfo_page.myInfo_page(self.driver)
40         self.myInfo_page.click_relative()
41         self.relative = relative_page.relative_page(self.driver)
42         self.relative.click_tvLoginOut()
43         self.relative.click_btnYes()
44         self.assertEqual(u'點擊登錄',self.myInfo_page.getText_login())
45 
46     @classmethod
47     def tearDownClass(cls):
48         cls.driver.quit()
49 
50 if __name__=='__main__':
51     unittest.main()

 

 

1.9      執行測試runtest.py

 

# coding:utf-8
__author__ = 'Helen'
'''
description:執行測試
'''
import unittest,time,HTMLTestRunner
from config.globalparameter import test_case_path,report_name
from src.common import send_mail


# 構建測試集,包含src/test_case目錄下的所有以test開頭的.py文件
suite = unittest.defaultTestLoader.discover(start_dir=test_case_path,pattern='test*.py')

# 執行測試
if __name__=="__main__":
    report = report_name+"Report.html"
    fb = open(report,'wb')
    runner = HTMLTestRunner.HTMLTestRunner(
        stream=fb,
        title=u'88APP自動化測試報告',
        description=u'項目描述:生產環境'
    )
    runner.run(suite)
    fb.close()
    # 發送郵件
    time.sleep(10)  # 設置睡眠時間,等待測試報告生成完畢(這里被坑了==)
    email = send_mail.send_email()
    email.sendReport()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM