python3+unittest+selenium自动化实战

selenium是一个针对web端项目的模拟鼠标和键盘操作的自动化测试工具,而unittest是一个自动化测试框架。
给web项目做UI自动化的主要目的,是为了验证业务流程的正确性。一些很细致的功能,单靠UI自动化的测试效果是不如手工测试的,甚至开发时间成本和维护成本比手工测试更高。因此,一般的UI自动化测试主要是用来验证项目的主要业务流程。比如一个商城系统,验证用户从进入商城网页浏览商品加入购物车提示登录并登录账户进入购物车结算付款这一系列操作的结果都正确无误。
在开始你的自动化项目之前,一定要先明确能够做、需要做的功能点。

项目结构

在这里插入图片描述

  • logs 存放日志文件
  • pageobject 将功能进行拆分,每一个功能模块写入一个py文件中,这样便于后续的管理和维护。在这里面的py文件,只写方法,不做测试断言。
  • testsuites 这里是统一放置测试用例的地方,在测试用例中对结果做处理和断言。
  • test_report 放置测试报告
  • testrunner.py 最后运行的是这个文件,测试用例扫描规则及报告生成都在这里面定义。

一、在pageobject中实现具体功能

联系我们这个功能为例,在pageobject下新建contact_us.py,代码如下:

from time import sleep


def Contact_us(self):
    try:
        dr = self.driver
        dr.get(self.base_url)
        #点击设置按钮
        dr.find_element_by_class_name("setting-button_setting-icon_jTEfn").click()
        #得到“联系我们”文本
        dr_contact_text = dr.find_element_by_xpath("//*[@id='guiPageWrapper']/div[1]/div[3]/div/div[1]/ul/li[3]/span").text
        print(dr_contact_text)
        #断言
        self.assertEqual("联系我们", dr_contact_text)
        #点击“联系我们”
        dr.find_element_by_xpath("//*[@id='guiPageWrapper']/div[1]/div[3]/div/div[1]/ul/li[3]/span").click()
        sleep(0.5)
        #获取“官方网址”文本
        contact_text01 = dr.find_element_by_xpath("//*[@id='guiPageWrapper']/div[1]/div[3]/div/div[2]/div[2]/p[1]/span/span").text
        #获取网址文本
        #contact_text02 = dr.find_element_by_xpath("//*[@id='guiPageWrapper']/div[1]/div[3]/div/div[2]/div[2]/p[1]/a").text
        contact_text02 = dr.find_element_by_class_name("setting-page_website-name_1E2O1").text
        print(contact_text01)
        print(contact_text02)
        self.assertEqual("官方网址", contact_text01)
        self.assertEqual("http://www.test.com", contact_text02)
       
        #获取官方交流群文本
        web_text01 = dr.find_element_by_xpath("//*[@id='guiPageWrapper']/div[1]/div[3]/div/div[2]/div[2]/p[2]/span[1]/span").text
        #获取QQ文本
        web_text02 = dr.find_element_by_xpath("//*[@id='guiPageWrapper']/div[1]/div[3]/div/div[2]/div[2]/p[2]/span[2]").text
        print(web_text01, web_text02)
        self.assertEqual("官方QQ交流群", web_text01)
        self.assertEqual("1234567890", web_text02)

    except:
        print("联系我们 模块有bug")

二、在testsuites下创建testcase

testsuites下创建test_contact.py,代码如下:

# -*- coding: utf-8 -*-
from selenium import webdriver
import unittest
import sys,os
sys.path.append((os.path.abspath(os.path.join(os.path.dirname(__file__), '../'))))
from pageobeject import Web_Init,Web_quit,Contact_us


class TestContact(unittest.TestCase):
    @classmethod
    def setUpClass(self):
        Web_Init(self)
    @classmethod
    def tearDownClass(self):
        Web_quit(self)
        #input()
    
    def test_01(self):
        Contact_us(self)

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

setUpClasstearDownClassunittest的前置和后置函数,保证在一个class中,运行case前执行一次setUpClass方法,当所有的case执行完成后,运行一次tearDownClass。我这里只有一个case,如果有多个,增加即可。因为执行case的顺序是按照函数名来的,因此可以直接用test_01,test_02这样的名字来控制case的执行顺序。
Web_Init,Web_quit函数定义在pageobject下的web_init.py中,代码如下:

from selenium import webdriver
import  os,sys
sys.path.append((os.path.abspath(os.path.join(os.path.dirname(__file__), './'))))
import logger

def Web_Init(self):
    self.driver = webdriver.Chrome()
    self.base_url = "https://ide.mindplus.top"
    self.base_use = "http://mindplus.dfrobot.top/"
    # 设置元素识别超时时间
    self.driver.implicitly_wait(600)
    # 设置页面加载超时时间
    self.driver.set_page_load_timeout(600)
    # 设置异步脚本加载超时时间
    self.driver.set_script_timeout(600)
    # 将浏览器最大化(针对Chrome)
    self.driver.maximize_window()


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

三、执行testrunner.py

import unittest
from HTMLTestRunner import HTMLTestRunner
import os,shutil
from tomorrow import threads
from BeautifulReport import BeautifulReport


DIR=os.path.dirname(os.path.abspath(__file__))
reportpath=DIR+'\\test_report'
logpath=DIR+'\\logs'
casepath=DIR+'\\testsuites'

## 清除指定目录下的内容
def cleanFile(workDir):
    list = os.listdir(workDir)
    for i in range(0,len(list)):
        path = os.path.join(workDir, list[i])
        if os.path.isfile(path):
            os.remove(path)
        elif os.path.isdir(path):
            shutil.rmtree(path, True)

def add_case(case_path=casepath, rule="test_*.py"):
    '''加载所有的测试用例'''
    discover = unittest.defaultTestLoader.discover(case_path,
                                                  pattern=rule,
                                                  top_level_dir=None)
    return discover

    
@threads(9) #一共有9个测试用例,开启9个线程,以节省测试时间
def run(test_suite):
    result=BeautifulReport(test_suite)
    result.report(filename='report.html',description='Web UI测试报告',log_path='test_report')


if __name__ == "__main__":
    cleanFile(logpath) #清除日志
    cleanFile(reportpath) #清除历史报告
    cases=add_case()
    for i in cases:
        print(i)
        run(i)

注意testrunner.py直接放置在根目录下,直接运行即可。

四、注意事项

  • pageobject下需要创建__init__.py文件,并在该文件中写入:
from .contact_us import Contact_us
from .web_init import Web_Init,Web_quit
  • 在testsuites下同样创建__init__.py文件,不用写入任何东西。
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值