Python自动化测试PO模式
页面元素定位信息
页面元素定位信息文件
[leadscloud_login]
input_user_name = xpath>//*[@id='main']/div/div[2]/div[2]/div[2]/div/form/div[1]/div/div/input
input_user_password = xpath>//*[@id='main']/div/div[2]/div[2]/div[2]/div/form/div[2]/div/div[1]/input
button_login = xpath>//*[@id='main']/div/div[2]/div[2]/div[2]/div/form/div[3]/div/button
解析定位信息获取元素对象
解析定位信息
"""
用于解析配置文件,并获取页面元素定位表达式
"""
# -*- coding: utf-8 -*-
# @Time: 2019/2/26 11:43
# @Author : Yang DaWei
# @Project : LeadsCloudAutomation
# @FileName: ParseElementLocator.py
from configparser import ConfigParser
from time import sleep
from selenium.webdriver.support.wait import WebDriverWait class ParseConfigFile:
"""
初始化解析文件类
"""
def __init__(self, driver, page_element_locator):
self.driver = driver
self.cf = ConfigParser()
self.cf.read(page_element_locator, encoding='utf-8') def get_items_section(self, section_name):
"""
获取配置文件中指定section下的所有option_name键值对,并以字典类型返回给调用者
注意:使用self.cf.items(sectionName)此种方法获取到
配置文件中的options内容均被转换成小写,如loginPage.frame将被转换成loginpage.frame
"""
options_dict = dict(self.cf.items(section_name))
return options_dict def get_option_value(self, section_name, option_name):
"""
获取指定section下的指定option的值
"""
value = self.cf.get(section_name, option_name)
return value def get_element_location(self, section_name, option_name, timeout):
"""
获取页面元素定位表达式,并以元素对象的形式返回给调用者
:param section_name:
:param option_name:
:param timeout:
:return:
"""
driver = self.driver
location = self.get_option_value(section_name, option_name)
location_type = location.split(">")[0]
location_value = location.split(">")[1]
print("读取到的定位类型为:" + location_type + "\t读取到的定位信息为:" + location_value)
try:
element = WebDriverWait(driver, timeout).until(lambda x: x.find_element(by=location_type,
value=location_value))
return element
except Exception as e:
print("定位元素超过" + str(timeout) + "秒,详细异常信息入下:")
raise e def highlight_element(self, driver, element):
"""
调用JS,用于高亮控件
:param driver:
:param element:
:return:
"""
driver.execute_script("arguments[0].setAttribute('style', arguments[1]);", element,
"background: yellow; border:2px solid red;") if __name__ == '__main__':
from selenium import webdriver
# from Config import VarConfig
from PageObject.Login_Page import Login_Page
# locator_file = VarConfig.login_page driver = webdriver.Firefox()
driver.get("http://test.leadscloud.com/Front-Vue/#/login")
sleep(5)
Login_Page(driver).input_user_name().send_keys("yangdawei_10171")
# ge = ParseConfigFile(driver, locator_file)
# input_user_name = ge.get_element_location("leadscloud_login", "input_user_name", 5)
# ge.highlight_element(driver, input_user_name)
Login_Page(driver).input_user_password().send_keys("yangdawei_10166")
# input_user_password = ge.get_element_location("leadscloud_login", "input_user_password", 5)
# ge.highlight_element(driver, input_user_password)
# input_user_password.send_keys("111111")
# button_login = ge.get_element_location("leadscloud_login", "button_login", 5)
# ge.highlight_element(driver, button_login)
Login_Page(driver).login_button().click()
driver.quit()
页面元素对象封装
解析定位文件并封装成可操作对象
'''用于获取PageElementLocator.ini 中Login页面元素对象'''
# encoding = utf-8
"""
__title__ = ''
__author__ = 'davieyang'
__mtime__ = '2018/4/21'
"""
from Util.GetElements import *
from Util.ParseElementLocator import ParseConfigFile class LoginPage(object): def __init__(self, driver):
self.driver = driver
self.parseCF = ParseConfigFile()
self.loginOptions = self.parseCF.getItemsSection("163mail_login")
print(self.loginOptions) def switchtoframe(self):
try:
# 从定位表达式配置文件中读取frame的定位表达式
locatorExpression = self.loginOptions["loginPage.frame".lower()].split('>')[1]
self.driver.switch_to.frame(locatorExpression)
except Exception as e:
raise e def switchtodefaultframe(self):
try:
self.driver.switch_to.default_content()
except Exception as e:
raise e def usernameobj(self):
try:
# 从定位表达式配置文件中读取定位用户名如输入框的定位方式和表达式
locateType, locatorExpression = self.loginOptions["loginPage.username".lower()].split(">")
# 获取登录页面的用户名输入框页面对象,返回给调用者
elementobj = get_element(self.driver, locateType, locatorExpression)
return elementobj
except Exception as e:
raise e def passwordobj(self):
try:
# 从定位表达式配置文件中读取定位密码输入框的定位方式和表达式
locateType, locatorExpression = self.loginOptions["loginPage.password".lower()].split(">")
# 获取登录页面的密码输入框页面对象,并返回给调用者
elementoj = get_element(self.driver, locateType, locatorExpression)
return elementoj
except Exception as e:
raise e def loginbutton(self):
try:
# 从定位表达式配置文件中读取定位登录按钮的定位方式和表达式
locateType, locatorExpression = self.loginOptions["loginPage.loginbutton".lower()].split(">")
# 获取登录页面的登录按钮页面对象,并返回给调用者
elementobj = get_element(self.driver, locateType, locatorExpression)
return elementobj
except Exception as e:
raise e if __name__ == '__main__':
from selenium import webdriver
import time
driver = webdriver.Chrome(executable_path="F:\\automation\\webdriver\\chromedriver.exe")
driver.get("http://mail.163.com")
time.sleep(5)
login = LoginPage(driver)
login.switchtoframe()
login.usernameobj().send_keys("xxxx")
login.passwordobj().send_keys("xxxx")
login.loginbutton().click()
time.sleep(10)
login.switchtodefaultframe()
assert u"未读邮件" in driver.page_source
driver.quit()
测试代码示例
测试脚本
# -*- coding: utf-8 -*-
# @Time: 2019/3/1 13:40
# @Author : Yang DaWei
# @Project : LeadsCloudAutomation
# @FileName: test_login_page.py
import time
import unittest
from selenium import webdriver
from PageObject.Login_Page import Login_Page class Test_Login_Page(unittest.TestCase): driver = None
@classmethod
def setUpClass(cls):
""" set Up method """
cls.driver = webdriver.Chrome()
cls.test_page = ''
time.sleep(3) def tearDown(self):
""" tear Down method """ def setUp(self):
"""setUP pass""" @classmethod
def tearDownClass(cls):
""" tear Down method """
cls.driver.close() def test_login(self):
self.driver.get("http://admin.leadscloud.com/Front-Vue/#/")
Login_Page(self.driver).input_user_name().send_keys("yangdawei_10171")
Login_Page(self.driver).input_user_password().send_keys("")
Login_Page(self.driver).login_button().click()
try:
self.assertTrue("仪表盘", self.driver.page_source)
print("断言成功")
except Exception as e:
raise e
time.sleep(10)
Python自动化测试PO模式的更多相关文章
- 自动化测试po模式是什么?自动化测试po分层如何实现?-附详细源码
一.什么是PO模式 全称:page object model 简称:POM/PO PO模式最核心的思想是分层,实现松耦合!实现脚本重复使用,实现脚本易维护性! 主要分三层: 1.基础层BaseP ...
- Python+Selenium+Unittest实现PO模式web自动化框架(1)
1.什么是PO模式? PO是Page Object的缩写 PO模式是自动化测试项目开发实践的最佳设计模式之一,讲页面定位和业务操作分开,也就是把对象的定位和测试脚本分开,从而提供可维护性. 主要有以下 ...
- PO模式在selenium自动化测试框架有什么好处
PO模式是在UI自动化测试过程当中使用非常频繁的一种设计模式,使用这种模式后,可以有效的提升代码的复用能力,并且让自动化测试代码维护起来更加方便. PO模式的全称叫page object model( ...
- Selenium的PO模式(Page Object Model)|(Selenium Webdriver For Python)
研究Selenium + python 自动化测试有近两个月了,不能说非常熟练,起码对selenium自动化的执行有了深入的认识. 从最初无结构的代码,到类的使用,方法封装,从原始函数 ...
- web自动化测试中的PO模式(一)
1.PO模式的思想 原理: 将页面的元素定位和元素行为封装成一个page类 类的属性:元素的定位 类的行为:元素的操作 页面对象和测试用例分离 测试用例: 调用所需要页面对象中的行为,组成测试用例 测 ...
- UI自动化测试框架:PO模式+数据驱动
1. PO 设计模式简介 2. 工程结构说明 3. 工程代码实现 page 包 action 包 business_process 包 util 包 conf 包 test_data 目录 log 目 ...
- selenium+python自动化测试系列(一):登录
最近接手商城的项目,针对后台测试,功能比较简单,但是流程比较繁多,涉及到前后台的交叉测试.在对整个项目进行第一轮测试完成之后,考虑以后回归测试任务比较重,为了减轻回归测试的工作量,所以考虑后台 ...
- selenium2 python自动化测试实战(回归测试)
selenium2 python自动化测试实战 最近接手商城的项目,针对后台测试,功能比较简单,但是流程比较繁多,涉及到前后台的交叉测试.在对整个项目进行第一轮测试完成之后,考虑以后回归测试任务比较重 ...
- PO模式学习笔记
框架: 1.PO模式应用(测试对象和测试用例分离)(写到简历中) 2.引入ddt 3.深入分层:测试数据分离 4.遵循原则:测试用例的独立性 5.深入分层:元素定位分离 6.框架优化:提取basepa ...
随机推荐
- 安装LoadRunner各种提示解决方法(转载)
原文地址链接:https://jingyan.baidu.com/article/915fc414fc60fc51394b20fa.html 1.问:当安装提示"Micosoft Visua ...
- git学习链接---收藏----
Github 创建新分支:https://blog.csdn.net/top_code/article/details/51931916Git易百教程:https://www.yiibai.com/g ...
- 会话技术——Cookies和Session详解
会话技术 (一) 概述.用途以及分类 (1) 基本概述 概述:会话是浏览器和服务器之间的多次请求和响应 也就是说,从浏览器访问服务器开始,到访问服务器结束,浏览器关闭为止的这段时间内容产生的多次请求和 ...
- ruby tk实现简易计算器
#encding:GBK require 'tk' module Const WIDTH_OF_PANEL = 370 HEIGHT_OF_PANEL = 520 SIZE_OF_BUTTON_H = ...
- 5年经验Java程序员面试20天
写在前面 今天分享的是一位5年工作经验的Java工程师在帝都的面试经验总结,看看这些互联网公司都爱问些什么题,希望对大家的面试有指导意义. 从事Java开发也有5年经验了,4月初自己的开启面试经历 ...
- java日志框架系列(6):logback框架encoder详解
1.Encoder 1.encoder功能 Encoder 负责两件事,一是把事件转换为字节数组,二是把字节数组写入输出流. 注意:在logback 0.9.19 版之前没有 encoder. 在之前 ...
- LeetCode. 3的幂
题目要求: 给定一个整数,写一个函数来判断它是否是 3 的幂次方. 示例: 输入: 27 输出: true 代码: class Solution { public: bool isPowerOfThr ...
- Centos7.3安装jdk和maven
安装jdk和maven 通过winscp上传jdk 解压 tar -zxvf jdk-8u91-linux-x64.ta ...
- Python之系统编程笔记
概念 命令行工具. Shell 脚本. 系统管理 系统模块 sys 提供一组功能映射Python运行时的操作系统 os 提供跨平台可移植的操作系统编程接口 os.path 提供文件及目 ...
- 在Yii2中集成Markdown编辑器
安装命令: composer require ijackua/yii2-lepture-markdown-editor-widget:dev-master 可能会遇到的问题 如果在下载依赖包的过程中出 ...