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():

def test_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)

if name == ‘main’:

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

三、PO设计模式

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

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

BasePage.py代码:

from selenium.webdriver.common.by import By

class BasePage(object):

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

    self.driver=driver

    self.url=url

    if self.url!=None:

        self.driver.get(self.url)



def by_name(self,id):

    locator=(By.NAME,id)

    ele=self.driver.find_element(*locator)

    return ele



def by_linktext(self,linktext):

    locator=(By.LINK_TEXT,linktext)

    ele=self.driver.find_element(*locator)

    return ele



def by_xpath(self,xpath):

    locator=(By.XPATH,xpath)

    ele=self.driver.find_element(*locator)

    return ele

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

DvwaPage.py代码:

from time import sleep

from myPytest.test_case.BasePage import *

class DvwaPage(BasePage):

def usernameText(self):

    ele=self.by_name("username")

    return ele

def passwordText(self):

    ele=self.by_name("password")

    return ele

def linkText(self):

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

    return ele

def Submit(self):

    ele =self.by_name("Login")

    return ele



def login_dvwa(self,username,password):

    self.usernameText().send_keys(username)

    self.passwordText().send_keys(password)

    self.Submit().click()

    sleep(2)



def search(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代码:

import pytest

from myPytest.test_case.DvwaPage import *

from selenium import webdriver

class Test_loginDvwa():

def test_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")

if name == ‘main’:

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

执行结果如下:

python自动化测试学习-PO设计模式_压力测试

1.jpg

四、错误原因排查

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

程序代码 :

import pytest

from myPytest.test_case import DvwaPage

from selenium import webdriver

class Test_loginDvwa():

def test_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)

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)

python自动化测试学习-PO设计模式_压力测试_02
上面是我收集的一些视频资源,在这个过程中帮到了我很多。如果你不想再体验一次自学时找不到资料,没人解答问题,坚持几天便放弃的感受的话,可以加入我们扣扣群【313782132 】,里面有各种软件测试资源和技术讨论。

python自动化测试学习-PO设计模式_python_03
当然还有面试,面试一般分为技术面和hr面,形式的话很少有群面,少部分企业可能会有一个交叉面,不过总的来说,技术面基本就是考察你的专业技术水平的,hr面的话主要是看这个人的综合素质以及家庭情况符不符合公司要求,一般来讲,技术的话只要通过了技术面hr面基本上是没有问题(也有少数企业hr面会刷很多人)
我们主要来说技术面,技术面的话主要是考察专业技术知识和水平,上面也是我整理好的精选面试题。

推荐好文:

软件自动化测试工具有哪些?手工测试与自动化测试应用场景区别

【Python】自动化测试的7个步骤

自动化软件测试面试题(面试前准备篇)

【Python】自动化测试的7个步骤

论初学者自动化测试–终极指南

加油吧,测试人!如果你需要提升规划,那就行动吧,在路上总比在起点观望的要好。事必有法,然后有成。

资源不错就给个推荐吧~