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()
  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值