python问卷调查系统设计案例_Python系统学习 - Page Object设计模式

本文深入探讨Selenium和Appium自动化测试中Page Object设计模式的应用,通过实例解析如何分层元素定位和操作,提升测试用例维护效率。介绍了BasePage、BaiduPage和TestBaidu的关系,并展示了Poium库的使用,简化Page层定义并提供便利的API。
摘要由CSDN通过智能技术生成

be6965270b3a00bd9f164040348fb8f4.png

接着我们来继续学习Selenium/Appium框架都会用到的一个设计模式:Page Object

其旨在将元素定位和元素操作分层,只接触测试内容,不写基础内容,便于后续对自动化测试用例体系的维护

OK~来看如下用法:

一、Page Object

1.只写测试内容,不写基础内容
2.不需要直接接触Selenium
3.把元素定位和元素操作分层,这样当元素发生变化时,只需维护page层的元素定位,不用关心哪些测试用例使用了这些元素
4.在编写测试用例时,也不用关心元素时如何定位的
5.继承父类后注意driver和逻辑、元素共享

该例子:百度搜索selenium,我们的关系是:BasePage -> BaiduPage -> TestBaidu

1.base_page.py:

# coding = utf8

import os
os.path.abspath(".")

class BasePage:

    """基础Page层,封装一些常用方法
    """
    def __init__(self, driver):
        self.driver = driver
    
    # 打开页面,如果为None,则继承子类的url,否则用url
    def open_url(self, url = None):
        if url is None:
            self.driver.get(self.url)
        else:
            self.driver.get(url)
    
    # id定位
    def by_id(self, id):
        return self.driver.find_element_by_id(id)

    # class定位
    def by_class(self, classname):
        return self.driver.find_element_by_class_name(classname)
    
    # XPath定位
    def by_xpath(self, xpath):
        return self.driver.find_element_by_xpath(xpath)
    
    # css定位
    def by_css(self, css):
        return self.driver.find_element_by_css_selector(css)

    # 获取title
    def get_title(self):
        return self.driver.title
    
    # 获取页面text,仅使用xpath定位
    def get_text(self, xpath):
        return self.by_xpath(xpath).text
    
    # 执行JavaScript脚本
    def js(self, script):
        self.driver.execute_script(script)

2.baidu_page.py:

# coding = utf8

import os
os.path.abspath(".")
from base_page import BasePage

class BaiduPage(BasePage):
    """百度Page层,百度页面封装操作到的元素

    Args:
        BasePage (BasePage): Parent class, Inherit it and use the base function
    """
    url = "https://www.baidu.com"

    def search_input(self, search_key):
        self.by_id("kw").send_keys(search_key)

    def search_button(self):
        self.by_id("su").click()
    
    

3.test_baidu.py:

# coding = utf8

import os
os.path.abspath(".")
from baidu_page import BaiduPage
import unittest
from selenium import webdriver
from time import sleep

class TestBaidu(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        cls.driver = webdriver.Chrome()
    
    def test_search_key_case(self):
        page = BaiduPage(self.driver)
        page.open_url()
        page.search_input("selenium")
        page.search_button()
        sleep(2)
        self.assertEqual(page.get_title(), "selenium_百度搜索")
    
    @classmethod
    def tearDownClass(cls):
        cls.driver.quit()
    
if __name__ == "__main__":
    unittest.main(verbosity = 2)

二、Poium

1.简化了BasePage层元素的定义
2.安装:pip3 install poium

该例子:百度搜索selenium,我们的关系的:BaiduPage -> TestBaidu

1.baidu_page.py:

# coding = utf8

from poium import Page, PageElement

class BaiduPage(Page):

    """百度Page层,百度页面封装操作到到元素
    """
    search_input = PageElement(id_ = "kw")
    search_button = PageElement(id_ = "su")


2.test_baidu.py:

# coding = utf8

import os
os.path.abspath(".")
import unittest
from baidu_page import BaiduPage
from selenium import webdriver
from time import sleep

class TestBaidu(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        cls.driver = webdriver.Chrome()

    def test_baidu_search_key_case(self):
        page = BaiduPage(self.driver)
        page.get("https://www.baidu.com")
        page.search_input = "selenium"
        page.search_button.click()
        sleep(2)
        self.assertEqual(page.get_title, "selenium_百度搜索")
    
    @classmethod
    def tearDownClass(cls):
        cls.driver.quit()

if __name__ == "__main__":
    unittest.main(verbosity = 2)



三、Poium的更多用法:

(poium是基于seleniim/appium的Page Object的测试库)
1.支持的定位方法
elem_id = PageElement(id_ = "id")
elem_name = PageElement(name = "name")
elem_class = PageElement(class_name = "class")
elem_tag = PageElement(tag = "input")
elem_link_text = PageElement(link_text = "this_is_link")
elem_partial_link_text = PageElement(partial_link_text = "is_link")
elem_xpath = PageElement(xpath = "//*[@id = 'kk']")
elem_css = PageElement(css = "#id")
2.设置元素超时时间
search_input = PageElement(id_ = "kw", timeout = 5)
3.设置元素描述
search_input = PageElement(id_ = "kw", timeout = 5, describe = "搜索输入值")
(describe并无实际意义,是方便元素多时查看)
4.定位一组元素
search_result = PageElements(xpath = "//div/h3/a")

(Poium极大简化了Page层的定义,还提供了很多API,如PageSelect类简化了下拉框的处理等) -- 常用Very Good!

项目结构:

7209c1b943176280428ccffd97d453e2.png

下一章我们开始学习PyTest!

关注 + 收藏 + 点赞哦,谢谢啦~

eedab30e9be428adc18b054464142cb8.png
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本项目是一个简单的django问卷调查系统,拥有完善的权限机制,以及答卷功能,可扩展性强,用户相关登录、退出、改密等功能均在users应用中,course应用为问卷应用,采用vue+django+sqlite3开发,但后期可配置连接到MySQL数据库! 非常适合大学生作为毕业项目进行改造! 上线部署请自行参考django官方文档!如有部署需求可单独咨询报价! 调试步骤: 1、创建虚拟环境,这里只以python默认创建虚拟环境的方式说明 python3 -m venv venv 2、激活虚拟环境 win: venv\Script\activate linux: source venv/bin/activate 3、安装依赖 pip3 install -r requirements.txt 4、启动调试服务器 python3 manage.py runserver 前台所有页面默认均需要登录后方可访问 学生登录后直接进入选择问卷页面,选择问卷确认后直接进入问卷答题页面,成功跳转到个人中心,失败会有失败提示,问卷所有选项在没提交问卷之前均可修改,提交后选项不能修改,一个问卷一个学生只能作答一次,不能重复作答! 老师登录后跳转到个人中心,可修改密码,查看问卷结果,通过问卷结果的学生名可访问该问卷该学生的作答详细信息! 前台登录功能,学生、老师、超管均可登录,登录成功根据角色类型显示不同页面对应不同操作。 超管前台登录权限和老师基本一致,只是查看问卷结果为全员的问卷结果,而老师只能查看自己名下关联课程的问卷! 超管后台登录拥有所有权限,可在后台导出问卷结果及课程详情结果,格式为csv! 超管拥有批量导入用户信息权限! 超管可在后台修改任何用户的密码! 学生及教师均可在前台修改密码、姓名和用户名, 姓名和用户名修改时默认显示在修改框! 超管后台功能列表 用户管理 - 学生、教师信息增删改查! 开课时间 - 【增删改查】添加课程之前必须设置,因为在添加课程是需要选择开课时间,依赖该项! 课程管理 - 【增删改查】添加课程,课程需关联老师及开课时间,请提前创建! 问题管理 - 【增删改查】问题维度已经内置直接选择,问题、权重可修改,问题选项在对应的问题下添加,请注意选择选项多对应的选项号! 问卷管理 - 【增删改查】问卷可多选题库,关联教师,关联课程,请提前创建! 问卷结果 - 【管理员可删除】 可批量导出,可按课程及教师筛选查看! 课程结果 - 课程列表依赖添加的课程,已经有学生答题的课程,在删除课程前需谨慎,会导致之前的结果无法查看! 超管导入用户数据地址:http://127.0.0.1:8000/course/loaddata/user/ 用户数据录入说明: 老师和学生录入信息字段基本一致,id[值唯一]、username[值唯一]、password、code[值唯一,并且不能以0开头]为必填。 user_type字段为用户类型,需要在导入前指明用户类型。【学生类型:XS】【教师类型: TC】【超管类型:CG】。 dept字段为学院类型,因为系统已经固定了几个学院选项,所以不能随意填写,需要与选项中的对应。 # 选项类型 DEPT = ( ('计算机科学学院', '计算机科学学院'), ('文学院', '文学学院'), ('外国语学院', '外国语学院'), ('数学学院', '数学学院'), ) code字段为老师或学生的学号,必须唯一,也是必填项,不能以0开始,不能以0开始,不能以0开始,否则编辑信息不可用excel,只能用txt文本管理器打开编辑! 项目根目录有个01.csv的文件为导入用户信息模板,里边录入的几个用户不能删除,除id之外,其余均可修改, id可以从2开始,1的id是超级管理员的id,可以剔除在外!【目前超管的信息已经在文件中,如果系统创建了超管之后再去导入,文件中的超管id=1的信息会被覆盖】 【文件编码格式必须为: 【CSV UTF-8(逗号分割) 】的.csv文件】 前台登录地址:http://127.0.0.1:8000/users/login/ 后台登录地址:http://127.0.0.1:8000/admin/ 学生测试账户: 账号:studentA 密码:123456 教师测试账户: 账号:teachA 密码:123456 超级管理员: 账号:admin 密码:admin123zxc
### 回答1: 答:我可以为您提供一个使用Python语言和Page Object设计模式实现的接口测试用例的示例,请参考以下代码:from pageobjects.checkout_page import CheckoutPagedef test_checkout(): checkout_page = CheckoutPage() checkout_page.open() checkout_page.fill_billing_information() checkout_page.fill_shipping_information() checkout_page.fill_payment_information() checkout_page.submit_order() assert checkout_page.order_confirmation_displayed() ### 回答2: 使用Python编写接口测试用例可以使用unittest框架,而Page Object设计模式可以提高测试用例的可维护性和可扩展性。 首先,需要导入所需的库,包括unittest和requests。然后,可以定义一个基类,该基类用于封装HTTP请求和响应,并提供一些常用的接口测试方法。 接下来,可以创建一个页面对象类,该类代表要测试的接口。页面对象类的作用是将具体的接口请求方法和数据封装起来,以便在测试用例中使用。 在页面对象类中,可以定义各种接口的请求方法,并使用requests库发送HTTP请求。接口的请求方法可以包括GET、POST等方法,可以传入请求的URL、header、参数、body等参数,并返回相应的响应。 然后,可以创建一个测试用例类,该类继承自unittest.TestCase类,并使用setUp方法初始化页面对象,并在测试方法中调用页面对象的接口方法进行接口测试。可以使用断言方法来验证接口的返回结果是否符合预期。 最后,在测试用例中可以使用unittest框架提供的一些装饰器(如@classmethod、@staticmethod)来控制测试用例的执行顺序和测试用例的预处理和后处理。 通过以上步骤,可以实现一个简单的接口测试用例demo,并使用Page Object设计模式来提高测试用例的可维护性和可扩展性。将各个接口的请求方法和数据封装到页面对象类中,可以使测试用例更加清晰、可读性更高,也方便后续的维护和扩展。同时,使用unittest框架可以提供丰富的测试用例管理和执行功能,可以方便地运行和管理接口测试用例。 ### 回答3: 使用Python语言编写接口测试用例可以灵活地使用Python的各种库和框架来实现自动化测试。而使用Page Object设计模式可以将页面元素与测试代码分离,提高代码的可读性和可维护性。 首先,需要安装Python的相关库,比如requests库用于发送HTTP请求,unittest库用于编写测试用例等。 接下来,可以创建一个基类BasePage,该类定义了一些通用的方法,比如发送HTTP请求、解析响应等。接口在测试中需要与此类进行交互。 然后,为每个接口创建一个Page类,该类继承自BasePage,并定义了该接口的测试方法。在Page类中,可以定义发送请求的方法、解析响应的方法和对结果进行断言的方法。 最后,创建一个测试类,在该类中实例化所有Page对象,并调用各个Page对象的测试方法。通过断言来验证接口的返回结果是否符合预期。 下面是一个简单的接口测试用例demo的示例代码: ```python import requests import unittest class BasePage: def send_request(self, method, url, data=None, headers=None): if method.upper() == 'GET': response = requests.get(url, params=data, headers=headers) elif method.upper() == 'POST': response = requests.post(url, json=data, headers=headers) else: raise Exception('Invalid request method') return response def parse_response(self, response): return response.json() class GetUserPage(BasePage): def get_user_info(self, user_id): url = f'https://api.example.com/users/{user_id}' response = self.send_request('GET', url) return self.parse_response(response) class TestInterface(unittest.TestCase): def setUp(self): self.get_user_page = GetUserPage() def test_get_user_info(self): user_info = self.get_user_page.get_user_info('123') self.assertEqual(user_info.get('id'), '123') if __name__ == '__main__': unittest.main() ``` 在以上示例中,BasePage类封装了发送HTTP请求和解析响应的方法,GetUserPage类继承自BasePage类,实现了获取用户信息的接口测试方法。TestInterface类继承自unittest.TestCase类,用于执行测试用例。在test_get_user_info方法中,实例化了GetUserPage对象,并调用其get_user_info方法来测试获取用户信息的接口。最后通过断言来验证接口返回的结果是否符合预期。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值