页面元素定位信息

页面元素定位信息文件

[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模式的更多相关文章

  1. 自动化测试po模式是什么?自动化测试po分层如何实现?-附详细源码

    一.什么是PO模式 全称:page object model  简称:POM/PO PO模式最核心的思想是分层,实现松耦合!实现脚本重复使用,实现脚本易维护性! ​ 主要分三层: 1.基础层BaseP ...

  2. Python+Selenium+Unittest实现PO模式web自动化框架(1)

    1.什么是PO模式? PO是Page Object的缩写 PO模式是自动化测试项目开发实践的最佳设计模式之一,讲页面定位和业务操作分开,也就是把对象的定位和测试脚本分开,从而提供可维护性. 主要有以下 ...

  3. PO模式在selenium自动化测试框架有什么好处

    PO模式是在UI自动化测试过程当中使用非常频繁的一种设计模式,使用这种模式后,可以有效的提升代码的复用能力,并且让自动化测试代码维护起来更加方便. PO模式的全称叫page object model( ...

  4. Selenium的PO模式(Page Object Model)|(Selenium Webdriver For Python)

            研究Selenium + python 自动化测试有近两个月了,不能说非常熟练,起码对selenium自动化的执行有了深入的认识. 从最初无结构的代码,到类的使用,方法封装,从原始函数 ...

  5. web自动化测试中的PO模式(一)

    1.PO模式的思想 原理: 将页面的元素定位和元素行为封装成一个page类 类的属性:元素的定位 类的行为:元素的操作 页面对象和测试用例分离 测试用例: 调用所需要页面对象中的行为,组成测试用例 测 ...

  6. UI自动化测试框架:PO模式+数据驱动

    1. PO 设计模式简介 2. 工程结构说明 3. 工程代码实现 page 包 action 包 business_process 包 util 包 conf 包 test_data 目录 log 目 ...

  7. selenium+python自动化测试系列(一):登录

        最近接手商城的项目,针对后台测试,功能比较简单,但是流程比较繁多,涉及到前后台的交叉测试.在对整个项目进行第一轮测试完成之后,考虑以后回归测试任务比较重,为了减轻回归测试的工作量,所以考虑后台 ...

  8. selenium2 python自动化测试实战(回归测试)

    selenium2 python自动化测试实战 最近接手商城的项目,针对后台测试,功能比较简单,但是流程比较繁多,涉及到前后台的交叉测试.在对整个项目进行第一轮测试完成之后,考虑以后回归测试任务比较重 ...

  9. PO模式学习笔记

    框架: 1.PO模式应用(测试对象和测试用例分离)(写到简历中) 2.引入ddt 3.深入分层:测试数据分离 4.遵循原则:测试用例的独立性 5.深入分层:元素定位分离 6.框架优化:提取basepa ...

随机推荐

  1. react做的简单的购物车

    ###第一步 :首先电脑上已经安装react的脚手架 cnpm  install    create-react-app   -g ###第二步 :创建项目 creact-react-app   项目 ...

  2. .NET Core学习笔记(2)—— WPF使用UWP Custom Control

    自.NET Core 3.0开始,某软加入了对WPF的支持.同时对XAML Islands也做了进一步加强.在.NET Core 3.0之前,我们只能在WPF程序中,通过两种方式有限制地使用Stand ...

  3. PyCharm Community Edition编辑Python查看数据库

    描述:利用PyCharm Community Edition社区版本的时候无法查看数据库 解决方法如下: 点击File之后选择setting 点击setting之后出现的画面上面选择Plugins,之 ...

  4. python-继承之多继承

    class BaseRequest(): pass class RequestHandler(BaseRequest): def serve_forever(self): print('Request ...

  5. [DEBUG] Springboot打包jar/war后访问包外的路径

    ======================================================== 我是Ruriko,我爱这个世界:)

  6. C++:标准模板库Sort

    一.概述 STL几乎封装了所用的数据结构中的算法,这里主要介绍排序算法的使用,指定排序迭代器区间后,即可实现排序功能. 所需头文件#include <algorithm> sort函数:对 ...

  7. 剑指offer60:把二叉树打印成多行。上到下按层打印二叉树。

    1 题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 2 思路和方法 vector变量存储每一层的元素vector<vector<int> > ans ...

  8. SSH框架结合案例构建配置

    ssh框架概述 SSH是 struts+spring+hibernate的一个集成框架,是目前比较流行的一种Web应用程序开源框架.区别于 Secure Shell . 集成SSH框架的系统从职责上分 ...

  9. 工具——eclipse debug小技巧

    1.开启调试: 在代码编辑处右键单击,在弹出菜单中点击Debug As开始调试 2.几个快捷键: F5:跟入Step into, 一般会跟踪进入到调用函数的函数体,Step Over则不会跟踪进入,直 ...

  10. Redis键的序列化和反序列化

    序列化 命令名称:DUMP 语法:DUMP key 功能:序列化给定key,并返回被序列化的值.序列化的值不包括任何生存时间信息. 返回值:如果key不存在,那么返回nil.否则返回序列化之后的值 反 ...