【UI自動化】:基於python+selenium2的自動化測試項目實戰


整體的項目結構如下:

 

 

data:存放測試數據

report:imgae放測試截圖、reportdata存放測試生成的報告

test_case:models存放公用模塊的函數,page_obj存放頁面類;***_sta測試用例

run_test:執行入口

具體每個模塊的代碼:

driver.py(啟動瀏覽器)

from selenium.webdriver import Remote
from selenium import webdriver

def browser():
    driver = webdriver.Firefox()
    return driver


if __name__ == '__main__':
    dr = browser()
    dr.get("URL")
    dr.quit()

function.py(功能函數,插入圖片等)

from selenium import webdriver
import os


def insert_img(driver, file_name):
    base_dir = os.path.dirname(os.path.dirname(__file__))
    base_dir = str(base_dir)
    base_dir = base_dir.replace('\\', '/')
    base = base_dir.split('test_case')[0]
    file_path = base + "report/image/" + file_name
    driver.get_screenshot_as_file(file_path)

if  __name__ == '__main__':
    driver = webdriver.Firefox()
    driver.get("URL")
    insert_img(driver, 'insert_img')
    driver.quit()

 

myunit.py

from selenium import  webdriver
import sys
from .driver import browser
import unittest

class MyTest(unittest.TestCase):

    def setUp(self):
        self.driver = browser()
        self.driver.implicitly_wait(10)
        self.driver.maximize_window()

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

if __name__ == '__main__':
    unittest.main()

basePage.py(一些公用的頁面函數)

from time import sleep
class Page(object):

    jiance_url = 'URL'  #測試web的地址

    def __init__(self, selenium_driver, base_url=jiance_url, parent=None):
        self.base_url = base_url
        self.driver = selenium_driver
        self.timeout = 30
        self.parent = parent

    def _open(self, url):
        url = self.base_url + url
        self.driver.get(url)
        sleep(2)

    def find_element(self, *loc):
        return self.driver.find_element(*loc)

    def find_elements(self, *loc):
        return self.find_elements(*loc)

    def open(self):
        self._open(self.url)


    def on_page(self):
        return self.driver.current_url == (self.base_url + self.url)

    def script(self, src):
        return self.driver.execute_script(src)

loginpage.py

#from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from .basePage import Page
from time import sleep

class login(Page):

    url = '/#/login'

    login_username_loc = (By.XPATH, "//div[@id='main']/div/div/form/div/div/div/input")
    login_password_loc = (By.XPATH, "//input[@type='password']")
    login_button_loc = (By.XPATH, "//button[@type='button']")

    def login_username(self, username):
        self.find_element(*self.login_username_loc).clear()
        self.find_element(*self.login_username_loc).send_keys(username)


    def login_password(self, password):
        self.find_element(*self.login_password_loc).clear()
        self.find_element(*self.login_password_loc).send_keys(password)

    def login_button(self):
        self.find_element(*self.login_button_loc).click()

    def get_loginpage_handle(self):
        self.open()
        loginpage_handle = self.driver.current_window_handle
        return loginpage_handle

    def user_login(self, username="", password=""):
        self.open()
        self.login_username(username)
        self.login_password(password)
        self.login_button()
        sleep(2)


    #錯誤驗證
    #user_error_loc = (By.LINK_TEXT, u"")
    #user_login_success_loc = (By.XPATH, "/html/head/title")
    #title = self.driver.title()
    def user_login_success(self):
            #title = self.driver.title
            #return self.find_element(*self.user_login_success_loc).text
        return self.driver.title

login_sta.py(寫測試用例的py)

from time import sleep
import unittest
import sys
import time
from models import myunit
from models import function
from page_obj.loginPage import login
sys.path.append("./models")
sys.path.append("./page_obj")

class loginTest(myunit.MyTest):

    def user_login_verify(self, username="", password=""):
        login(self.driver).user_login(username, password)

    def test_login1(self):
        self.user_login_verify(username='username', password='password')
        po = login(self.driver)
        self.assertEqual(po.user_login_success(), u'檢測系統')
        now_time = time.strftime("%Y_%m_%d_%H_%M_%S")
        img_name = now_time + '.png'
        function.insert_img(self.driver, img_name)

if __name__ == '__main__':
    unittest.main()

run_test.py(執行入口)

import unittest
from HTMLTestRunner import HTMLTestRunner
import time
from email.mime.text import MIMEText
from email.header import Header
import smtplib
import os


# 發送測試報告,需要配置你的郵箱賬號。
def send_mail(file_new):
    mail_from = 'mail_from@qq.com'
    mail_to = 'mail_to@qq.com'
    f = open(file_new, 'rb')
    print(f)
    mail_body = f.read()
    f.close()
    print(mail_body)
    msg = MIMEText(mail_body, _subtype='html', _charset='utf-8')
    msg['Subject'] = u"自動化測試報告"
    smtp = smtplib.SMTP()
    smtp.connect('smtp.qq.com')
    smtp.login('mail_from@qq.com', 'mail_password')
    smtp.sendmail(mail_from, mail_to, msg.as_string())
    print(msg.as_string())
    smtp.quit()
    print('郵件已發送')


# 查找最新生成的測試報告
def get_new_file(files):
    lists = os.listdir(files)
    lists.sort(key=lambda fn: os.path.getmtime(files+"\\"+fn))
    file_ = os.path.join(files, lists[-1])
    print(file_)
    return file_


if __name__ == '__main__':
    test_app = "./"
    now_time = time.strftime("%Y_%m_%d_%H_%M_%S")
    fp = open(test_app+"/report/reportdata/"+now_time+"result.html", 'wb')
    runner = HTMLTestRunner(fp,
                            title="檢測系統測試報告",
                            description="運行環境:windows 10, firefox")
    discover = unittest.defaultTestLoader.discover(test_app+"/test_case", pattern='*_sta.py')
    runner.run(discover)
    file_path = get_new_file('./report/reportdata/')
    print(file_path)
    send_mail(file_path)

    fp.close()

執行后會在指定的路徑下生成一份html的文檔,並發送郵件,附件如下:

 


免責聲明!

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



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