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

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

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

  • 项目目录结构:

  • 基本类模块代码
 from Common.Log import framelog
class base():
    def __init__(self,driver):
        self.driver = driver
        self.log = framelog().log()
        self.log.info("info")
    #把八大定位放在一个函数里面
    def find_ele(self,dic):
        #传递过来字典第一个即为定位方式
        by =list(dic.keys())[0];
        print("by"+by)
        #传递过来字典第二个为具体的元素
        ele=list(dic.values())[0];
        self.log.info("id")
        self.log.info("元素"+ele)
        try:
            if by == 'id':
                return self.driver.find_element_by_id(ele)
            elif by == 'name':
                return self.driver.find_element_by_name(ele)
            elif by == 'className':
                return self.driver.find_element_by_class_name(ele)
            elif by== 'linktext':
                return  self.find_element_by_link_text(ele)
            elif by == 'partial':
                return self.find_element_by_partial_link_text(ele)
            elif by == "css":
                return  self.driver.find_element_by_css_selector(ele)
            elif by == "xpath":
                return self.driver.find_element_by_xpath(ele)
            else:
                return  self.driver.find_element_by_tag_name(ele)
        except:
            return None
    #输入值
    def send_key(self,ele):
        print(ele)
        return  self.find_ele(ele)

    #后退
    def back(self):
        self.driver.back()
    #前进
    def forword(self):
        self.driver.forward()
    #当前窗口url
    def url(self):
        self.driver.current_url
  • 数据模块-读取excel操作:
import  xlrd,os
#读excel操作、所有数据存放字典中
#filename为文件名
#index为excel sheet工作簿索引
def read_excel(filename,index):
    xls = xlrd.open_workbook(filename)
    sheet = xls.sheet_by_index(index)
    print(sheet.nrows)
    print(sheet.ncols)
    dic={}
    for j in range(sheet.ncols):

        data=[]
        for i in range(sheet.nrows):
          data.append(sheet.row_values(i)[j])
        dic[j]=data
    return  dic
  • log模块日志封装:
import logging,tim
from Common.function import  projectPath
class framelog():
    def __init__(self, logger=None):


    # 创建一个logger
        self.logger = logging.getLogger(logger)
        self.logger.setLevel(logging.DEBUG)
    # 创建一个handler,用于写入日志文件
        self.log_time = time.strftime("%Y_%m_%d_")
       #路径需要修改
        self.log_path = projectPath()+"/Logs/"
        self.log_name = self.log_path + self.log_time + 'log.log'
        print(self.log_name)
        fh = logging.FileHandler(self.log_name, 'a', encoding='utf-8')
        fh.setLevel(logging.INFO)

    # 定义handler的输出格式
        formatter = logging.Formatter('[%(asctime)s] %(filename)s->%(funcName)s line:%(lineno)d [%(levelname)s]%(message)s')
        fh.setFormatter(formatter)
        self.logger.addHandler(fh)

    #  添加下面一句,在记录日志之后移除句柄

     #   self.logger.removeHandler(fh)
    # 关闭打开的文件
        fh.close()


    def log(self):
        return self.logger
  • PO车次预定模块实现:
from Base.base import  base
import  time
class bookPage(base):
    #预定车票
    def book(self):
        return self.by_xpath("//*[@id='tbody-01-K5260']/div[1]/div[6]/div[4]/a")

    #动车
    def book_typeD(self):
        return  self.by_css("#resultFilters01 > dl:nth-child(1) > dd.current > label > i")
    # 关闭浮层
    def book_close(self):
        return  self.by_css("#appd_wrap_close")

    def book_nologin(self):
        return  self.by_css("#btn_nologin")

    def bookBtn(self):
        try:
            time.sleep(7)
            self.book_close().click()
            time.sleep(2)
            self.book().click()
            time.sleep(2)
            self.book_nologin().click()

        except:
            self.log.error("车次查询失败")
            None
        return self.dr_url()
  • 测试配置文件:
[testUrl]
url = “测试环境url"
[productUrl]
url = "生产环境url"
  • 测试用例管理模块
  1. 测试套件管理:
import unittest
import HTMLTestRunner
import  time
from Common.function import  projectPath

if __name__ == '__main__':
    test_dir=projectPath()+"TestCases"
    tests=unittest.defaultTestLoader.discover(test_dir,
                                                     pattern ='test*.py',
                                                    top_level_dir=None)
    now = time.strftime("%Y-%m-%M-%H_%M_%S",time.localtime(time.time()))
    filepath=projectPath()+"/Reports/"+now+'.html'
    fp=open(filepath,'wb')
    #定义测试报告的标题与描述
    runner = HTMLTestRunner.HTMLTestRunner(stream=fp,title=u'自动化测试报告',description=u'测试报告')
    runner.run(tests)
    fp.close()

2.测试脚本:

import os,sys
sys.path.append(os.path.split(os.getcwd())[0])
import  time,unittest,HTMLTestRunner
from PageObject.bookPage import bookPage
from PageObject.orderPage import orderPage
from PageObject.searchPage import searchPage

from Base.baseUnit import  unitBase
from selenium import  webdriver


class SearchTest(unitBase):
    def test_02(self):
        search = searchPage(self.driver)
        res =search.searchTrain("杭州","上海","2019-05-10")
        #本例断言是根据当前页面的url去判断的
        self.assertIn('TrainBooking',res)

    def test_03(self):
        book = bookPage(self.driver)
        res=book.bookBtn()
        self.assertIn("InputPassengers",res)

    def test_04(self):
        order = orderPage(self.driver)
        order.userInfo("小王")
  • 项目格式:

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

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

在这里插入图片描述

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/106316.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android Studio 导出 jar

AS版本:Android Studio Giraffe | 2022.3.1 Patch 1 1、File——New Module——Android Library 2、mylibrary——main——新建功能类 3、mylibrary——build.gradle——android {}内复制以下代码——Sync Now //Copy类型 tasks.register(makeJar, Copy) { //删…

【Java 进阶篇】Java Request 继承体系详解

在Java编程中,Request(请求)是一个常见的概念,特别是在Web开发中。Request通常用于获取来自客户端的信息,以便服务器能够根据客户端的需求提供相应的响应。在Java中,Request通常涉及到一系列类和接口&#…

CentOS 编译安装TinyXml2

安装 TinyXml2 Git 源码下载地址:https://github.com/leethomason/tinyxml2 步骤1:首先,你需要下载tinyxml2的源代码。你可以从Github或者源代码官方网站下载。并上传至/usr/local/source_code/ 步骤2:下载完成后,需要将源代码解…

Java IDEA feign调用上传文件MultipartFile以及实体对象亲测可行

Java IDEA feign调用上传文件MultipartFile以及实体对象亲测可行 1. 报错 java.lang.IllegalStateException: Body parameter cannot be used with form parameters2. 解决参考 1. 报错 java.lang.IllegalStateException: Body parameter cannot be used with form parameters …

1-多媒体通信概述

文章目录 媒体和多媒体媒体多媒体VarityIntergrationInteraction 多媒体通信(MMC)业务类型 MMC主要问题和关键技术主要问题关键技术 MMC发展动向重要事件趋势 标准化组织 媒体和多媒体 媒体 承载信息的载体. 感知媒体, 表示媒体, 显示媒体, 存储媒体, 传输媒体. 多媒体 Var…

【设计模式】第3节:设计模式概论

设计模式不是代码,而是某类问题的通用方案。设计模式的本质是提高软件的维护性、通用性和扩展性,并降低软件的复杂度。一共有24种设计模式,可以分为创建型模式、结构型模式和行为型模式三大类。设计模式中比较重要的有:单例模式、…

Spring Authorization Server 1.1 扩展实现 OAuth2 密码模式与 Spring Cloud 的整合实战

目录 前言无图无真相创建数据库授权服务器maven 依赖application.yml授权服务器配置AuthorizationServierConfigDefaultSecutiryConfig 密码模式扩展PasswordAuthenticationTokenPasswordAuthenticationConverterPasswordAuthenticationProvider JWT 自定义字段自定义认证响应认…

C++(Qt)软件调试---线程死锁调试(15)

C(Qt)软件调试—线程死锁调试(15) 文章目录 C(Qt)软件调试---线程死锁调试(15)1、前言2、常见死锁3、linux下gdb调试C死锁1.1 使用代码1.2 gdb调试 3、linux下gdb调试Qt死锁1.1 使用代码1.2 gdb调试 4、Windows下gdb调试C死锁5、W…

Selenium+Pytest自动化测试框架详解

前言 selenium自动化 pytest测试框架 本章你需要 一定的python基础——至少明白类与对象,封装继承;一定的selenium基础——本篇不讲selenium,不会的可以自己去看selenium中文翻译网 一、测试框架简介 测试框架有什么优点 代码复用率高&…

【LeetCode】5. 最长回文子串

题目链接 文章目录 Python3方法: 暴力求解 ⟮ O ( n 3 ) 、 O ( 1 ) ⟯ \lgroup O(n^3)、O(1)\rgroup ⟮O(n3)、O(1)⟯方法一: 动态规划 (回文串同时去掉头尾后 依然是回文串) ⟮ O ( n 2 ) ⟯ \lgroup O(n^2)\rgroup ⟮O(n2)⟯⭐ 方法二:…

网工内推 | 急招网工,思科、华为认证优先,法定节假日三薪

01 江苏臻云技术 招聘岗位:网络工程师 职责描述: 1、负责落实数据中心机房日常网络监测及巡检任务; 2、负责数据中心网络设备日常监控、变更、维护、巡检; 3、负责日常巡检报告、故障维护报告、变更申请的文档的编制;…

番外8.2 --- 后续

### 01:dd命令:在新挂载点创建swap文件大小10MB;(dd if/dev/zero of/swap bs1024 count10240) 02:给swap建立文件系统,将其分属到swap文件(mkswap /swap; swapon /swap &…

下载视频号安装,下载视频号安装到手机上?

在数字化时代,随着社交媒体的蓬勃发展,视频内容正成为品牌传播和用户吸引的重要方式。而作为当下最热门的短视频平台之一,视频号为用户提供了创作、分享和推广优质内容的机会。如果您还不了解视频号视频或想进一步了解如何下载视频号视频&…

多测师肖sir_高级金牌讲师__接口测试之练习题(6.1)

常见的接口面试题目: 1.postman接口测试,它有一个功能可以设置参数化,你有用过吗? 用过 (1)新建一个csv.文件 填写user、pwd 新建一个全局变量 user、pwd 点击bodyform-data 填写user、pwd 点击run 导入csv.件 查看结果 &#x…

element-ui vue2 iframe 嵌入外链新解

效果如图 实现原理 在路由中通过 props 传值 {path: /iframe,component: Layout,meta: { title: 小助手, icon: example },children: [{path: chatglm,name: chatglm,props: { name: chatglm,url: https://chatglm.cn },component: () > import(/views/iframe/common),me…

Facebook广告效果数据获取

一、背景 公司每年在Facebook和Google上投放了大量的广告,我总不能让老板登录Facebook广告投放平台上去看广告效果,其实老板只关注每天花了多少钱引来了多少客户,每个客户平均花费多少钱,其它的他才不关心,有Facebook…

如何将Mysql数据库的表导出并导入到另外的架构

如何将Mysql数据库的表导出并导入到另外的架构 准备一、解决方法1.右键->导出->用mysqldump导出2.注意路径一般为:C:/Program Files/MySQL/MySQL Server 8.0/bin/mysqldump.exe和导出的sql文件位置3.右键->SQL脚本->运行SQL脚本4.找到SQL脚本并点击确定…

C++基础:函数模板

为了代码重用,代码必须是通用的;通用的代码就必须不受数据类型的限制。那么我们可以把数据类型改为一个设计参数,这种类型的程序设计称为参数化程序设计,软件模板有模板构造,包括函数模板和类模板。 函数模板可以用来…

Facebook账号被封?那是因为没做对这些事

Facebook是全球最大的社交媒体平台之一,拥有数十亿的全球用户。它的主要产品包括Facebook(面向个人用户的社交媒体平台)、Instagram、WhatsApp和Messenger。同时他也是美国数字广告市场的主要参与者之一,其广告平台吸引了数百万广…

H5营销观察:H5破圈传播有什么秘诀

在移动互联网时代,流量越加碎片化,场景变得相对短促和兴趣导向,一个营销H5产生的每一次点击、每一次互动、每一次流量停留背后都会有相应的动机,也是营销流量效果的成因。 今天,我们一起来探究下什么样的内容更容易传播…