• selenium+python web自动化测试框架项目实战实例教程


    自动化测试对程序的回归测试更方便。 由于回归测试的动作和用例是完全设计好的,测试期望的结果也是完全可以预料的,将回归测试自动运行...

    可以运行更加繁琐的测试 自动化测试的一个明显好处就是可以在很短的时间内运行更多的测试。学习自动化测试最终目的是应用到实际项目中,本篇将介绍大家自动化测试框架:

    • 项目目录结构:

    • 基本类模块代码
    1. from Common.Log import framelog
    2. class base():
    3. def __init__(self,driver):
    4. self.driver = driver
    5. self.log = framelog().log()
    6. self.log.info("info")
    7. #把八大定位放在一个函数里面
    8. def find_ele(self,dic):
    9. #传递过来字典第一个即为定位方式
    10. by =list(dic.keys())[0];
    11. print("by"+by)
    12. #传递过来字典第二个为具体的元素
    13. ele=list(dic.values())[0];
    14. self.log.info("id")
    15. self.log.info("元素"+ele)
    16. try:
    17. if by == 'id':
    18. return self.driver.find_element_by_id(ele)
    19. elif by == 'name':
    20. return self.driver.find_element_by_name(ele)
    21. elif by == 'className':
    22. return self.driver.find_element_by_class_name(ele)
    23. elif by== 'linktext':
    24. return self.find_element_by_link_text(ele)
    25. elif by == 'partial':
    26. return self.find_element_by_partial_link_text(ele)
    27. elif by == "css":
    28. return self.driver.find_element_by_css_selector(ele)
    29. elif by == "xpath":
    30. return self.driver.find_element_by_xpath(ele)
    31. else:
    32. return self.driver.find_element_by_tag_name(ele)
    33. except:
    34. return None
    35. #输入值
    36. def send_key(self,ele):
    37. print(ele)
    38. return self.find_ele(ele)
    39. #后退
    40. def back(self):
    41. self.driver.back()
    42. #前进
    43. def forword(self):
    44. self.driver.forward()
    45. #当前窗口url
    46. def url(self):
    47. self.driver.current_url
    • 数据模块-读取excel操作:
    1. import xlrd,os
    2. #读excel操作、所有数据存放字典中
    3. #filename为文件名
    4. #index为excel sheet工作簿索引
    5. def read_excel(filename,index):
    6. xls = xlrd.open_workbook(filename)
    7. sheet = xls.sheet_by_index(index)
    8. print(sheet.nrows)
    9. print(sheet.ncols)
    10. dic={}
    11. for j in range(sheet.ncols):
    12. data=[]
    13. for i in range(sheet.nrows):
    14. data.append(sheet.row_values(i)[j])
    15. dic[j]=data
    16. return dic
    • log模块日志封装:
    1. import logging,tim
    2. from Common.function import projectPath
    3. class framelog():
    4. def __init__(self, logger=None):
    5. # 创建一个logger
    6. self.logger = logging.getLogger(logger)
    7. self.logger.setLevel(logging.DEBUG)
    8. # 创建一个handler,用于写入日志文件
    9. self.log_time = time.strftime("%Y_%m_%d_")
    10. #路径需要修改
    11. self.log_path = projectPath()+"/Logs/"
    12. self.log_name = self.log_path + self.log_time + 'log.log'
    13. print(self.log_name)
    14. fh = logging.FileHandler(self.log_name, 'a', encoding='utf-8')
    15. fh.setLevel(logging.INFO)
    16. # 定义handler的输出格式
    17. formatter = logging.Formatter('[%(asctime)s] %(filename)s->%(funcName)s line:%(lineno)d [%(levelname)s]%(message)s')
    18. fh.setFormatter(formatter)
    19. self.logger.addHandler(fh)
    20. # 添加下面一句,在记录日志之后移除句柄
    21. # self.logger.removeHandler(fh)
    22. # 关闭打开的文件
    23. fh.close()
    24. def log(self):
    25. return self.logger
    • PO车次预定模块实现:
    1. from Base.base import base
    2. import time
    3. class bookPage(base):
    4. #预定车票
    5. def book(self):
    6. return self.by_xpath("//*[@id='tbody-01-K5260']/div[1]/div[6]/div[4]/a")
    7. #动车
    8. def book_typeD(self):
    9. return self.by_css("#resultFilters01 > dl:nth-child(1) > dd.current > label > i")
    10. # 关闭浮层
    11. def book_close(self):
    12. return self.by_css("#appd_wrap_close")
    13. def book_nologin(self):
    14. return self.by_css("#btn_nologin")
    15. def bookBtn(self):
    16. try:
    17. time.sleep(7)
    18. self.book_close().click()
    19. time.sleep(2)
    20. self.book().click()
    21. time.sleep(2)
    22. self.book_nologin().click()
    23. except:
    24. self.log.error("车次查询失败")
    25. None
    26. return self.dr_url()
    • 测试配置文件:
    1. [testUrl]
    2. url = “测试环境url"
    3. [productUrl]
    4. url = "生产环境url"
    • 测试用例管理模块
    1. 测试套件管理:
    1. import unittest
    2. import HTMLTestRunner
    3. import time
    4. from Common.function import projectPath
    5. if __name__ == '__main__':
    6. test_dir=projectPath()+"TestCases"
    7. tests=unittest.defaultTestLoader.discover(test_dir,
    8. pattern ='test*.py',
    9. top_level_dir=None)
    10. now = time.strftime("%Y-%m-%M-%H_%M_%S",time.localtime(time.time()))
    11. filepath=projectPath()+"/Reports/"+now+'.html'
    12. fp=open(filepath,'wb')
    13. #定义测试报告的标题与描述
    14. runner = HTMLTestRunner.HTMLTestRunner(stream=fp,title=u'自动化测试报告',description=u'测试报告')
    15. runner.run(tests)
    16. fp.close()

    2.测试脚本:

    1. import os,sys
    2. sys.path.append(os.path.split(os.getcwd())[0])
    3. import time,unittest,HTMLTestRunner
    4. from PageObject.bookPage import bookPage
    5. from PageObject.orderPage import orderPage
    6. from PageObject.searchPage import searchPage
    7. from Base.baseUnit import unitBase
    8. from selenium import webdriver
    9. class SearchTest(unitBase):
    10. def test_02(self):
    11. search = searchPage(self.driver)
    12. res =search.searchTrain("杭州","上海","2019-05-10")
    13. #本例断言是根据当前页面的url去判断的
    14. self.assertIn('TrainBooking',res)
    15. def test_03(self):
    16. book = bookPage(self.driver)
    17. res=book.bookBtn()
    18. self.assertIn("InputPassengers",res)
    19. def test_04(self):
    20. order = orderPage(self.driver)
    21. order.userInfo("小王")
    • 项目格式:

    以上为代码级web自动化测试框架,后续将分享无代码自动化测试框架

    最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

    在这里插入图片描述

    这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你! 

  • 相关阅读:
    gradle升级,plugin使用方法
    一步真实解决:TypeError: Cannot handle this data type: (1, 1, 6), |u1
    后端每日一题 1:说一下三次握手
    芯和半导体“射频EDA/滤波器设计平台”闪耀IMS2022
    HTML+CSS+JS网页设计期末课程大作业____(航天月球响应式 3页)
    DC综合基本概念:set_compile_directives
    SpringBoot面试题2:SpringBoot与SpringCloud 区别?SpringBoot和Spring、SpringMVC的区别
    企业架构LNMP学习笔记13
    Hadoop学习笔记
    StyleGAN 调整面部表情,让虚拟人脸更生动
  • 原文地址:https://blog.csdn.net/YLF123456789000/article/details/134076544