从零开始搭建WEB自动化框架04 —— 页面类

更多内容请查看:
从零开始搭建WEB自动化框架01 —— Pytest 使用
从零开始搭建WEB自动化框架02 —— POM 设计模式
从零开始搭建WEB自动化框架03 —— 元素类

本系列学习文章适合的对象为已经掌握 Selenium 基础用法,并有一定实践经验的同学。同时,希望你可以理解 Page Object Model 设计模型。

现在,基础的元素,Pytest框架已经都搭建好了,但是我们的整个框架依然非常的单薄,并没有任何实质性的内容呈现。
所以,接下来我们需要针对这个P(Page)做一个类化,让更实际的内容填充到框架中。
Page内容并不会全部展示,有兴趣的可以移步github查看。

上一篇文章已经提到过了,什么是类?

类就是具体事务中提取出来的共性。

元素都会有自己的标签,各种属性,所以我们可以依据这一点,整理出一个基础元素类 Element ,那同样的,页面也都有自己的共性,在做具体页面的内容时,我们需要先将这些页面的共性提取出来,做一个公共页面类 PageBase。

每个公司的产品都有自己的特性、适配的操作系统等,我也是根据当前的情况做了一个提炼,更多的共性需要各位自己去挖掘。

class PageCommon(object):

    def __init__(self, ed_driver):
        self._ed_driver = ed_driver
        self._cur_dur = 0
        self._focus = None

    def close(self):
        self._ed_driver.close()
        self._ed_driver.switch_to.window(self._ed_driver.window_handles[-1])

    def scroll_top(self, dur=300):
        fact_dur = self._cur_dur - dur
        js = "var q=document.documentElement.scrollTop={}".format(fact_dur)
        self._ed_driver.execute_script(js)
        self._cur_dur = fact_dur if fact_dur > 0 else 0

    def scroll_bottom(self, dur=300):
        fact_dur = self._cur_dur + dur
        js = "var q=document.documentElement.scrollTop={}".format(fact_dur)
        self._ed_driver.execute_script(js)
        self._cur_dur = fact_dur

我公司是以Web为主,所以以上代码更适合Web端。当然还有更多特性是基于业务的,所以就没有都写出来。

这里面有一个很关键的地方,就是它的入参:ed_driver。

它代表了当前的页面、元素、操作是归属于哪个浏览器的,在并行测试时,这个非常重要,可以明确你的测试指令发送到哪个浏览器中。

driver 的获取属于基础操作,如果不理解的话可能需要回去再看一下 Selenium 初始化相关的内容。

当拥有基类后,所有页面都应该继承这个页面。

当然,也可能你有一个基类,但是基于业务形态,可能会有更多的次基类以适配不同的业务,这些就需要自行探索如何设置继承了。

class StartProcessPage(PageCommon):

    def __init__(self, ed_driver):
        super().__init__(ed_driver)

        self.start_btn = Button(self._ed_driver, By.XPATH, ct.XPATH_SP_START_BTN)
        self.start_time_input = InputView(self._ed_driver, By.XPATH, ct.XPATH_SP_START_TIME_INPUT)

接下来就是设置具体页面,并且在页面中初始化元素。

从这里就可以看出来,我们的页面其实是承载元素的,而具体的操作则在各自元素中已经进行了定义,做到了完全的分离。
(详细可以见元素篇)

使用时,可以直接元素+操作的形式。

spp = StartProcessPage(driver)
spp.start_time_input.input("xxxx")
spp.start_btn.click()

这样,一个非常简单的测试操作就已经完成了

当然,以上的设置都是基于最小颗粒度去进行的,当应用到实际业务时,还可以有更多的适配。

比如将常用操作封装到一个方法中:

def start_process(self):
    self.start_time_input.input("xxxx")
    self.start_btn.click()

更多操作可以参考一下其他人的文章,在页面类中,其实可以变通的地方是非常多的,它主要是明确一下,我们的操作都是基于页面而展开的,这样在可读性、维护上都很有优势。

当有了页面信息、页面元素、一些基础操作集合之后,一个页面类大体就完成了,通过上面的操作已经可以开始进行流程操作了,它甚至已经可以开始承载我们的自动化测试了,比如:

def test_start_a_order(self, driver):
    spp = StartProcessPage(driver)
    op = OrderPage(driver)
    with step('开始一个订单'):
        op.click_start_process_btn()
        spp.start_process()
        op.check_order_is_started()

但是好像还缺点东西,比如说操作日志好像没有?

你可能感兴趣的:(从零开始搭建WEB自动化框架04 —— 页面类)