0


软测入门(八)Selenium项目实战

自动化项目实战

项目计划设计

  • 测试计划
  • 测试范围
  • 设定目标
  • 规划活动

实际项目中,需要根据项目的实际情况创建自己的项目计划,没有固定的格式和内容要求:
项目简介自动化实现网上购票项目启动前置条件1.购票网站工作正常 2.自动化测试环境准备完毕(Python Selenium3.0 谷歌驱动下载完毕)覆盖场景场景的确定需要根据性能需求分析得出,需要多方人员参与,开发、测试、产品等1.火车票查询页面2.车次列表页面3.账号登录界面4.订单信息页面

测试用例设计

在这里插入图片描述

仅作参考,实际项目按照要求设计即可。

自动化测试脚本

例如:要进行买票四次,那么准备一个数据文件
在这里插入图片描述

脚本开发及代码优化

可分三层:

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

基础层

base_function.py

,需要从excel中读取数据,然后测试多次。

# @creator by wlh# @date 2023/3/7 9:51from datetime import date, timedelta
from selenium import webdriver
from selenium.webdriver.common.by import By
import xlrd

# 计算日期 n=1时,表示是 明天defdate_n(n):returnstr(date.today()+ timedelta(days=int(n)))# 获取浏览器驱动(后面多次测试,只用这一个driver)
driver = webdriver.Chrome()# 根据 name查询defname(element_name):return driver.find_element(By.NAME, element_name)# 根据xpath查询defxpath(xpath):return driver.find_element(By.XPATH, xpath)# 打开网址defopen_url(url):
    driver.get(url)
    driver.maximize_window()# 获取driver,每次只返回同一个driver,如果是不同的driver,那么会打开多个浏览器  注意!!!defget_driver():return driver

# 读取excel数据defread_excel(filename, hasHead =False):# 打开工作簿
    xlsx = xlrd.open_workbook(filename)# 获取第一个sheet页对象
    sheet = xlsx.sheet_by_index(0)
    data =[]for i inrange(sheet.nrows):# 对标题的处理,是否添加到 列表 中if i ==0andnot hasHead:continue
        data.append(sheet.row_values(i))print(data)return data

业务层代码

quna_book.py

,当需要多次执行业务层代码时,浏览器驱动不需要使用 close()或quit(),否则的话只能执行一次流程!!!

# @creator by wlh# @date 2023/3/7 9:52import time

from selenium.webdriver import ActionChains, Keys
from base_function import*defbook_ticket(start, end, n, cartName, cartNo):
    driver = get_driver()
    open_url("https://train.qunar.com/")# 避免元素未加载出来
    time.sleep(1)
    action = ActionChains(driver)# 多次测试时,需要先清除上一次的内容
    name("fromStation").clear()
    name("fromStation").send_keys(start)
    time.sleep(0.5)# 移动位置 点击一下
    action.move_by_offset(0,0)
    action.click()
    action.perform()# 多次测试时,需要先清除上一次的内容
    name("toStation").clear()
    name("toStation").send_keys(end)
    time.sleep(0.5)# 移动位置 点击一下
    action.move_by_offset(0,0)
    action.click()
    action.perform()# 日期先清除之前的数据,然后再填写
    name("date").send_keys(Keys.CONTROL,"a", Keys.BACKSPACE)# 计算日期
    dateCome = date_n(n)

    name("date").send_keys(dateCome)# 移动位置 点击一下
    action.move_by_offset(0,0)
    action.click()
    action.perform()# 点查询 车次
    name("stsSearch").click()# 等待页面一些元素的加载
    time.sleep(1)# 选择第一个车次,购买即可
    xpath("//*[@id='list_listInfo']/ul[2]/li[1]/div/div[7]/a[1]").click()# 等待页面一些元素的加载
    time.sleep(1)

    name("pName_0").send_keys(cartName)
    name("pCertNo_0").send_keys(cartNo)

    time.sleep(2)

测试层代码

test_book.py
# @creator by wlh# @date 2023/3/7 9:52from quna_book import book_ticket
from base_function import read_excel
import pytest

# 读取 excel
data = read_excel("../data.xlsx")# 采用 pytest的参数化,执行多次测试流程@pytest.mark.parametrize(["start","end","n","name","no"], data)deftest_boo_ticket(start, end, n, name, no):
    book_ticket(start, end, n, name, no)# pytest测试if __name__ =='__main__':
    pytest.main(["-s","test_book.py"])

PO模式处理!!

PO模式: Page Object,把页面当成对象;把页面中的业务放到其他

优点:

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

base层: ----> 基础内容

common层: ----> 读取文件、日期处理、公共的

data层: ----> 数据的文件

logs层: ------> 日志

PO层: --------> 页面的业务代码

testcase: ------> 测试层的代码

reports: ------> 存放测试报告

config: --------> 配置文件

目录结构

在这里插入图片描述

base层代码

base.py

通常情况下代码无提示,那么可以使用

 # type: 类

的方式告知解释器变量的类型,且代码会有提示

# @creator by wlh# @date 2023/3/7 11:12from selenium.webdriver.chrome.webdriver import WebDriver
from selenium.webdriver.common.by import By

classBase:def__init__(self, driver):
        self.driver = driver  # type: WebDriver# 根据 name查询defname(self, element_name):return self.driver.find_element(By.NAME, element_name)# 根据xpath查询defxpath(self, xpath):return self.driver.find_element(By.XPATH, xpath)# 打开网址defopen_url(self, url):
        self.driver.get(url)
        self.driver.maximize_window()# 关闭窗口defclose(self):
        self.driver.close()

common层代码

function.py
# @creator by wlh# @date 2023/3/7 11:10from datetime import date, timedelta
import xlrd
# 读取excel数据defread_excel(filename, hasHead=False):
    xlsx = xlrd.open_workbook(filename)
    sheet = xlsx.sheet_by_index(0)
    data =[]for i inrange(sheet.nrows):if i ==0andnot hasHead:continue
        data.append(sheet.row_values(i))return data

# 计算日期 n=1时,表示是 明天defdate_n(n):returnstr(date.today()+ timedelta(days=int(n)))

data层

就放一个excel文件即可。

po层,可以根据页面的数量,创建多个po文件,如此项目共跳转3个页面,那么整3个文件封装下即可。

book_ticket_page.py

买票查询页面

# @creator by wlh# @date 2023/3/7 11:18import time
from selenium.webdriver import ActionChains, Keys
from..base.base import Base

# 购票 POclassBookTicket(Base):# 起始地defbook_start(self):return self.name("fromStation")# 目的地defbook_end(self):return self.name("toStation")# 查询按钮defbook_button(self):return self.name("stsSearch")# 移动点击 (防止元素被遮盖)defmove_click(self):
        action = ActionChains(self.driver)
        action.move_by_offset(0,0)
        action.click()
        action.perform()# 出发日期defbook_date(self, date):
        self.name("date").send_keys(Keys.CONTROL,"a", Keys.BACKSPACE)
        self.name("date").send_keys(date)# 查询具体动作defbook_ticket(self, start, end, date):
        self.book_start().clear()
        self.book_start().send_keys(start)
        time.sleep(0.5)# 移动位置 点击一下
        self.move_click()

        self.book_end().clear()
        self.book_end().send_keys(end)
        time.sleep(0.5)# 移动位置 点击一下
        self.move_click()# 日期先清除之前的数据,然后再填写
        self.book_date(date)# 移动位置 点击一下
        self.move_click()# 点查询 车次
        self.book_button().click()
        time.sleep(1.5)
book_list_page.py

车次列表页面

# @creator by wlh# @date 2023/3/7 11:33import time
from selenium_test.qunapo.base.base import Base

classBookList(Base):# 购买按钮defbook_buy(self):return self.xpath("//*[@id='list_listInfo']/ul[2]/li[1]/div/div[7]/a[1]")# 具体购买流程defbook_list(self):
        self.book_buy().click()
        time.sleep(2)
book_order_page.py

订票详情页

# @creator by wlh# @date 2023/3/7 11:35import time
from selenium_test.qunapo.base.base import Base

classBookOrder(Base):# 订票人defbook_name(self):return self.name("pName_0")# 身份证号defbook_no(self):return self.name("pCertNo_0")# 输入信息defbook_order(self, cartName, cartNo):
        self.book_name().send_keys(cartName)
        self.book_no().send_keys(cartNo)
        time.sleep(1)

testcase测试层

# @creator by wlh# @date 2023/3/7 11:38import time
import pytest
from selenium import webdriver
from selenium_test.qunapo.po.book_ticket_page import BookTicket
from selenium_test.qunapo.po.book_list_page import BookList
from selenium_test.qunapo.po.book_order_page import BookOrder
from selenium_test.qunapo.common.function import read_excel, date_n
# 读取数据
data = read_excel("../data/data.xlsx")classTest_Book:# 前置夹具defsetup(self):
        self.driver = webdriver.Chrome()
        self.driver.get("https://train.qunar.com/")
        self.driver.maximize_window()
        time.sleep(1)# 类后置夹具defteardown(self):
        self.driver.quit()# pytest参数化执行测试流程@pytest.mark.parametrize(["start","end","n","name","no"], data)deftest_01(self, start, end, n, name, no):
        ticket = BookTicket(self.driver)# 查询票
        ticket.book_ticket(start, end, date_n(n))list= BookList(self.driver)# 车次列表页list.book_list()
        order = BookOrder(self.driver)# 输入乘客信息
        order.book_order(name, no)if __name__ =='__main__':
    pytest.main(["-s","test_book.py"])

本文转载自: https://blog.csdn.net/weixin_45248492/article/details/129390081
版权归原作者 鸢尾の 所有, 如有侵权,请联系我们删除。

“软测入门(八)Selenium项目实战”的评论:

还没有评论