ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

自动化测试之Page Object

2022-07-03 20:35:00  阅读:196  来源: 互联网

标签:self Object driver Page class 自动化 Element id def


1、UI自动化中存在的问题

2、PO模式

 

3、poium 测试库


 

1、UI自动化中存在的问题

  当为 Web 页面编写测试时,需要操作该 Web 页面上的元素。然而,如果在测试代码中直接操作 Web 页面上的元素,那么这样的代码是极其脆弱的,因为 UI 会经常变动。

  举例:假设要对一个元素进行点击操作,而且会经常对该元素进行操作,那么你就可能会编写多处如下代码。

driver.find_element_by_id("login-btn").click()

  存在的问题:

  1. 如果开发人员修改了这个元素的id,这时候你就不得不修改所有对应的代码

  2. 存在大量冗余代码

 

2、PO模式

  核心思想是通过对界面元素的封装减少冗余代码,同时在后期维护中,若元素定位发生变化, 只需要调整页面元素封装的代码,提高测试用例的可维护性、可读性。

  PO模式可以把一个页面分为三层,对象库层、操作层、业务层。

  1. 对象库层:封装定位元素的方法。

  2. 操作层:封装对元素的操作。

  3. 业务层:将一个或多个操作组合起来完成一个业务功能。比如登录:需要输入帐号、密码、点击登录三个操作。

 

  创建base.py(对象库层),封装定位元素的方法。

import time

class BasePage:
 """
 基础 Page 层,封装一些常用方法
 """
 def __init__(self, driver):
    self.driver = driver

 # 打开页面
 def open(self, url=None):
    if url is None:
        self.driver.get(self.url)
    else:
        self.driver.get(url)

 # id 定位
 def by_id(self, id_):
    return self.driver.find_element_by_id(id_)

 # name 定位
 def by_name(self, name):
    return self.driver.find_element_by_name(name)

 # class 定位
 def by_class(self, class_name):
    return self.driver.find_element_by_class_name(class_name)

 # XPath 定位
 def by_xpath(self, xpath):
    return self.driver.find_element_by_xpath(xpath)

 # CSS 定位
 def by_css(self, css):
    return self.driver.find_element_by_css_selector(css)

 # 获取 title
 def get_title(self):
     return self.driver.title

# 获取页面 text,仅使用 XPath 定位
 def get_text(self, xpath):
     return self.by_xpath(xpath).text

# 执行 JavaScript 脚本
 def js(self, script):
     self.driver.execute_script(script)

  1. open()方法用于打开网页,它接收一个 url 参数,默认为 None。如果 url 参数为None,则默认打开子类中定义的 url。稍后会在子类中定义 url 变量。  

  2. by_id()和 by_name()方法。我们知道,Selenium 提供的元素定位方法很长,这里做了简化,只是为了在子类中使用更加简便。  

  3. get_title()和 get_text()方法。这些方法是在写自动化测试时经常用到的方法,也可以定义在 BasePage 类中。需要注意的是,get_text()方法需要接收元素定位,这里默认为 XPath 定位。 

 

  创建baidu_page.py(操作层),封装对元素的操作。

from base import BasePage

class BaiduPage(BasePage):
    """百度 Page 层,百度页面封装操作到的元素"""
    url = "https://www.baidu.com"

    def search_input(self, search_key):
        self.by_id("kw").send_keys(search_key)

    def search_button(self):
        self.by_id("su").click()

  1. 创建 BaiduPage.py 类继承 BasePage 类,定义 url 变量,供父类中的 open()方法使用。

  2. 在 search_input()和 search_button()方法中使用了父类的 self.by_id()方法来定位元素。

 

  创建baidu_test.py(业务层),编写测试用例,封装一系列操作。
import unittest
from time import sleep
from selenium import webdriver
from baidu_page import BaiduPage

class TestBaidu(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        cls.driver = webdriver.Chrome()

    def test_baidu_search_case(self):
        page = BaiduPage(self.driver)
        page.open()
        page.search_input("selenium")
        page.search_button()
        sleep(2)
        self.assertEqual(page.get_title(), "selenium_百度搜索")

    @classmethod
    def tearDownClass(cls):
        cls.driver.quit()

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

 

 


3、poium 测试库

  pip 安装

pip install poium

  使用教程:

  使用 poium 重写 baidu_page.py

from base import BasePage
from poium import Page, Element


class BaiduPage(BasePage):
    """百度 Page 层,百度页面封装操作到的元素"""
    search_input = Element(id_="kw")
    search_button = Element(id_="su")

  在baidu_test.py 中改写如下:

import unittest
from time import sleep
from selenium import webdriver
from baidu_page import BaiduPage


class TestBaidu(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        cls.driver = webdriver.Chrome()

    def test_baidu_search_case(self):
        page = BaiduPage(self.driver)
        page.open("https://www.baidu.com")
        page.search_input = "selenium"
        page.search_button.click()
        sleep(2)
        self.assertEqual(page.get_title(), "selenium_百度搜索")

    @classmethod
    def tearDownClass(cls):
        cls.driver.quit()

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

  1、poium支持的定位方法

from poium import Page, Element


class SomePage(Page):
    elem_id = Element(id_='id')
    elem_name = Element(name='name')
    elem_class = Element(class_name='class')
    elem_tag = Element(tag='input')
    elem_link_text = Element(link_text='this_is_link')
    elem_partial_link_text = Element(partial_link_text='is_link')
    elem_xpath = Element(xpath='//*[@id="kk"]')
    elem_css = Element(css='#id')

  2、设置元素超时时间

  通过 timeout 参数可设置元素超时时间,默认为 10s。

from poium import Page, Element

class BaiduPage(Page):
    search_input = Element(id_='kw', timeout=5)
    search_button = Element(id_='su', timeout=30)

  3、设置元素描述

  当一个 Page 类中定义的元素非常多时,必须通过注释来增加可读性,这时可以使用describe 参数。

from poium import Page, Element

class LoginPage(Page):
     """
     登录 Page 类
     """
     username = Element(css='#loginAccount', describe="用户名")
     password = Element(css='#loginPwd', describe="密码")

  4、定位一组元素

  当我们要定位一组元素时,可以使用 PageElements 类。

from poium import Page, Elements

class ResultPage(Page):
    # 定位一组元素
    search_result = Elements(xpath="//div/h3/a")

 

标签:self,Object,driver,Page,class,自动化,Element,id,def
来源: https://www.cnblogs.com/mtoy/p/16440501.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有