整体的项目结构如下:
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的文档,并发送邮件,附件如下: