本文共 4394 字,大约阅读时间需要 14 分钟。
Page Object Models
Page对象模型在测试自动化领域越来越流行,它的出现为了改善测试维护性并减少代码重复。Page对象是一个面向对象的类,用于与页面的UI交互。使用Page对象的好处是,当页面的UI发生变化时,只需要修改Page对象中的代码即可,无需修改测试代码本身。
Page Object Benefits
使用Page对象具有以下优点:
Page Object Structure
Page对象的设计分为三个层级:
File夹名称中的备注信息仅供参考,请参阅下方图片。
common/basePage.py
以下是Page对象的一个示例类:
import loggingfrom . import pathPage as PGfrom selenium.webdriver.remote.webdriver import WebDriverfrom selenium.webdriver.support.wait import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECclass BasePage: def __init__(self, driver): self.driver = driver def page_waits(self, located, time_out, poll_frequency): """获取元素等待""" WebDriverWait(self.driver, time_out, poll_frequency).until(EC.visibility_of_element_located(located)) def page_element_exists(self, located, image): """判断页面元素是否存在""" try: WebDriverWait(self.driver, 20, 1).until(EC.presence_of_element_located(located)) except Exception as e: self.page_screenshot(image) logging.error(located) raise e return True def page_element(self, located, image): """获取元素""" try: ele = self.driver.find_element(*located) except Exception as e: self.page_screenshot(image) logging.error(ele) raise e return ele def page_click(self, located, image): """点击元素""" self.page_waits(located, 20, 1) ele_click = self.page_element(located, image) try: ele_click.click() except Exception as e: self.page_screenshot(image) logging.error(located) raise e def page_clear(self, location, image): """清空输入框""" self.page_waits(location, 20, 1) ele_clear = self.page_element(location, image) try: ele_clear.clear() except Exception as e: self.page_screenshot(image) logging.error(location) raise e def page_send_keys(self, location, text, image): """输入文本信息""" self.page_waits(location, 20, 1) ele_send_keys = self.page_element(location, image) try: ele_send_keys.send_keys(text) except Exception as e: self.page_screenshot(image) logging.error(location) raise e def page_text(self, location, image): """获取文本信息""" self.page_waits(location, 20, 1) ele_text = self.page_element(location, image) try: text_info = ele_text.text except Exception as e: self.page_screenshot(image) logging.error(text_info) raise e return text_info
elementHandle/baiduHandle.py
以下是对百度搜索页面的处理类:
from .basePage import BasePagefrom .elementLocalization import BaiDuSearchclass HandleBaiDu: def __init__(self, driver): self.driver = driver self.bd = BaiDuSearch() self.bp = BasePage(self.driver) def baidu_search(self, input_info): """执行百度搜索""" self.bp.page_send_keys(self.bd.search_input, input_info, '百度搜索输入框') self.bp.page_click(self.bd.baidu_click, '鼠标点击百度一下') def assert_search_result(self): """断言搜索结果""" return self.bp.page_element_is_exits(self.bd.assert_result, '断言搜索结果')
elementLocalization/baiduLoc.py
以下是百度搜索页面的元素定位配置:
from selenium.webdriver.common.by import Byclass BaiDuSearch: search_input = (By.XPATH, '//*[@id="kw"]') baidu_click = (By.XPATH, '//*[@id="su"]') assert_result = (By.XPATH, '//*[@class="res-gap-right16"]')
testCases/conftest.py
以下是测试环境配置:
import pytestimport timefrom selenium import webdriver@pytest.fixture(scope='session', name='pre')def pre_init(): """初始化测试环境""" driver = webdriver.Chrome() driver.get('https://www.baidu.com/') driver.maximize_window() time.sleep(2) yield driver time.sleep(2) driver.quit()
testCases/test_baiduSearch.py
以下是百度搜索测试用例:
import pytestfrom .elementHandle import HandleBaiDuclass TestBaiduSearch: def test_baidu_search(self, pre): """百度搜索测试用例""" HandleBaiDu(pre).baidu_search('baidu') result = HandleBaiDu(pre).assert_search_result() print(result)
以上代码仅供参考,可根据实际需求进行调整和扩展。Pytest框架用于测试编写,你也可以创建入口文件并运行用例生成测试报告。
转载地址:http://bidvz.baihongyu.com/