Python自动化测试学习—PO设计模式详解

2022-08-21 14:39:42

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

PO设计模式

一、PO设计模式的优点

PO模式有以下优点:

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

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

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

二、非PO设计模式

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

test_logintest.py代码,直接执行所有的流程操作,不做任何封装fromtimeimportsleepimportpytestfromseleniumimportwebdriverfromselenium.webdriver.common.keysimportKeysclassTest_logintest():deftest_1(self):driver=webdriver.Firefox()driver.get("http://10.5.1.247/dvwa/login.php")sleep(1)driver.find_element_by_name("username").send_keys("admin")driver.find_element_by_name("password").send_keys("password")driver.find_element_by_name("Login").click()sleep(2)driver.find_element_by_link_text("XSS (Reflected)").click()sleep(2)driver.find_element_by_name("name").send_keys("nick")sleep(1)driver.find_element_by_xpath("//input[@value='Submit']").click()sleep(1)

ifname == ‘main’:

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

三、PO设计模式

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

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

BasePage.py代码:fromselenium.webdriver.common.byimportByclassBasePage(object):def__init__(self,driver,url=None):self.driver=driverself.url=urlifself.url!=None:self.driver.get(self.url)defby_name(self,id):locator=(By.NAME,id)ele=self.driver.find_element(*locator)returneledefby_linktext(self,linktext):locator=(By.LINK_TEXT,linktext)ele=self.driver.find_element(*locator)returneledefby_xpath(self,xpath):locator=(By.XPATH,xpath)ele=self.driver.find_element(*locator)returnele

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

DvwaPage.py代码:fromtimeimportsleepfrommyPytest.test_case.BasePageimport*classDvwaPage(BasePage):defusernameText(self):ele=self.by_name("username")returneledefpasswordText(self):ele=self.by_name("password")returneledeflinkText(self):ele=self.by_linktext("XSS (Reflected)")returneledefSubmit(self):ele=self.by_name("Login")returneledeflogin_dvwa(self,username,password):self.usernameText().send_keys(username)self.passwordText().send_keys(password)self.Submit().click()sleep(2)defsearch(self,str):#这里是通过调用linkText方法self.linkText().click()#这里是直接调用by_name函数self.by_name("name").send_keys(str)sleep(1)#这里是直接调用by_xpath函数self.by_xpath("//input[@value='Submit']").click()sleep(1)

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

test_loginDvwa.py代码:importpytestfrommyPytest.test_case.DvwaPageimport*fromseleniumimportwebdriverclassTest_loginDvwa():deftest_login(self):self.driver=webdriver.Firefox()self.url="http://10.5.1.247/dvwa/login.php"username="admin"password="password"sr=DvwaPage(self.driver,self.url)sr.login_dvwa(username,password)sr.search("nick")

ifname == ‘main’:

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

执行结果如下:

在这里插入图片描述

四、错误原因排查

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

程序代码 :

importpytestfrommyPytest.test_caseimportDvwaPagefromseleniumimportwebdriverclassTest_loginDvwa():deftest_login(self):self.driver=webdriver.Firefox()self.url="http://10.5.1.247/dvwa/login.php"username="admin"password="password"sr=DvwaPage(self.driver,self.url)sr.login_dvwa(username,password)sr.search("nick")

执行代码后会报错:

>sr=DvwaPage(self.driver,self.url)ETypeError:'module'objectisnotcallable

原因分析:

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

解决方式:

frommyPytest.test_caseimportDvwaPagesr=DvwaPage.DvwaPage(self.driver,self.url)

frommyPytest.test_case.DvwaPageimport*sr=DvwaPage(self.driver,self.url)
  • 作者:python学习路线
  • 原文链接:https://blog.csdn.net/LuBanXue/article/details/111708423
    更新时间:2022-08-21 14:39:42