36、Selenium Page Objects 思想

UI自动化的页面对象思想很重要,可以说是一个项目自动化是否成功的关键。

今天我们来细细的说下为什么如此。


一、系统发生了变化

看到一句话,说的特别有道理:“事实上,你的系统发生变化是必然的;这说明他在改进”


假设我们写了很多自动化测试用例,这时候系统发生了变化:

1、之前有10条case中用到了A元素,但现在A元素定位xpath发生了变化;——这时候你需要修改10条case中定位A元素的代码

2、之前有10条case中用到了B元素的点击动作,但现在B元素的单击操作变成了需要下拉选择;——这时候你需要调整10条case中对B元素的动作


这么说大家应该能明白了,我们自动化为什么会失败?不是因为系统变化,而是因为系统一点点变化导致我们需要大量的调整,维护成本太高,所以失败。如果我们的测试代码足够灵活呢?页面元素定位方式发生了变化,不管多少case用到了这个元素,我们都只需要改变一个地方,就能让自动化正确运行。


二、改进测试代码

1、原始用例

from selenium import webdriver
from time import sleep
import unittest

class LoginTest(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.driver.implicitly_wait(20)
        self.driver.maximize_window()
        self.driver.get("http://localhost:81/redmine/login")

    def test_login1(self):
        self.driver.find_element_by_id('username').send_keys('admin')
        self.driver.find_element_by_id('password').send_keys('test1234')
        self.driver.find_element_by_id('login-submit').click()
        sleep(2)
        ele = self.driver.find_element_by_xpath('//*[@id="loggedas"]/a').text
        self.assertEqual(ele,'admin')

    def tearDown(self):
        self.driver.quit()

2、将locators 从测试代码中分离出来

新建redmine_locators.py文件

'''
将所有元素,按页面保存在不同的class下面
'''

from selenium.webdriver.common.by import By

class LoginPageLocators():
    UserName = (By.ID, "username") #用户名
    Password = (By.ID, "password") #密码框
    LoginSubmit = (By.ID, "login-submit")  #登录按钮
    LoginName = (By.XPATH, '//*[@id="loggedas"]/a') #登录后的用户名显示

class NewProject():
    pass

测试用例代码变更如下:

from selenium import webdriver
from time import sleep
import unittest
from three.redmine_locators import LoginPageLocators

class LoginTest(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.driver.implicitly_wait(20)
        self.driver.maximize_window()
        self.driver.get("http://localhost:81/redmine/login")

    def test_login1(self):
        self.driver.find_element(*LoginPageLocators.UserName).send_keys('admin')
        self.driver.find_element(*LoginPageLocators.Password).send_keys('test1234')
        self.driver.find_element(*LoginPageLocators.LoginSubmit).click()
        sleep(2)
        ele = self.driver.find_element(*LoginPageLocators.LoginName).text
        self.assertEqual(ele,'admin')

    def tearDown(self):
        self.driver.quit()
可以看到,不管有多少用例,只要用到了登录页的元素,定位方式都从redmine_locators.py文件中对应的类下面寻找。一旦某个页面的元素定位方式变化,我们只需要改 redmine_locators.py文件下面的对应元素即可。


3、将page 元素动作和代码分离出来

新建redmine_page.py

from selenium import webdriver
from time import sleep
from three.redmine_locators import LoginPageLocators

class BasePage():
    def __init__(self,driver):
        self.driver = driver

class LoginPage(BasePage):
    def enter_username(self):
        ele = self.driver.find_element(*LoginPageLocators.UserName)
        ele.send_keys('admin')

    def enter_password(self):
        ele = self.driver.find_element(*LoginPageLocators.Password)
        ele.send_keys('test1234')

    def click_login(self):
        ele = self.driver.find_element(*LoginPageLocators.LoginSubmit)
        ele.click()

    def get_login_name(self):
        ele = self.driver.find_element(*LoginPageLocators.LoginName)
        return ele.text

class XxxPage(BasePage):
    pass

上面,我们把输入用户名、输入密码、点击登录按钮,都封装成一个方法

测试代码变更如下:

from selenium import webdriver
import unittest
from three.redmine_page import LoginPage

class LoginTest(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.driver.implicitly_wait(20)
        self.driver.maximize_window()
        self.driver.get("http://localhost:81/redmine/login")

    def test_login1(self):
        loginpage = LoginPage(self.driver) #实例化登录页面对象
        loginpage.enter_username()
        loginpage.enter_password()
        loginpage.click_login()
        ele = loginpage.get_login_name()
        self.assertEqual(ele,'admin')

    def tearDown(self):
        self.driver.quit()
比如这时候,登录框需要先clear一下,再输入内容。有10个用例用到了登录操作也不怕,我们只需要修改redmine_page.py即可,如下:

from selenium import webdriver
from time import sleep
from three.redmine_locators import LoginPageLocators

class BasePage():
    def __init__(self,driver):
        self.driver = driver

class LoginPage(BasePage):
    def enter_username(self):
        ele = self.driver.find_element(*LoginPageLocators.UserName)
        ele.clear()
        ele.send_keys('admin')

    def enter_password(self):
        ele = self.driver.find_element(*LoginPageLocators.Password)
        ele.clear()
        ele.send_keys('test1234')

    def click_login(self):
        ele = self.driver.find_element(*LoginPageLocators.LoginSubmit)
        ele.click()

    def get_login_name(self):
        ele = self.driver.find_element(*LoginPageLocators.LoginName)
        return ele.text

class XxxPage(BasePage):
    pass

4、现在来看,我们将locators、page ele操作、case分离开了,互不干扰。

(1)如果页面元素定位发生变化,则去locators文件,找到相对应的元素,改一下即可;

(2)如果页面元素的操作发生了变化(比如前面的,输入框需要增加一步,先clear再send_keys),我们就去page页面,找对应的操作,改一下即可;

(3)如果测试逻辑发生了变化(比如,我想测试不输入用户名,直接输入密码,然后点击登录按钮),则直接去对应的case.py文件,找到对应的步骤,改一下即可;


上面的分层可以实现的好处:

(1)所有页面元素定位器,放到一个文件维护,相同界面的元素在一个类下;

(2)所有页面元素的操作,放到一个文件维护,相同界面的元素操作放到一个类下;

(3)测试用例只根据自己的需要,调用对页面元素的操作即可。


已标记关键词 清除标记
<div style="color:#313131;font-size:16px;"> 课程介绍 </div> <p> <br /> </p> <p> <span><span style="font-size:16px;">你是否在寻找机会进入</span><span style="color:#E67E22;font-size:16px;">自动化测试领域</span><span style="font-size:16px;">?</span></span> </p> <p> <span><span style="font-size:16px;">你是否渴望学习selenium webdriver + Java以及</span><span style="color:#E67E22;font-size:16px;">最新的框架和技术</span><span style="font-size:16px;">进行web自动化测试?</span></span> </p> <p> <span><span style="font-size:16px;">你是否感兴趣</span><span style="color:#E67E22;font-size:16px;">学习Selenium</span><span style="font-size:16px;">如何用在你现有的项目里的?</span></span> </p> <p> <span style="font-size:16px;">这门课带你从Selenium搭建环境开始讲起,然后学习selenium,TestNG, logback, maven, jenkins。</span> </p> <p> <span><span><span style="font-size:16px;">我们假设学员没有任何自动化经验,来设计的这套课程。每个课题都</span><span style="color:#E67E22;font-size:16px;">从最基础的开始</span><span style="font-size:16px;">讲起。</span><span style="color:#E67E22;font-size:16px;">Selenium相关的该覆盖的课题都覆盖了。</span></span></span> </p> <p> <span><span style="font-size:16px;">例子都是来自于</span><span style="color:#E67E22;font-size:16px;">真实的web应用项目</span><span style="font-size:16px;">,帮助你理解不同的组件怎么用上自动化,这将展示给你一个行业层面的框架,增加自信心。</span></span> </p> <p> <span><span style="color:#E67E22;font-size:16px;">全网没有其他课程像这门课涵盖到如此之深的细节</span><span style="font-size:16px;">。</span></span> </p> <p> <span><span style="font-size:20px;"><span>您将会学到什么</span></span></span> </p> <ul> <li> <span style="font-size:16px;">学完课程以后,你将拥有完整的Selenium Webdriver知识</span> </li> <li> <span style="font-size:16px;">你将具备从头开始设计Page Object、Page Factory、DATADRIVEN等搭建自动化框架的能力</span> </li> <li> <span><span style="font-size:16px;">用100多个实例对Selenium现实</span><span style="font-size:16px;">场景应用进行深入理解</span></span> </li> <li> <span style="font-size:16px;">全面了解TestNG, Maven, Jenkins, HTML报告,多浏览器并行测试</span> </li> <li> <span style="font-size:16px;">了解数据库测试和使用Selenium进行性能测试</span> </li> <li> <span style="font-size:16px;">你将彻底了解testNG框架</span> </li> <li> <span style="font-size:16px;">你从网上随便选择一个网站,都可以实现自动化,用所有可能的测试用例进行自动化测试</span> </li> <li> <span style="font-size:16px;">将提高你的编码技能,以编写最优化的自动化测试用例代码</span> </li> <li> <span style="font-size:16px;">你基本可以搞定任何Selenium面试,并能从设计阶段开始领导整个Selenium自动化项目</span> </li> <li> <span style="font-size:16px;">你应该能够使用应用程序的GUI来验证数据完整性</span> </li> <li> <span style="font-size:16px;">你将能够创建漂亮的报告来打动客户或领导</span> </li> <li> <span style="font-size:16px;">更深入地理解自动化指南和代码质量标准</span> </li> <li> <span style="font-size:16px;">会附带一个练习网站,可以用上所有可用的WebDriver功能,实现自动化</span> </li> </ul> <p> <span style="font-size:20px;"><span style="color:#3498DB;"><span>【适合人群】</span></span></span> </p> <ul> <li> <span style="font-size:16px;">软件手动测试人员想转为自动化测试的人员</span> </li> <li> <span style="font-size:16px;">自动化软件测试人员想加强专业技能的</span> </li> <li> <span style="font-size:16px;">刚毕业学生想从事软件行业</span> </li> <li> <span style="font-size:16px;">QA 组长或项目经理</span> </li> </ul> <p> <span style="color:#3498DB;"><span style="font-size:20px;"><span>【课程优势】</span></span></span> </p> <p> <span style="font-size:16px;">学完课程以后,你将拥有完整的Selenium Webdriver知识</span> </p> <p> <span style="color:#3498DB;"><span style="font-size:20px;"><span>【讲师介绍】</span></span></span> </p> <p> <span style="font-size:16px;"><span style="color:#E67E22;"><span>资质介绍:</span></span></span> </p> <p> <span style="font-size:16px;">12年以上软件测试工作经验,其中7年以上自动化测试开发经验</span> </p> <p> <span style="font-size:16px;">新书“Python3+Selenium3自动化测试项目实战”作者</span> </p> <p> <span><br /> </span> </p> <p> <img src="https://img-bss.csdn.net/201912160910055665.jpg" alt="" /><img src="https://img-bss.csdn.net/201912160910249590.jpg" alt="" /><img src="https://img-bss.csdn.net/201912160910311596.jpg" alt="" /> </p> <br /> <br />
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页