首页 > 技术文章 > selenium-web自动化(po模型)

djl-0628 2021-06-24 21:59 原文

什么是po模型呢?简单理解就是:把每个页面当成一个对象,给这些页面当成一个类,主要就是完成元素定位和业务操作;把它和测试脚本区分开来,需要什么取这些页面类去调用即可。这样的好处在于页面元素发生变化时,只需要去维护页面类即可,其他部分就不用管。


PO:指测试页面和测试脚本分离,即页面封装成类,供测试脚本进行调用

项目架构如下:

base基类(所有页面公共方法的二次封装)

'''
所有页面公共方法的二次封装
在脚本中加入太多的sleep后会影响脚本的执行速度
driver:返回浏览器的一个实例
timeout:超时的总时长
poll_frequency:循环去查询的间隙时间,默认0.5s

'''
from selenium.webdriver.support.wait import WebDriverWait


class BaseAction():
    '''
    基类
    '''
    def __init__(self,driver):
        self.driver = driver

    def find_element(self,feature,timeout=10,poll=2):
        '''方法内部去调用系统的定位元素'''
        return WebDriverWait(self.driver, timeout, poll).until(lambda x: x.find_element(*feature))

    def send_keyword(self,feature,text,timeout=10,poll=2):
        '''输入内容'''
        self.find_element(feature,timeout,poll).send_keys(text)

    def get_text(self,feature,timeout=10,poll=2):
        '''获取元素的文本内容'''
        return self.find_element(feature,timeout,poll).text

    def click_element(self,feature,timeout=10,poll=2):
        '''点击元素'''
        self.find_element(feature,timeout,poll).click()

    def clear_element(self,feature,timeout=10,poll=2):
        '''清空元素'''
        self.find_element(feature,timeout,poll).clear()

    def get_element(self,feature,timeout,poll):
        '''返回定位到的元素'''
        return self.find_element(feature,timeout,poll)

页面元素查找类 page

'''
By是selenium中内置的一个class,在这个class中有各种方法来定位元素

'''
from selenium.webdriver.common.by import By
from base.base_action import BaseAction

class AssignworkPage(BaseAction):
    #一个def是一个动作我们在case中调用这个方法即可对页面进行操作

    #点击作业中心
    center_work = By.LINK_TEXT,'作业中心'
    #点击布置作业
    bz_work = By.XPATH,'//*[@id="app"]/main/div/div[2]/div[1]/div[1]/div/button[1]'
    def click_centerwork(self):
        self.click_element(self.center_work)

    def work_bz(self):
        self.click_element(self.bz_work)

测试case类

import unittest,json
from time import sleep
from selenium import webdriver
from page.assign_homeorkpage import AssignworkPage
from selenium.webdriver.common.action_chains import ActionChains

class Work_Build(unittest.TestCase):
    def setUp(self):
        str = ''
        with open('../common/bk.json', 'r', encoding='utf-8') as f:
            listCookies = json.loads(f.read())
        cookie = [item["name"] + "=" + item["value"] for item in listCookies]
        cookiestr = '; '.join(item for item in cookie)
        # print(listCookies)
        self.driver = webdriver.Chrome('../common/chromedriver.exe')
        self.driver.get('url')
        # driver.get('https://hte.hexfuture.net/#/inCourse/hte/')
        for cookie in listCookies:
            if 'expiry' in cookie:
                del cookie['expiry']
            self.driver.add_cookie(cookie)
        self.driver.get('url')

        self.assign_Homeworkpage = AssignworkPage(self.driver)


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


    def test_successbuildwork(self):
        '''布置作业主流程'''
        #点击作业中心
        self.assign_Homeworkpage.click_centerwork()



       
        # assert self.indexPage.get_start_go_to_class_text() == "开始上课"

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


base文件夹下存放着最基础的页面元素方法,例如get_element,send_keys,clear,click等页面操作事件
page文件夹则存放着在我们需要操作页面的操作的xpath事件,一个def是一个事件。例如点击作业中心
scripts下则只存放测试用例

推荐阅读