Python自动化测试学习-PO设计模式

news2024/11/15 9:26:16

PO模式:Page Object,是一种页面对象设计模式,算是一种比较好的设计模式。在该设计模式中,功能类(PageObjects)所代表的是每个页面之间的逻辑关系。

PO设计模式
一、PO设计模式的优点

PO模式有以下优点:

1、可以减少了代码的重复编写。

2、PO模式把页面元素定位和业务操作流程分开,界面元素的变化则不需要修改业务逻辑代码。

3、 PO能提高代码的可读性,高复用性,可维护性。

二、非PO设计模式

为了更好地进行对比分析,我们先看看非PO设计模式:

test_logintest.py代码,直接执行所有的流程操作,不做任何封装

from time import sleep

import pytest

from selenium import webdriver

from selenium.webdriver.common.keys import Keys

class Test_logintest():

  1. def test_1(self):

  2. driver=webdriver.Firefox()

  3. driver.get("http://10.5.1.247/dvwa/login.php")

  4. sleep(1)

  5. driver.find_element_by_name("username").send_keys("admin")

  6. driver.find_element_by_name("password").send_keys("password")

  7. driver.find_element_by_name("Login").click()

  8. sleep(2)

  9. driver.find_element_by_link_text("XSS (Reflected)").click()

  10. sleep(2)

  11. driver.find_element_by_name("name").send_keys("nick")

  12. sleep(1)

  13. driver.find_element_by_xpath("//input[@value='Submit']").click()

  14. sleep(1)

if name == ‘main’:

 pytest.main(["-sq", "test_logintest.py"])
三、PO设计模式

接下来我们看看PO设计模式

基础层:打开浏览器、封装元素定位

BasePage.py代码:

from selenium.webdriver.common.by import By

class BasePage(object):

  1. def __init__(self,driver,url=None):

  2. self.driver=driver

  3. self.url=url

  4. if self.url!=None:

  5. self.driver.get(self.url)

  6. def by_name(self,id):

  7. locator=(By.NAME,id)

  8. ele=self.driver.find_element(*locator)

  9. return ele

  10. def by_linktext(self,linktext):

  11. locator=(By.LINK_TEXT,linktext)

  12. ele=self.driver.find_element(*locator)

  13. return ele

  14. def by_xpath(self,xpath):

  15. locator=(By.XPATH,xpath)

  16. ele=self.driver.find_element(*locator)

  17. return ele

PO层:页面元素获取,页面基础操作

DvwaPage.py代码:

from time import sleep

from myPytest.test_case.BasePage import *

class DvwaPage(BasePage):

  1. def usernameText(self):

  2. ele=self.by_name("username")

  3. return ele

  4. def passwordText(self):

  5. ele=self.by_name("password")

  6. return ele

  7. def linkText(self):

  8. ele=self.by_linktext("XSS (Reflected)")

  9. return ele

  10. def Submit(self):

  11. ele =self.by_name("Login")

  12. return ele

  13. def login_dvwa(self,username,password):

  14. self.usernameText().send_keys(username)

  15. self.passwordText().send_keys(password)

  16. self.Submit().click()

  17. sleep(2)

  18. def search(self,str):

  19. #这里是通过调用linkText方法

  20. self.linkText().click()

  21. #这里是直接调用by_name函数

  22. self.by_name("name").send_keys(str)

  23. sleep(1)

  24. # 这里是直接调用by_xpath函数

  25. self.by_xpath("//input[@value='Submit']").click()

  26. sleep(1)

运行

运行

测试用例层:业务逻辑和数据驱动的执行

test_loginDvwa.py代码:

import pytest

from myPytest.test_case.DvwaPage import *

from selenium import webdriver

class Test_loginDvwa():
 

  1. def test_login(self):

  2. self.driver=webdriver.Firefox()

  3. self.url="http://10.5.1.247/dvwa/login.php"

  4. username="admin"

  5. password="password"

  6. sr=DvwaPage(self.driver,self.url)

  7. sr.login_dvwa(username,password)

  8. sr.search("nick")

if name == ‘main’:

 pytest.main(["-sq", "test_loginDvwa.py"])

执行结果如下:

在这里插入图片描述

四、错误原因排查

我在执行代码时,会出现TypeError: ‘module’ object is not callable这个错误

程序代码 :

import pytest

from myPytest.test_case import DvwaPage

from selenium import webdriver

class Test_loginDvwa():

  1. def test_login(self):

  2. self.driver=webdriver.Firefox()

  3. self.url="http://10.5.1.247/dvwa/login.php"

  4. username="admin"

  5. password="password"

  6. sr=DvwaPage(self.driver,self.url)

  7. sr.login_dvwa(username,password)

  8. sr.search("nick")

执行代码后会报错:

  sr=DvwaPage(self.driver,self.url)

E TypeError: ‘module’ object is not callable

原因分析:

Python导入模块的方法有两种:import 模块 和 from 模块 import *,前者导入后,在使用时需加上模块名的限定,而后者则不需要。

解决方式:

from myPytest.test_case import DvwaPage

sr=DvwaPage.DvwaPage(self.driver,self.url)

from myPytest.test_case.DvwaPage import *

sr=DvwaPage(self.driver,self.url)

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

          视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

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

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

相关文章

【Python报错已解决】No Python at ‘C:Users…Python Python39python.exe’

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一:检查Python安装路径2.2 …

Linux网络编程---传输层

一、重谈端口号 1、在 TCP/IP 协议中 , 用 " 源 IP", " 源端口号 ", " 目的 IP", " 目的端口号 ", " 协议号 " 这样一个五元组来标识一个通信 ( 可以通过netstat -n查看 ); 2、端口号的划分 0 - 1023: 知名端口号 , HTTP…

树莓派通过串口驱动LD3320语音模块

树莓派通过串口驱动LD3320语音模块 文章目录 树莓派通过串口驱动LD3320语音模块一、LD3320语音模块的认知1.1 模块参数:1.2 模块结构介绍:1.3 模块的串口连接:1.4 验货测试方法:1.5 配套程序识别语句修改方法: 二、树莓…

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等) 公众号:老苏畅谈运维 欢迎关注本人公众号,更多精彩与您分享…

Stream 流式编程

优质博文:IT-BLOG-CN 大家都知道可以将Collection类转化成流Stream进行操作(Map并不能创建流),代码变得简约流畅。我们先看下流的几个特点: 1、流并不存储元素。这些元素可能存储在底层的集合中,或者是按需…

信号与槽,QMainWindow中常用类的使用

QMainWindow菜单栏和工具栏 菜单栏,工具栏,状态栏,中心部件,铆接部件(浮动窗口) 菜单栏 //创建菜单栏QMenuBar *bar menuBar();//指定父组件this->setMenuBar(bar);this->resize(600,400);this-&g…

老师发布月考成绩的必备小程序

随着新学期的到来,教师们面临着诸多挑战,从课程规划到班级管理,再到学生的个别指导,每一项任务都至关重要。是否有工具能够帮助教师们在这些繁忙的事务中找到一丝轻松呢? “易查分”小程序正是为了解决这一问题而设计…

云原生学习交流

欢迎加入技术交流群&#xff0c;与阿里、腾讯、字节、华为等运维大佬面对面交流和互相学习。 请扫码备注 加群&#xff0c;<城市>-<公司/自由职业>-<昵称>&#xff0c;如“加群&#xff0c;广州-阿里-行则”&#xff1a;

基于SpringBoot的教师人事档案管理系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBootMyBatis 工具&#xff1a;IDEA/Eclipse、Navicat、Maven 系统展示 首页 教师管理 奖惩…

本地服务器部署Text generation并添加code llama实现远程多人协作

文章目录 前言1. 本地部署Text generation Web UI2. 安装CodeLlama大模型3. 实现公网远程使用Code Llama4. 固定Text generation Web UI公网地址 前言 本篇文章介绍如何在本地部署Text generation Web UI并搭建Code Llama大模型运行,并且搭建Code Llama大语言模型&#xff0c;…

关于HashMap的put方法

前言&#xff1a; HashMap的底层是数组加链表的形式实现&#xff0c;是线程不安全的&#xff0c;在jdk1.7之前put都是采用的头插法&#xff0c;但是使用头插法在多线程的环境下是有可能导致死循环&#xff0c;所以在jdk1.8就将put方法改成了尾插法。 1.产生死循环的原因&…

mfc140u.dll错误是什么情况?如何将mfc140u.dll丢失的解决方法详细分析

mfc140u.dll是 Microsoft Foundation Class (MFC) 库的一部分&#xff0c;通常与 Visual Studio 2015 及其后续版本相关联。如果系统中缺少 mfc140u.dll&#xff0c;可能会导致依赖该库的应用程序无法启动&#xff0c;并显示错误消息&#xff0c;如“程序无法启动&#xff0c;因…

AI预测福彩3D采取888=3策略+和值012路或胆码测试9月9日新模型预测第82弹

经过80多期的测试&#xff0c;当然有很多彩友也一直在观察我每天发的预测结果&#xff0c;得到了一个非常有价值的信息&#xff0c;那就是9码定位的命中率非常高&#xff0c;70多期一共只错了8次&#xff0c;这给喜欢打私房菜的朋友提供了极高价值的预测结果~当然了&#xff0c…

CCF推荐A类会议和期刊总结(计算机网络领域)- 2022

CCF推荐A类会议和期刊总结&#xff08;计算机网络领域&#xff09;- 2022 在中国计算机学会&#xff08;CCF&#xff09;的推荐体系中&#xff0c;A类会议和期刊代表着计算机网络领域的顶尖水平。这些会议和期刊不仅汇集了全球顶尖的研究成果&#xff0c;还引领着该领域的前沿发…

梨花声音研修院退费普通话学习对国际交流的影响

随着中国在国际舞台上的影响力不断增强&#xff0c;普通话在国际交流中的作用日益显著。普通话不仅是中国的国家通用语言&#xff0c;也是全球范围内越来越重要的一种交流工具。通过学习普通话&#xff0c;不仅可以促进国际合作、增强留学和旅游体验&#xff0c;还能拓展全球就…

哈希表,算法

哈希存储(散列存储) 为了快速定位数据 哈希表 哈希冲突 / 哈希矛盾 关键字不一样&#xff0c;但是映射之后结果一样 如何避免 哈希矛盾&#xff1f; 1、重新设计哈希函数&#xff0c;尽可能均匀散列分布在哈希表 2、开放定址法&#xff1a;向下寻找未存储的位置进行存放数…

【简历】 25届广州某二本JAVA简历:包装的实习经历是不能作为工龄的

注&#xff1a;为保证用户信息安全&#xff0c;姓名和学校等信息已经进行同层次变更&#xff0c;内容部分细节也进行了部分隐藏 简历说明 这是一份25届广州某二本学校的Java简历。校招备战上来第一任务就是要定校招层次&#xff0c;因为大中小公司的校招时间点要求、面试官的…

DevExpress WinForms中文教程:Data Grid - 如何自定义绘制?

在本教程中&#xff0c;您将学习如何使用DevExpress grid View&#xff08;网格视图&#xff09;的CustomDraw…事件&#xff0c;您将从一个显示普通任务数据的网格开始。首先使用事件来自定义单元格外观&#xff0c;然后修改相同的事件处理程序&#xff0c;来根据网格数据更改…

java 自定义注解校验实体类属性

直接上代码 1.是否启用参数校验注解 Target({ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Documented public interface EnableArgumentsCheck {/*** 是否启用*/boolean enable() default true;} 2.参数校验自定义注解 /*** 参数校验自定义注解* 属性定义&#…

打造企业专属品牌,就要跟上云微客短视频矩阵新风口

网红经济在经济发展中是一个周期性的事件&#xff0c;很多人还没有意识到短视频带货、直播带货等红利时&#xff0c;有一群人早就已经进去了。但是现在网红带货时代已经结束了&#xff0c;那么新的风口是什么呢&#xff1f; 其实找网红带货&#xff0c;看似是提高了销售业绩&am…