【web测试】实战1:去哪儿网购买火车票|优化|po模式

【web测试】实战1:去哪儿网购买火车票|优化|po模式

  • 测试用例设计
    • 1.项目计划
    • 2.测试用例
  • 项目实战脚本
    • 基本代码
    • 优化
      • 代码重构
        • base_function.py
        • qunaer_book.py
        • test_qunaer_book.py
        • data.xlsx
      • po模式
        • 目录
        • base.py
        • function.py
        • book_ticket_page.py
        • book_list_page.py
        • book_order_page.py
        • test_book.py

测试用例设计

1.项目计划

  • 制定测试计划
    对象 (What)——什么事情
    场所 (Where)——什么地点
    时间和程序 (When)——什么时候
    人员 (Who)——责任人
    为什么(Why)——原因
    方式 (How)——如何
    通盘考虑能遇见的活动集合及异常风险等问题,提早构思弥补方案
  • 测试范围
    项目的测试范围,个人的测试范围
  • 项目设定目标
  • 规划活动
项目简介自动化地实现在去哪儿网订购火车票的目的
项目启动前置条件1.去哪儿网正常工作 2.自动化测试环境准备完毕
项目覆盖场景1.火车票查询页面 2.车次列表页面 3.订票页面

2.测试用例

table

项目实战脚本

  • 需求分析
  • 业务场景覆盖
  • 业务分拆多个页面
  • 页面元素分析
  • 难点分析

基本代码

from selenium import webdriver
import timefrom selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keysdriver = webdriver.Chrome("chromedriver.exe")
url = "https://www.qunar.com/"
driver.get(url)
driver.maximize_window()
driver.implicitly_wait(5)
action = ActionChains(driver)# 进入“火车票”栏
driver.find_element(By.XPATH, "//*[@id='js_nva_cgy']/li[3]").click()
time.sleep(2)
# 始发站“北京”
driver.find_element(By.NAME, "fromStation").send_keys("北京")
time.sleep(1)
# 点击空白处
action.move_by_offset(0, 0)
action.click()
action.perform()
# 到达站“济南”
driver.find_element(By.NAME, "toStation").send_keys("济南")
time.sleep(2)
# 点击空白处
action.move_by_offset(0, 0)
action.click()
action.perform()
# 定位到“日期”
el_date = driver.find_element(By.NAME, "date")
# 两种删除方法:
# for i in "2022-05-22":
#     el_date.send_keys(Keys.BACKSPACE)
el_date.send_keys(Keys.CONTROL, "a")
el_date.send_keys(Keys.BACKSPACE)time.sleep(1)
# 输入日期
el_date.send_keys("2022-05-22")
time.sleep(2)
# 点击空白处
action.move_by_offset(0, 0)
action.click()
action.perform()
# 点击“查询”
driver.find_element(By.NAME, "stsSearch").click()# 点击购买
driver.find_element(By.XPATH, "//*[@id='list_listInfo']/ul[2]/li[2]/div/div[7]/a[1]/span").click()
driver.implicitly_wait(8)# 输入姓名,身份证
driver.find_element(By.NAME, "contact_name").send_keys("张三")
driver.find_element(By.NAME, "contact_phone").send_keys("132809199806011427")time.sleep(4)
driver.quit()  # 推出

优化

  1. 设置出发日期
from datetime import date, datetime, timedelta# n是第几天,n=1 明天,n=2 后天
def date_n(n):# 今天的日期+偏移量return str(date.today() + timedelta(days=int(n)))# 设置出发日期 n从今天往后的第几天
date_1 = date_n(2)
# print(date_1)
  1. 封装 driver.find_element()
# 封装
def name(element):return driver.find_element(By.NAME, element)def xpath(element):return driver.find_element(By.XPATH, element)

代码重构

  • 测试代码层 测试
  • 业务代码层 业务
  • 基础代码层 准备环境

base_function.py

# 基础代码层
from datetime import date, timedelta
from selenium import webdriver
from selenium.webdriver.common.by import By
import xlrddef date_n(n):# 今天的日期+偏移量return str(date.today() + timedelta(days=int(n)))# driver独立出来
driver = webdriver.Chrome("chromedriver.exe")def get_driver():return driver# 封装find_element
def byname(element):return driver.find_element(By.NAME, element)def xpath(element):return driver.find_element(By.XPATH, element)# url
def open_url(url):driver.get(url)driver.maximize_window()# quit
def close():driver.close()# 读测试用例文件
# ishead 是否有标题,默认没有,如果有则跳过第0行,读取第1行
def read_excel(filename, index, ishead=False):xlsx = xlrd.open_workbook(filename)sheet = xlsx.sheet_by_index(index)data = []for i in range(sheet.nrows):if i == 0:if ishead:continuedata.append(sheet.row_values(i))return data# if __name__ == '__main__':
#     print(read_excel("data.xlsx", 0, True))

qunaer_book.py

# 业务代码层
import timefrom selenium.webdriver import ActionChains, Keys
from qunaer.base_function import *def book_ticket(start, end, n, name,id):# 每执行一条用例就新创建一个driverdriver = get_driver()url = "https://www.qunar.com/"open_url(url)driver.implicitly_wait(5)action = ActionChains(driver)# 进入“火车票”栏xpath("//*[@id='js_nva_cgy']/li[3]").click()time.sleep(2)# 选择出发城市el_start = byname("fromStation")el_start.send_keys(Keys.CONTROL, "a")el_start.send_keys(Keys.BACKSPACE)el_start.send_keys(start)time.sleep(1)# 点击空白处action.move_by_offset(0, 0)action.click()action.perform()# 选择到达城市el_end = byname("toStation")el_end.send_keys(Keys.CONTROL, "a")el_end.send_keys(Keys.BACKSPACE)el_end.send_keys(end)time.sleep(2)# 点击空白处action.move_by_offset(0, 0)action.click()action.perform()# 设置出发日期 n从今天往后的第几天date_1 = date_n(n)# print(date_1)# 修改出发日期el_date = byname("date")# 两种删除方法:# for i in "2022-05-22":#     el_date.send_keys(Keys.BACKSPACE)el_date.send_keys(Keys.CONTROL, "a")el_date.send_keys(Keys.BACKSPACE)time.sleep(1)el_date.send_keys(date_1)time.sleep(1)# 点击空白处action.move_by_offset(0, 0)action.click()action.perform()# 点击查询byname("stsSearch").click()# 点击购买xpath("//*[@id='list_listInfo']/ul[2]/li[2]/div/div[7]/a[1]/span").click()driver.implicitly_wait(8)# 输入姓名,身份证byname("contact_name").send_keys(name)byname("contact_phone").send_keys(id)time.sleep(2)# close()

test_qunaer_book.py

# 测试层
from qunaer.qunaer_book import book_ticket
from qunaer.base_function import read_excel
import pytestdata = read_excel("data.xlsx", 0, True)# 参数化
@pytest.mark.parametrize(["start", "end", "n", "name", "id"], data)
def test_book_ticket(start, end, n, name, id):# start = "北京"# end = "厦门"# n = 2# name = "张三"# id = 12001199709091234book_ticket(start, end, n, name, id)if __name__ == '__main__':pytest.main(["-s", "test_qunaer_book.py"])

data.xlsx

data

po模式

page object 页面对象模型:把页面当成对象,把页面中的业务放到一起,web app 中会用到
优点:

  1. 页面分层 ,将页面元素和业务逻辑进行区分
  2. 方便复用对象
  3. 每个页面都是一个独立的测试用例
  4. 自动化变得更容易

base层:基础的内容
common层:读取文件,日期处理,公共
data层:数据的文件
logs层:日志
po层:页面的逻辑(业务)代码
testcase层:测试层,存放测试代码
reports层:存放测试报告
config:配置文件

目录

struct

base.py

from selenium.webdriver.chrome.webdriver import WebDriver
from selenium.webdriver.common.by import Byclass Base():def __init__(self, driver):self.driver = driver  # type:WebDriverdef byname(self, element):return self.driver.find_element(By.NAME, element)def xpath(self, element):return self.driver.find_element(By.XPATH, element)def open_url(self, url):self.driver.get(url)self.driver.maximize_window()def close(self):self.driver.quit()

function.py

from datetime import date, timedelta
import xlrddef read_excel(filename, index, ishead=False):xlsx = xlrd.open_workbook(filename)sheet = xlsx.sheet_by_index(index)data = []for i in range(sheet.nrows):if i == 0:if ishead:continuedata.append(sheet.row_values(i))return datadef date_n(n):# 今天的日期+偏移量return str(date.today() + timedelta(days=int(n)))

book_ticket_page.py

import time
from selenium.webdriver import ActionChains, Keys
from qunaer_po.base.base import Base# 查询车次页class BookTicket(Base):def wait(self):return self.driver.implicitly_wait(5)def book_into(self):return self.xpath("//*[@id='js_nva_cgy']/li[3]")def book_start(self):return self.byname("fromStation")def book_end(self):return self.byname("toStation")def move_click(self):action = ActionChains(self.driver)action.move_by_offset(0, 0)action.click()action.perform()def book_date(self, date):self.byname("date").send_keys(Keys.CONTROL, "a")self.byname("date").send_keys(Keys.BACKSPACE)self.byname("date").send_keys(date)def book_button(self):return self.byname("stsSearch")def book_ticket(self, start, end, date):# 打开url# url = "https://www.qunar.com/"# self.open_url(url)self.wait()# 进入“火车票”栏self.book_into().click()time.sleep(1)# 选择出发城市self.book_start().send_keys(start)time.sleep(1)# 点击空白处self.move_click()time.sleep(1)# 选择到达城市self.book_end().send_keys(end)time.sleep(1)# 点击空白处self.move_click()time.sleep(1)# 修改出发日期self.book_date(date)time.sleep(1)# 点击空白处self.move_click()time.sleep(1)# 点击查询self.book_button().click()time.sleep(2)

book_list_page.py

# 车次列表页
from qunaer_po.base.base import Base
import timeclass BookList(Base):def book_buy(self):return self.xpath("//*[@id='list_listInfo']/ul[2]/li[2]/div/div[7]/a[1]/span")def book_list(self):self.book_buy().click()time.sleep(2)

book_order_page.py

# 车票预订页
import timefrom qunaer_po.base.base import Baseclass BookOrder(Base):def book_name(self):return self.byname("contact_name")def book_id(self):return self.byname("contact_phone")def book_order(self, name, id):self.book_name().send_keys(name)time.sleep(1)self.book_id().send_keys(id)time.sleep(2)

test_book.py

import pytestfrom qunaer_po.po.book_ticket_page import BookTicket
from qunaer_po.po.book_list_page import BookList
from qunaer_po.po.book_order_page import BookOrder
from selenium import webdriver
from qunaer_po.common.function import read_excel, date_ndata = read_excel("../data/data.xlsx", 0, True)class Test_Book():def setup(self):self.driver = webdriver.Chrome("../chromedriver.exe")url = "https://www.qunar.com/"self.driver.get(url)self.driver.maximize_window()@pytest.mark.parametrize(["start", "end", "n", "name", "id"], data)def test_01(self, start, end, n, name, id):ticket = BookTicket(self.driver)ticket.book_ticket(start, end, date_n(n))list_b = BookList(self.driver)list_b.book_list()order = BookOrder(self.driver)order.book_order(name, id)def teardown(self):self.driver.quit()if __name__ == '__main__':pytest.main(["-s", "test_book.py"])

测试运行中,如何确定上一步正确?
可以设置断言,进入下一页后,查看url地址中有无本页的某段信息,有则说明上一步成功。获取当前url信息 driver.current_url( )

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

java购买火车票

题目要求:假设从A地到B地的火车票有硬座和硬卧,价格分别为100和190元。根据铁路部门规定,未成年人(18周岁以下)身高不足120cm免票,120(含)-150(不含)cm需半票…

Java购买火车票(初识并发)

初识并发(购买火车票) 购买火车票 发现问题:多个线程操作同一个资源的情况下,线程不安全,数据紊乱。 Code: public class TicketDemo_04 implements Runnable{private int ticketNumber 10; // 票数Overridepubli…

Spring注解之@validated的使用

使用步骤 1.引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> 2.异常拦截类 /*** 全局异常处理*/ Slf…

电视卡众说纷纭(二):2007年度市面常见电视卡软硬件性能

在查找VISTA MCE插件开发的过程中看到很多的是跟电视卡硬件相关的资料。看到最多的名词就是软压卡、硬压卡。一个好的软件开发人员不只是要了解软件的开发&#xff0c;对硬件的设施也应该有相关的了解。要不然就成了闭塞的书呆子。所以我整理了我看到的关于电视卡比较好帖子和文…

dasBlog-1.8.5223.1中文版

dasBlog-1.8.5223.1中文版 本版本的DasBlog是qihangnet基于dasBlog-1.8.5223.1原版做的本地化版本。安装提示&#xff1a;1、由于本系统是使用Asp.Net开发的&#xff0c;所以在安装前请确保您的服务器或者虚拟主机支持Asp.net&#xff1b;2、请确定您将要安装的目录&#xff0c…

关于Linux下ISE和vivado安装cable usb驱动的问题

由于先前安装Android Studio一直不成功&#xff0c;一气之下&#xff0c;本人重装了系统&#xff0c;导致之前装的驱动什么的都没有了&#xff0c;这时再安装vivado&#xff0c;检测不到驱动&#xff0c;这里介绍怎么安装cable usb的驱动&#xff0c;供参考。 要安装这个驱动&a…

如何用计算机观看电视节目,如何将计算机显示器变成电视以观看节目

2006-11-16 如何在计算机上观看电视&#xff1f;我喜欢NBA&#xff0c;我喜欢 对于初次接触电视卡的用户&#xff0c;安装和接收电视确实不是一件容易的事。为此&#xff0c;我们将以Winfast TV2000电视卡为例来说明此应用程序的具体步骤。实际上&#xff0c;不同品牌的电视卡使…

ElasticSearch(一)数据类型

ElasticSearch&#xff08;一&#xff09;数据类型 1.简述 Es数据类型分为基础数据类型和复杂类型数据&#xff0c;掌握ES数据类型才能进一步使用ES检索数据内容。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot…

无人驾驶领域的软件测试该如何开展?

无人驾驶汽车使用自主决策和控制系统&#xff0c;这种系统通常由多个软件和硬件组件组成。软件测试是必要的&#xff0c;因为它可以确保无人驾驶汽车的软件系统达到高度可靠性和安全性&#xff0c;以及提高无人驾驶汽车的性能和可靠性。 因此无人驾驶汽车是一定要进行严格的软件…

手写数字识别之网络结构

目录 手写数字识别之网络结构 数据处理 经典的全连接神经网络 卷积神经网络 手写数字识别之网络结构 无论是牛顿第二定律任务&#xff0c;还是房价预测任务&#xff0c;输入特征和输出预测值之间的关系均可以使用“直线”刻画&#xff08;使用线性方程来表达&#xff09…

[牛客复盘] 牛客周赛 Round 9 20230827

[牛客复盘] 牛客周赛 Round 9 20230827 总结小美的外卖订单编号1. 题目描述2. 思路分析3. 代码实现 小美的加法1. 题目描述2. 思路分析3. 代码实现 小美的01串翻转1. 题目描述2. 思路分析3. 代码实现 小美的数组操作1. 题目描述2. 思路分析3. 代码实现 六、参考链接 总结 又是…

数据分析基础-数据可视化学习笔记03-可视化的符号与表示-图形符号学

概念 图型符号学&#xff08;Cartographic Symbolization&#xff09;是地图学领域中的一个重要概念&#xff0c;涉及到如何使用不同的符号、颜色、图案和标记来在地图上表示地理信息和数据。图型符号学旨在传达地理信息&#xff0c;使得地图能够清晰、有效地传达各种空间数据…

DDT数据驱动测试

简单介绍 ​ DDT&#xff08;Date Driver Test&#xff09;&#xff0c;所谓数据驱动测试&#xff0c;简单来说就是由数据的改变从而驱动自动化测试的执行&#xff0c;最终引起测试结果的改变。通过使用数据驱动测试的方法&#xff0c;可以在需要验证多组数据测试场景中&#…

【80天学习完《深入理解计算机系统》】第十一天 3.5 过程(函数调用)

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

模板(二)

目录 非类型模板参数 引入 分类 使用typename的特殊情况 注意点 模板特化 引入 介绍 函数模板特化 使用 ​编辑 优点 类模板特化 全特化 偏特化 部分特化 特殊的特化 使用 分离编译 介绍 问题代码示例 代码 说明 预处理 编译 链接 类模板实例化…

期货量化软件:衡量指标信息

机器学习依靠数据训练来学习市场的一般行为&#xff0c;最终做出相当准确的预测。 所选学习算法必须遍历精心挑选的样本&#xff0c;以便提取有意义的信息。 许多人未能成功应用这些精密工具的原因是&#xff0c;大多数有意义的信息都隐藏在嘈杂的数据当中。 对于许多策略开发人…

期货量化交易软软件:怎样开发可以获利的交易策略

简介 通过技术分析开发成功交易策略的过程可以分为以下几步: ​ 编辑 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 在某个资产价格图表窗口上附加几个技术指标, 并识别出其中信号指标与市场关联的模式. 把上一步相关性分析取得的数据进行公式化. …

免费期货量化交易软件:种群优化算法引力搜索算法(GSA)

1. 概述 ​​​​​​​ 引力搜索算法&#xff08;GSA&#xff09;是由 E. Rashedi 提出的&#xff0c;用于解决优化问题&#xff0c;特别是非线性问题&#xff0c;它遵循牛顿的万有引力定律原理。 在所提议的算法中&#xff0c;粒子被视为物体&#xff0c;并在考虑其质量的情…

免费_期货量化软件:神经网络变得轻松-网络训练和测试

1. 定义问题 在开始创建智能交易系统之前&#xff0c;必须定义将为新神经网络设定的目标。 当然&#xff0c;金融市场上所有智能交易系统的共同目标是获利。 然而&#xff0c;此目的太笼统宽泛。 赫兹期货量化软件需要为神经网络指定更具体的任务。 甚至&#xff0c;我们需要了…

免费期货量化软件:多层感知器和反向传播算法

免费期货量化软件&#xff1a;多层感知器和反向传播算法 什么是 TensorFlow&#xff1f; TensorFlow 是一个快速数值处理的开源函数库。 它是由 Google 依照 Apache 开源许可下创建、支持和发布。 该 API 是为 Python 语言设计的&#xff0c;尽管它也可以访问基本的 C API。…