基本路径如图:
然后贴一下代码:
#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.整体运行成功不报错