python+unittest在dos命令行加入參數運行用例


 

在python里使用unittest寫好用例后,想用一個批處理文件去雙擊即可運行,而且還想在批處理里面設置用例要傳人的參數怎么辦呢?

下面是我的解決辦法:

1、在用例里面用sys.argv來設置

 

# -*- coding: utf-8 -*-
import json
import unittest
import time
from appium import webdriver
#from HtmlTestRunner import HTMLTestRunner
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.action_chains import ActionChains
import sys
reload(sys)
sys.setdefaultencoding('utf8')

startime=time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
argv=sys.argv
print(argv)
if len(argv) >1 :

    waittime = argv[1]   #批處理輸入參數1
    if len(argv) >2 :
        login=argv[2]
        print(type(login))
        login = json.loads(login)
        if len(argv) >3 :
            noReset=argv[3]
        else:
            noReset = True
    else:
        login = {
            "username": "xxxxxx",
            "userpwd": "xxxx",
            "newsever": "http://IP:port/agent_client"
        }
else:
    waittime=5

class LotteryTests(unittest.TestCase):
    def setUp(self):
        #初始化測試平台
        desired_caps = {
            'platformName': 'Android',      #移動操作平台
            'platformVersion': '4.4.2',  # 移動操作系統版本
            'newCommandTimeout': '3600',  # 自定義超時時間
            'deviceName': '127.0.0.1:52001',  # 設備名稱
            'appPackage': 'com.dgcy.pasx',  # 測試APP的包名
            'app': 'E://example_android.apk',
            'appActivity': 'com.dgcy.ui.activity.StartTicketsActivity',  # 要從包中啟動的Android活動的活動名稱
            'automationName': 'Appium',  # 自動化引擎
            # 'unicodeKeyboard':True,
            # 'resetKeyboard':True,
            'noReset': noReset,
            'chromeOptions': {'androidProcess': 'com.dgcy.paysx'}
        }
        print(startime+': 打開APP...'.decode("utf-8"))
        self.driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',desired_caps)
        time.sleep(5)


    def isElementExist(self, locator):
        """
        locator: locator輸入規則:元素屬性名=元素屬性值,如果是id則以"id=xxx",如果是css則以“css=xxx”等,例如:id=com.dgcy.paysx:id/monitor_t;css=div.popup-content;
        xpath=//div[text()='刪除成功'];name=myna;class=mmv;link=登錄;
        :return: 布爾值
        """
        list=locator.split('=')
        flag = True
        driver = self.driver

        try:
            if list[0] == "id":
                driver.find_element_by_id(list[1])
            elif list[0] == "xpath":
                driver.find_element_by_xpath(list[1])
            elif list[0] == "name":
                driver.find_element_by_namne(list[1])
            elif list[0] == "css":
                driver.find_element_by_css_selector(list[1])
            elif list[0] == "class":
                driver.find_element_by_class_name(list[1])
            elif list[0] == "tag":
                driver.find_element_by_tag_name(list[1])
            elif list[0] == "link":
                driver.find_element_by_link_text(u"%s" % list[1])
            return flag
        except:
            flag = False
            return flag

    def login(self): #打開app並判斷是否自動登錄
        print("Start test1...open application")
        time.sleep(2)
        #判斷是否需要登錄
        driver = self.driver
        assertelement=LotteryTests.isElementExist(self,"id=com.dgcy.paysx:id/monitor_t")
        if not assertelement:
            loging = driver.find_element_by_id("com.dgcy.paysx:id/login_submit").text
            try:
                assert '登錄'.decode("utf-8") in loging     #檢測到登錄按鈕
                print("檢測到登錄按鈕,重新登錄....".decode("utf-8"))
                #輸入用戶名
                driver.find_element_by_id("com.dgcy.paysx:id/loginUserName").send_keys(login["username"])
                #輸入密碼
                driver.find_element_by_id("com.dgcy.paysx:id/loginPwd").send_keys(login["userpwd"])
                #輸入服務器設置
                driver.find_element_by_id("com.dgcy.paysx:id/fwurl").send_keys(login["newsever"])
                time.sleep(1)
                #點擊登錄
                driver.find_element_by_id("com.dgcy.paysx:id/login_submit").click()
            except AssertionError as e:
                print("未檢測到登錄按鈕....".decode("utf-8"))
        else:
            print("已登錄在APP首頁".decode("utf-8"))
        time.sleep(2)

    def test_03_allTicket(self,timewait=waittime):
        # 檢測‘運營監控’
        timewait=int(timewait)
        driver = self.driver
        assertelement = LotteryTests.isElementExist(self, "id=com.dgcy.paysx:id/monitor_t")
        if assertelement:
            firstPage = driver.find_element_by_id("com.dgcy.paysx:id/monitor_t").text
            # 添加斷言是否顯示“運營監控”
            try:
                assert '運營監控'.decode("utf-8") in firstPage
                print("Login User is Right!")
            except AssertionError as e:
                print('loginUser is Error')
                self.login()  # 非‘運營監控’則重新登錄
        else:
            self.login()
        driver.find_element_by_id("com.dgcy.paysx:id/monitor_t").click()  # 點擊運營監控
        WebDriverWait(driver, timewait).until(lambda x: x.find_element_by_id("com.dgcy.paysx:id/rb_all"))  # 等待顯示所有數據
        print("正在每隔".decode("utf-8")+str(timewait)+"s循環獲取到所有設備的狀態.....".decode("utf-8"))
        driver.find_element_by_id('com.dgcy.paysx:id/rb_all').click()  # 點擊‘全部’
        while True:
            driver.find_element_by_id('com.dgcy.paysx:id/rb_all').click()  # 點擊‘全部’
            time.sleep(timewait)
            assertelement = LotteryTests.isElementExist(self, "id=com.dgcy.paysx:id/monitor_t")
            if assertelement == False:
                raise ValueError("elm:(com.dgcy.paysx:id/monitor_t) is not exist!")

            #print("等待了"+str(timewait)+"s,獲取到所有設備的狀態.....")

    def tearDown(self):
        self.driver.quit()

if __name__ == '__main__':
    #構造測試套件
    
    unittest.main()

 

 

 

2、寫批處理文件test.bat

::后面的數字為等待時間,如果不輸入則默認為5s,如果是需要輸入用戶名密碼重新登錄請把最后面的True改為False,最后一個參數如果是True或不填表示不需要輸入用戶名密碼重新登錄
python C:\Users\用戶名\PycharmProjects\XAJK\SX-lottery.py 10 {\"username\":\"xxxxx\",\"userpwd\":\"xxxxx\",\"newsever\":\"http://ip:port/agent_client\"} False
pause

3、還需要修改unittest里面的main.py文件

因為unittest原本就沒有想過要做批處理里加參數運行,所以要想成功必須得修改一下C:\Python27\Lib\unittest\main.py源碼:

在93行后面加入一下代碼:

    if len(argv)>1:
            argv=argv[:1]

 

 

 修改完畢,運行自己編寫的test.py,成功!


免責聲明!

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



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