自动化框架搭建(一)
基本路径如图:

然后贴一下代码:
#driver.py
from selenium import webdriver
from selenium.webdriver import Remote
#启动浏览器驱动
def browser():
dc = {'browserName':'chrome'}
driver=Remote(command_executor='http://127.0.0.1:4444/wd/hub',
desired_capabilities =dc
)
return driver
if __name__=="__main__":
dr=browser()
dr.get("http://www.baidu.com/")
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+'/report/image/'+file_name
driver.get_sereenshot_as_file(file_name)
if __name__=='__main__':
driver=webdriver.Chrome()
driver.get('http://www.baidu.com/')
insert_img(driver,'baidu.jpg')
driver.quit()
#myunit.py
from selenium import webdriver
from driver import browser
import unittest
import os
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()
#base.py
class Page(object):
'''
页面基础类,用于所有页面继承
'''
bbs_url='。。。登陆网址。。。'
def __init__(self, selenium_driver, base_url=bbs_url, parent=None):
self.base_url = base_url
self.driver = selenium_driver
self.timeout = 30
self.parent = parent
def _oprn(self,url):
url = self.base_url+url
self.driver.get(url)
assert self.on_page() , 'Did not land on %s'%url
def find_element(self,*loc):
return self.driver.find_element(*loc)
def find_elements(self,*loc):
return self.driver.find_elements(*loc)
def open(self):
self._oprn(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)
#login_base.py
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium import webdriver
from .base import Page
from time import sleep
class Login(Page):
'''
用户登录界面
'''
url='/'
#Action
# bbs_login_user_loc=(By.XPATH,"//div[@title='海雾-镇守']")
# bbs_login_button_loc=(By.CLASS_NAME,"roll-nav")
user_login_success_loc = (By.CLASS_NAME, "font-bold")
login_null_loc = (By.CSS_SELECTOR,'[type*=red]')
# def bbs_login(self):
# self.find_element(*self.bbs_login_user_loc).click()
# sleep(1)
# self.find_element(*self.bbs_login_button_loc).click()
login_username_loc=(By.ID,"LoginName")
login_password_loc = (By.ID, "PassWord")
login_button_loc = (By.ID, "submit")
#登录用户名
def login_username(self,username):
self.find_element(*self.login_username_loc).send_keys(username)
# 登录密码
def login_password(self, password):
self.find_element(*self.login_password_loc).send_keys(password)
# 点击登录按钮
def login_button(self):
self.find_element(*self.login_button_loc).click()
#定义统一登录入口
def user_login(self,username="",password=""):
'''
用获取到的用户名密码登录
:param username:
:param password:
:return:
'''
self.open()
#self.bbs_login()
self.login_username(username)
self.login_password(password)
self.login_button()
sleep(1)
#用户名错误提示
def user_error_hint(self):
sleep(3)
return self.switch_to_alert().text
#用户名为空提示
def user_error_null(self):
sleep(3)
return self.find_element(*self.login_null_loc).text
# 密码错误提示
def pawd_erroe_hint(self):
sleep(3)
return self.switch_to_alert().text
#密码为空提示
def pawd_error_null(self):
sleep(3)
return self.find_element(*self.login_null_loc).text
#登录成功用户名
def user_login_success(self):
return self.find_element(*self.user_login_success_loc).text
#login_sta.py
from time import sleep
import unittest, random, sys
sys.path.append("./model")
sys.path.append("./page_obj")
from model import myunit, function,driver
from page_obj.login_page import Login
class loginTest(myunit.MyTest):
'''
登录测试
'''
#测试用户登录
def user_login_verify(self,username="",password=""):
Login(self.driver).user_login(username,password)
def test_login1(self):
'''
用户名,密码为空
:return:
'''
self.user_login_verify()
po = Login(driver)
self.assertEqual(po.user_error_null(),"请输入用户名!")
self.assertEqual(po.pawd_erroe_null(),"请输入密码!")
function.insert_img(self.driver,"user_pawd_empty.jpg")
def test_login2(self):
'''
用户名正确,密码为错误
:return:
'''
self.user_login_verify(username="15912345678",password="111111")
po = Login(self.driver)
self.assertEqual(po.pawd_erroe_hint(),"错误的帐号或密码")
function.insert_img(self.driver,"pawd_empty.jpg")
def test_login3(self):
'''
用户名为错误,密码正确
:return:
'''
self.user_login_verify(username='15911111111',password="123456")
po = Login(self.driver)
self.assertEqual(po.user_error_hint(), "错误的帐号或密码")
function.insert_img(self.driver,"user_empty.jpg")
def test_login4(self):
'''
用户名和密码不匹配
:return:
'''
self.user_login_verify(username='15987654321', password="123456")
po = Login(self.driver)
self.assertEqual(po.user_error_hint(),"错误的帐号或密码")
function.insert_img(self.driver,"user_pawd_error.jpg")
def test_login5(self):
'''
用户名、密码正确
:return:
'''
self.user_login_verify(username="15912345678",password="123456")
sleep(5)
po = Login(self.driver)
self.assertEqual(po.user_login_success(),"15912345678")
function.insert_img(self.driver,"login_success.jpg")
if __name__=="__main__":
unittest.main()
#run_bbs_test.py
from HTMLTestRunner import HTMLTestRunner
from email.mime.text import MIMEText
from email.header import Header
import smtplib
import unittest
import time
import os
#=================定义发送邮件===========================
def send_main(file_new):
f = open(file_new , 'rb')
mail_body = f.read()
f.close()
msg = MIMEText(mail_body , 'html' , 'utf-8' )
msg['Subject'] = Header ('自动化测试报告' , 'utf-8')
smtp = smtplib.SMTP()
smtp.connect("smtp.126.com")
smtp.login( "username@126.com" , "123456" )
smtp.sendmail("username@126.com" , "receive@126.com" , msg.as_string())
smtp.quit()
print("email has out ! ")
#=================查找最新测试报告===========================
def new_report(testreport):
lists = os.listdir(testreport)
lists.sort(key=lambda fn: os.path.getmtime(testreport + "\\" + fn))
file_new = os.path.join(testreport , lists[-1])
print(file_new)
return file_new
if __name__ == "__main__":
now = time.strftime("%Y-%m-%d %H_%M_%S")
filename = "./bbs/report/" + now + "result.html"
fp = open(filename , 'wb')
runner = HTMLTestRunner(stream = fp , title = "魅族社区自动化测试报告" , description = "环境 : Windows 7 浏览器 : Chrome")
discove = unittest.defaultTestLoader.discover("./bbs/test_case" , pattern="*_sta.py")
runner.run(discove)
fp.close() # 关闭生成的报告
file_path = new_report("./bbs/report") #查找新生的报告
send_main(file_path) #调用发邮件模块
目前未解决问题:
1.登陆账户或者密码为空时,提示语的捕捉尚未成功
2.密码或账户错误时,弹出的提示框的捕捉,驱动的带入问题
3.整体框架尚未吃透,理解还有欠缺
4.邮件模块未做调整,还存在问题
5.分布式搭建无法完成,不加上hub和node节点,单纯使用selenium_server是可以成功的
目前已解决问题:
1.分布式无法运行,解决方式:删去hub和node节点,直接运行在本机,待代码调试完成后再回头研究
2.参考的魅族社区设计已变更,根据测试网站的相应调整已结束,账号密码正确的成功登录已完成
3.web端元素的捕捉熟练度大大增长,find_element_by和BY.用法已经熟然于心
版本二目标:
1.整体运行成功不报错

浙公网安备 33010602011771号