自动化框架搭建(一)

基本路径如图:

然后贴一下代码:

#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.整体运行成功不报错

原文地址:https://www.cnblogs.com/keima/p/10537507.html