python + selenium 初步实现数据驱动

如果在进行自动化测试的时候将测试数据写在代码中,若测试数据有变,不利于数据的修改和维护。但可以尝试通过将测试数据放到excel文档中来实现测试数据的管理。

示例:本次涉及的项目使用的12306 selenium 重构------三层架构
excel文件数据如图所示:
在这里插入图片描述
整体项目代码结构如图所示:
在这里插入图片描述
function.py 代码如下(基础代码):

# coding = utf-8

'''基础常用方法'''

from datetime import date,timedelta
from selenium import webdriver
from selenium.webdriver.common.by import By
import xlrd
import logging

# 将driver设置为全局变量
driver = webdriver.Chrome()


def return_driver():
    '''
    函数return_driver()的功能是返回driver对象
    :return:driver对象
    '''
    return driver

def open_base_site(url):
    '''
    打开网页
    :param url:要打开的网页地址
    :return:
    '''
    driver.get(url)

def max_window():
    '''
    浏览器窗口最大化
    :return:
    '''
    driver.maximize_window()


def close_driver():
    '''
    关闭浏览器
    :return:
    '''
    driver.quit()


# 以下为定义函数部分,其目的是返回今天后的第n天后的日期,格式为“2022-03-28”
def date_n(n):
    return str((date.today() + timedelta(days=int(n))).strftime('%Y-%m-%d'))


def id(element):
    '''
    根据元素id属性值来返回元素定位语句。
    :param element: id属性值
    :return:按照id属性来定位元素的语句
    '''
    return driver.find_element(By.ID, element)


def xpath(element):
    '''
    使用xpath定位元素
    :param element:
    :return:按照xpath方式来定位元素的语句
    '''
    return driver.find_element(By.XPATH, element)


def read_excel(excleName, sheetName):
    '''
    按行读取excel
    :param excleName: excel文件名
    :param sheetName: sheet名称
    :return: 列表形式
    '''
    wb = xlrd.open_workbook(excleName)
    sheet = wb.sheet_by_name(sheetName)
    data = []
    for row in range(sheet.nrows):
        data.append(sheet.row_values(row))
    return data


def filelog(logName):
    '''
    文件日志器
    :return: 日志器
    '''
    # 创建日志器
    logger = logging.getLogger()
    # 设置日志器输出级别
    logger.setLevel(logging.DEBUG)
    # 创建格式器
    fmt = '%(asctime)s %(filename)s %(lineno)d %(levelname)s %(message)s'
    format = logging.Formatter(fmt=fmt, datefmt='%Y-%m-%d %H:%M:%S %a')
    # 创建文件处理器
    fileHandler = logging.FileHandler(logName + '.log', mode='a', encoding='utf-8')
    # 处理器添加格式器
    fileHandler.setFormatter(format)
    # 日志器添加文件处理器
    logger.addHandler(fileHandler)
    # 返回日志器
    return logger

search_tickets.py 的代码如下:

# coding = utf-8

from functions import return_driver, open_base_site,max_window,date_n,xpath,id


def search_tickets(from_station, to_station, n, url):
    '''
    搜索车次
    :param from_station: 出发城市
    :param to_station: 到达城市
    :param n: 一个数字,如1表示选择明天的车票,2表示选择后台的车票
    :param url: 要访问的网站地址
    :return:
    '''
    # tomorrow变量:出发日期
    tomorrow = date_n(n)
    # 打开浏览器
    driver = return_driver()
    # 打开网站
    open_base_site(url)
    # 设置窗口最大化
    max_window()
    # 输入出发城市
    xpath('//input[@id="fromStationText"]').click()
    xpath('//input[@id="fromStationText"]').send_keys(from_station)
    xpath('//div[@id="citem_2"]').click()
    # 输入到达城市
    xpath('//input[@id="toStationText"]').click()
    xpath('//input[@id="toStationText"]').send_keys(to_station)
    xpath('//div[@id="citem_1"]').click()
    # 输入出发时间
    id('train_date').clear()
    id('train_date').send_keys(tomorrow)
    # 点击查询
    id('search_one').click()
    # 切换到新窗口
    driver.switch_to.window(driver.window_handles[1])
    # 点击弹窗确认按钮
    xpath('//a[@id="qd_closeDefaultWarningWindowDialog_id"]').click()
    # 点击D2244车次的预订
    xpath('//tr[starts-with(@id,"ticket_76000D22440N_01_06")]/td/a').click()

login.py文件代码如下:

# coding = utf-8

from functions import id


def login(username, password):
    '''
    账号登录
    :param username: 用户名
    :param password: 密码
    :return:
    '''
    # 输入用户名
    id('J-userName').send_keys(username)
    # 输入密码
    id('J-password').send_keys(password)

测试代码文件test_booking_tickets.py 如下:

# coding = utf-8

from search_tickets import search_tickets
from login import login
from functions import close_driver, read_excel, filelog
from time import sleep

# 搜索火车票列表
log = filelog('12306')
log.info('读取excel文件')
data = read_excel('testdata.xlsx', 'city')
print(data)
log.info('开始搜索火车票')
search_tickets(data[0][0], data[0][1], 1, 'https://www.12306.cn/index/')
log.info('搜索火车票结束')
sleep(2)
# 登录
log.info('输入用户名密码开始登录')
login(data[1][0], data[1][1])
log.info('登录成功')
sleep(2)
# 关闭浏览器
log.info('关闭浏览器')
close_driver()

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

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

相关文章

单机物理机部署Datax

一、概述 DataX 是阿里巴巴开源的一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。 源码地址:https://github.com/alibaba/DataX 为了解决异构数据…

Portalgraph VR空间投影仪:可以将VR空间投射到任意平面上的新型VR投影技术

通过一项创新的科技突破,Portalgraph VR空间投影仪成功地在现实与虚拟空间之间搭建起了一座神奇的“时空传送门”。这投影一技术不仅打破了传统虚拟现实设备的局限,更让人们无需佩戴任何头戴显示器,仅凭裸眼就能在任何平面上看到虚拟现实空间…

RibbonGroup添加QAction

实际项目中,group中需要添加按钮与点击事件: 添加实例如下: if (Qtitan::RibbonGroup* groupClipboard pageHome->addGroup(tr("Clipboard"))) { //右下角按钮显示 groupClipboard->setO…

高效办公:在文件夹名称左边插入关键字,提高文件管理效率

在繁忙的工作环境中,经常要处理大量的文件和文件夹。有效的文件管理是一个挑战,大量的文件和文件夹难以找到所需的资料。下面一起来看云炫文件管理器如何在文件夹名称左边批量插入关键字。 文件夹名称左边添加关键字前后对比图。 文件夹名称左边批量插…

电脑扩容升级硬盘选1T还是2T

SSD固态有必要升级2TB吗?----------吴中函 某大二学生用的一台笔记本电脑,512GB的硬盘空间已经严重不够用了,想给笔记本扩容升级一下硬盘; 这位学生是学设计专业的、平时也喜欢摄影、电脑里面也装了一些游戏,经常整理、…

OFBiz RCE漏洞复现(CVE-2023-51467)

漏洞名称 Apache OFBiz 鉴权绕过导致命令执行 漏洞描述 Apache OFBiz是一个非常著名的电子商务平台,是一个非常著名的开源项目,提供了创建基于最新J2EE/XML规范和技术标准,构建大中型企业级、跨平台、跨数据库、跨应用服务器的多层、分布式…

【java八股文】之MYSQL基础篇

1、数据库三大范式是什么 第一范式:每个列都不可以再拆分。 第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。 第三范式:在第二范式的基础上,非主键列只依赖于主键&#…

数模学习day13-典型相关分析

典型相关分析(Canonical Correlation analysis) 研究两组变量(每组变量中都可能有多个指标)之间相关关系的一种多元统计方法。它能够揭示出两组变量之间的内在联系。 注:本文源于数学建模学习交流相关公众号观…

手把手教你在Ubuntu下建gitlab,试用于Ubuntu20、Ubuntu22、Ubuntu23

一、gitlab说明 略 二、准备工作 更新系统,安装依赖库$ sudo apt update && sudo apt upgrade $ sudo apt install apt install ca-certificates curl openssh-server postfix配置安装GitLab所需要的源$ curl -sS https://packages.gitlab.com/install/re…

Qt点击按钮在附近弹出下拉框

效果 MainWindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include"toollayout.h" QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACEclass MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow…

js动态设置关键侦@keyframes

js动态设置关键侦keyframes 1.前置知识 关键侦keyframes规则通过在动画序列中定义关键侦的样式来控制CSS动画序列的中间步骤 keyframes slidein {from {transform: translateX(0%);}to {transform: translateX(100%);} } // from 等价于 0%&#xff1b;to 等价与 100% // 或…

如何确定测试用例的优先级?5个方面

测试用例优先级的确定&#xff0c;有助于测试团队合理分配测试资源&#xff0c;集中精力测试重点功能和场景&#xff0c;确保重点功能测试用例的覆盖率&#xff0c;从而有利于快速发现和解决重点功能缺陷&#xff0c;确保项目进度和质量。 如果测试用例没有明确的优先级&#x…

函数的秘密

1. 函数的概念 在数学中我们学习过函数&#xff0c;而在C语言中其有着与数学不同的概念&#xff1a; 在C语言中&#xff0c;函数是指一组执行特定任务的语句&#xff0c;这些语句可以重复使用&#xff0c;并且可以在程序的不同部分调用。通过使用函数&#xff0c;程序员可以将…

GIS融合之路(五)番外-山海鲸的体积云又又又升级了

一转眼自上一篇文章已经过去半年之久&#xff0c;承诺的CesiumJS的天气文章竟然又又又又跳票了&#xff0c;没办法。开发任务时间紧&#xff0c;任务重。GIS的进一步整合进入深水区&#xff0c;每向前迈一步都是步履维艰&#xff0c;好不容易把体积雾&#xff0c;接触阴影&…

利用docker的LNMP

服务器环境 容器 操作系统 IP地址 主要软件 nginx CentOS 7 172.20.0.10 Docker-Nginx mysql CentOS 7 172.20.0.20 Docker-Mysql php CentOS 7 172.20.0.30 Docker-php 任务需求 使用 Docker 构建 LNMP 环境并运行 Wordpress 网站平台…

Spark---RDD(Key-Value类型转换算子)

文章目录 1.RDD Key-Value类型1.1 partitionBy1.2 reduceByKey1.3 groupByKeyreduceByKey和groupByKey的区别分区间和分区内 1.4 aggregateByKey获取相同key的value的平均值 1.5 foldByKey1.6 combineByKey1.7 sortByKey1.8 join1.9 leftOuterJoin1.10 cogroup 1.RDD Key-Value…

Javaweb的网络投票系统的设计与实现

目的与意义 原始的投票管理基本上是人工操作&#xff0c;效率低下&#xff0c;缺乏方便性&#xff0c;网上投票管理系统运用计算机和其他附加设备&#xff0c;不再需要手工操作&#xff0c;基本上是全自动化&#xff0c;能够节省人力&#xff0c;大大的提高了效率。使投票变得…

【项目管理】CMMI-风险与机会管理过程

1、文档结构 2、风险与机会概率 风险与机会概率指的是风险与机会实际发生的可能性。可以用自然语言术语来映射数字概率范围。下表列出了七段概率分级中自然语言术语和数字概率范围映射关系。注意&#xff0c;用来计算的概率值等于概率范围的中间值取整。有了映射表格的帮助&am…

C++ Primer 6.3 返回类型和return语句 知识点+练习题

C Primer 6.3 返回类型和return语句 无返回值函数有返回值的函数两个错误值是如何被返回的返回类类型的函数和调用运算符引用返回左值列表初始化返回值主函数main的返回值返回数组指针 递归练习题疑问待更新 无返回值函数 用在返回值类型为void的函数中&#xff0c;可以不写re…

u盘监控系统—公司电脑如何监控U盘使用?【详解】

在当今的办公环境中&#xff0c;U盘等移动存储设备已成为数据传输和存储的重要工具。 然而&#xff0c;随着U盘的广泛使用&#xff0c;也带来了潜在的安全风险&#xff0c;如数据泄露、病毒传播等。 因此&#xff0c;对于随时会有数据泄露风险的企业而言&#xff0c;U盘的使用…