公共方法篇
用例生成

页面封装

test
pages
basePage.py
基础页面封装

# -*-coding:utf-8-*-
import os
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
class BasePage(object):"""基础页面"""def __init__(self, driver=None, base_url=None):"""基础的参数,webdriver、默认访问的url:param driver: 浏览器驱动:param base_url: 默认打开url,一般都是登录页面"""if driver is None:current_path = os.path.abspath(os.path.dirname(__file__))driver_path = current_path + '/../../drivers/chromedriver.exe'self.driver = webdriver.Chrome(driver_path)else:self.driver = driverif base_url is None:self.base_url = 'http://localhost:21248/#/'else:self.base_url = base_url# 设置默认打开的页面self.open_page()def open_page(self):"""打开默认页面"""self.driver.maximize_window()self.driver.implicitly_wait(10)self.driver.get(self.base_url)sleep(1)def close_page(self):"""关闭页面"""return self.driver.close()def quit_driver(self):"""关闭页面并且退出程序"""return self.driver.quit()def find_element(self, by, element):"""返回单个定位元素"""sleep(1)return self.driver.find_element(by, element)def find_elements(self, by, element):"""返回一组定位元素"""sleep(1)return self.driver.find_elements(by, element)def switch_alert(self):"""返回弹窗页面"""sleep(1)return self.driver.switch_to.alertdef select_menu(self, menu_text=None):"""菜单选择"""sleep(1)menus_element = self.driver.find_elements(By.CSS_SELECTOR, "#menu>div>h4")for menu in menus_element:# replace(" ", "")去掉字符串中的空格if menu.text.replace(" ", "") == menu_text.replace(" ", ""):return menu.click()print(menu_text + "未找到")returndef log_out(self):"""退出登录"""return self.select_menu("退出登录")

test
pages
loginPage.py
登录页面封装

# -*-coding:utf-8-*-
import os
from selenium.webdriver.common.by import By
from test.pages.basePage import BasePage
from utils.readConfig import ReadConfig
class LoginPage(BasePage):"""登录页面"""def email_element(self):"""邮箱地址"""return self.find_element(By.CLASS_NAME, "email")def password_element(self):"""密码"""return self.find_element(By.CLASS_NAME, "password")def login_button(self):"""登录按钮"""return self.find_element(By.CSS_SELECTOR, ".login-btn>input[value='登  录']")def email_error_element(self):"""邮箱地址错误"""return self.find_element(By.CSS_SELECTOR, ".email+div.msg")def password_error_element(self):"""密码错误"""return self.find_element(By.CSS_SELECTOR, ".password+div.msg")def login_fail_element(self):"""登录失败"""return self.switch_alert()def login(self, email=None, password=None):"""登录操作"""account_email, account_password = self.get_account()if email is None:email = account_emailelse:email = emailif password is None:password = account_passwordself.email_element().send_keys(email)self.password_element().send_keys(password)self.login_button().click()@staticmethoddef get_account():"""获取默认邮箱地址和密码"""current_path = os.path.abspath(os.path.dirname(__file__))json_path = current_path + '/../../config/base_data.json'account = ReadConfig().read_json(json_path)return account['email'], account['password']
if __name__ == '__main__':a = LoginPage()a.login()a.quit_driver()

test
pages
homePage.py
主页页面封装

# -*-coding:utf-8-*-
from time import sleep
from selenium.webdriver.common.by import By
from test.pages.loginPage import LoginPage
from test.common.tableOperation import TableOperation
class HomePage(LoginPage):"""主页页面"""# 检索def search_input_element(self):"""检索输入框"""return self.find_element(By.ID, "search-input")def search_button_element(self):"""检索按钮"""return self.find_element(By.CLASS_NAME, "search")# 按钮def add_button_element(self):"""新增按钮"""return self.find_element(By.ID, "add")def edit_button_element(self):"""编辑按钮"""return self.find_element(By.ID, "edt")def delete_button_element(self):"""删除按钮"""return self.find_element(By.ID, "del")# 编辑弹窗def edit_code_element(self):"""学号输入框"""return self.find_element(By.CSS_SELECTOR, "#add-dialog .code")def edit_name_element(self):"""姓名输入框"""return self.find_element(By.CSS_SELECTOR, "#add-dialog .name")def edit_sex_element(self):"""性别输入框"""return self.find_element(By.CSS_SELECTOR, "#add-dialog .sex")def edit_grader_element(self):"""年级输入框"""return self.find_element(By.CSS_SELECTOR, "#add-dialog .grader")def edit_confirm_button_element(self):"""编辑确定按钮"""return self.find_element(By.CSS_SELECTOR, "#add-dialog #confirm")def edit_cancel_button_element(self):"""编辑取消按钮"""return self.find_element(By.CSS_SELECTOR, "#add-dialog #cancel")# 删除弹窗def del_confirm_button_element(self):"""删除确定按钮"""return self.find_element(By.CSS_SELECTOR, "#del-dialog #confirm")def del_cancel_button_element(self):"""删除取消按钮"""return self.find_element(By.CSS_SELECTOR, "#del-dialog #cancel")# 页面操作方法def search(self, text):"""检索操作"""self.search_input_element().clear()self.search_input_element().send_keys(text)self.search_button_element().click()def edit_dialog(self, code=None, name=None, sex=None, grader=None, button=None):"""编辑弹窗操作"""if code is not None:self.edit_code_element().clear()self.edit_code_element().send_keys(code)if name is not None:self.edit_name_element().clear()self.edit_name_element().send_keys(name)if sex is not None:self.edit_sex_element().clear()self.edit_sex_element().send_keys(sex)if grader is not None:self.edit_grader_element().clear()self.edit_grader_element().send_keys(grader)if button == "确定":self.edit_confirm_button_element().click()elif button == "取消":self.edit_cancel_button_element().click()else:print("编辑弹窗中按钮只能是确定和取消")def add_data(self, code, name, sex=None, grader=None, button="确定"):"""由于code、name为必输项,所有一定要接收参数但sex、grader为非必输项,所有可以不用传值,默认参数设置为None:param code:学号,必输项:param name:姓名,必输项:param sex:性别,非必输:param grader:年级,非必输:param button:新增时按钮一般都是确认按钮,所有按钮的默认值传入确定:return:"""self.add_button_element().click()self.edit_dialog(code, name, sex, grader, button)def edit_data(self, header_text, row_text, code=None, name=None, sex=None, grader=None, button="确定"):"""编辑数据"""# 使用row_click()方法是为了直接选择要编辑的数据TableOperation(self.driver).row_click(header_text, row_text)self.edit_button_element().click()self.edit_dialog(code, name, sex, grader, button)def delete_data(self, header_text, row_text, button="确定"):"""编辑数据"""# 使用row_click()方法是为了直接选择要删除的数据TableOperation(self.driver).row_click(header_text, row_text)self.delete_button_element().click()if button == "确定":self.del_confirm_button_element().click()elif button == "取消":self.del_cancel_button_element().click()else:print("编辑弹窗中按钮只能是确定和取消")
"""
测试代码
if __name__ == '__main__':from selenium import webdriverdriver = webdriver.Chrome()a = LoginPage(driver)a.login()home = HomePage(driver)home.add_data('1001', "张三")home.search("张三")home.edit_data('姓 名', "张三", name="李四")home.search("李四")sleep(1)home.delete_data('姓 名', "李四")sleep(3)a.quit_driver()
"""

test
pages
aboutPage.py
关于我们页面封装

# -*-coding:utf-8-*-
from selenium.webdriver.common.by import By
from test.pages.loginPage import LoginPage
class AboutPage(LoginPage):"""关于我们页面"""def about_element(self):"""关于我们页面判断元素"""return self.find_element(By.CSS_SELECTOR, "#about h1")

Python Web自动化测试学习-PO模型在自动化测试中的应用(2)相关推荐

  1. python opencv 录制视频_如何使用OpenCV、Python和深度学习在图像和视频中实现面部识别?...

    Face ID 的兴起带动了一波面部识别技术热潮.本文将介绍如何使用 OpenCV.Python 和深度学习在图像和视频中实现面部识别,以基于深度识别的面部嵌入,实时执行且达到高准确度. 以下内容由 ...

  2. Selenium基于Python web自动化测试框架 —— PO模型

    目录 1.前言: 2.PO模型的概念和理解: 3.PO模型的目录结构: 4.PO代码示例: 5.总结 6.重点:配套学习资料和视频教学 1.前言: 关于selenium测试框架首先想到的就是PO模型, ...

  3. Python+Selenium+PO模型实现自动化测试

    一. PO模型介绍 在自动化中,Selenium自动化测试中有一个名字经常被提及PageObject(思想与面向对象的特征相 同),通常PO模型可以大大提高测试用例的维护效率 PO模型又叫PO设计模式 ...

  4. 使用po模型进行自动化测试

    编写公用的父类方法 from selenium import webdriver from selenium.webdriver.common.action_chains import ActionC ...

  5. Python Web 深度学习实用指南:第三部分

    原文:Hands-On Python Deep Learning for the Web 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自[ApacheCN 深度学习 译文集],采用译后编辑 ...

  6. Python Web 深度学习实用指南:第一、二部分

    原文:Hands-On Python Deep Learning for the Web 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自[ApacheCN 深度学习 译文集],采用译后编辑 ...

  7. Python Web 深度学习实用指南:第四部分

    原文:Hands-On Python Deep Learning for the Web 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自[ApacheCN 深度学习 译文集],采用译后编辑 ...

  8. 【Python Web自动化】03_PO模型

    那么问题来了:什么是PO模型呢?简单理解就是:把每个页面当成一个对象,给这些页面当成一个类,主要就是完成元素定位和业务操作:它和测试脚本区分开来,需要什么取这些页面类去调用即可.这样的好处在于页面元素 ...

  9. Python Web框架学习【Flask】

    了解flask flask 是利用Python编写的轻量级Web应用框架 Flask也被称为 "microframework" ,因为它使用简单的核心,用 extension 增加 ...

最新文章

  1. html复选框多行排列布局
  2. 一套完整的防火墙系统通常是由屏蔽路由器和代理服务器组成
  3. 用C#中的string.Replace有错误,无法替换。
  4. CASIO 5800P计算器游戏--猜数字游戏
  5. Mybatis 动态表名,插入数据
  6. Scala 专题指南
  7. 【手势识别】基于matlab GUI石头剪刀布【含Matlab源码 774期】
  8. 2022中国边缘计算企业20强
  9. 【Linux系统压力测试】【内存压测】【CPU压测】【磁盘空间压测】
  10. MATLAB实战Sobel边缘检测(Edge Detection)
  11. 来了!SpringBoot从入门到入魔的私房教程!
  12. 人文精神、人文教育与高等教育 徐梦秋
  13. 五分钟搞懂什么是红黑树(全程图解)
  14. Java设计模式 -11- 外观模式(Facade模式)
  15. Android 模拟串口通信过程
  16. MATLAB 神经网络模板
  17. OneNav开源导航系统 简约导航/书签管理器
  18. 易语言学习第三十三课----易语言模块的导入和编写
  19. Adobe Acrobat X Pro安装 pdf
  20. 日撸java三百行day63-65

热门文章

  1. CHIL-ORACLE-创建表
  2. Unity手游实战:从0开始SLG——本地化篇(二)TMP的优势与缺点
  3. 艾永亮:超级产品战略助戴森品牌C位出道,它却在汽车行业栽跟头
  4. 【议程公布】2021年MongoDB中文社区南京技术沙龙
  5. 9月29 Redis配置不当致使root被提权漏洞 | Found a swap file by the name swp
  6. 花千骨服务器无响应,花千骨出现游戏闪退 解决闪退方案
  7. c++ 编译添加dll_(windows平台下)深入详解C++创建动态链接库DLL以及如何使用它(一)...
  8. 电容笔和触控笔有什么区别?ipad手写电容笔推荐品牌
  9. A加权(A-weighted)
  10. python三级_Python三级目录展示方法