【python+selenium-03】UI自动化测试的PageObjectModule驱动

接上一篇,我们提到了关键字驱动,并且体会了它的好处。

本文讲到另外一种驱动--PageObjectModule即POM驱动,也就是"页面驱动"。

 

页面驱动,实际上是对selenium提供的基本方法进行二次封装,以达到简化调用的目的。

大概是从代码片段A:

from selenium import webdriver
from time import sleep

driver = webdriver.Firefox()
driver.implicitly_wait(30)

driver.get("http://www.baidu.com")

driver.find_element_by_id("kw").send_keys("python")
driver.find_element_by_id("su").click()
sleep(3)
driver.quit()

进化到了代码片段B:

from auto.tool.webui_autotest import *
from time import sleep

driver = WebUIInit("firefox", "http://www.baidu.com")
driver.send_keys("id", "kw", "python")
driver.click("id", "su")
sleep(3)
driver.quit()

 

而POM驱动,则是以具体的每个页面为单元,大致分为三个层级:

第一层:基础层

from time import sleep


# PO模式的第1层,定义页面的基础类,所有页面都要继承该类
class BasePage(object):
    def __init__(self, driver, url):
        self.driver = driver
        self.url = url

    def open(self):
        self.driver.get(self.url)

    def locator_element(self, *locator):
        ele = self.driver.find_element(*locator)
        return ele

    def quit(self):
        sleep(2)
        self.driver.quit()

 

第二层:页面层

from auto.Base.base_page import *
from selenium.webdriver.common.by import By
from selenium import webdriver


# PO模式的第2层:页面层(主要是页面元素的定位方式及定位,以及针对不同元素的不同操作)
class SearchPage(BasePage):
    input_id = (By.ID, "kw")
    click_id = (By.ID, "su")

    # 定位搜索内容的填入
    def input_text(self, text):
        self.locator_element(*self.input_id).send_keys(text)

    # 定位百度一下按钮,点击一下
    def click_element(self):
        self.locator_element(*self.click_id).click()

 

第三层:业务层

import unittest
from auto.PageObject.search import *
from ddt import ddt, data


# PO模式的第3层,业务层
@ddt
class PageObjectUnit(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.driver.implicitly_wait(8)

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

    @data("http://www.baidu.com")
    def test_01(self, url):
        self.sp = SearchPage(self.driver, url)
        self.sp.open()
        self.sp.input_text("python")
        self.sp.click_element()


if __name__ == '__main__':
    unittest.main()

 

至于选择关键字驱动,还是POM驱动,还得各位小伙伴根据各自实际的需求出发,考虑以下几点,综合评估:

  • 业务场景:自动化测试代码,最终一定是要大批量执行的,绝不是单独的1条或者2条,所以是基于主要流程,还是基于很复杂的很多流程,这关系到框架的选择与调整;
  • 维护成本:结合单位具体的实际情况,哪些页面会经常变动,会经常变动哪些内容,如何才能更高效的完成维护;
  • 未来趋势:这个未来趋势,并不是自动化框架上的趋势,而是公司未来的技术发展方向。

 

记住一句话,适合的才是最好的!那,什么才是"适合"的呢?

 

posted @ 2021-02-01 21:51  愚人李愚  阅读(124)  评论(0编辑  收藏  举报