页面元素定位信息

页面元素定位信息文件

[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. Bugly——Xuporter问题处理

    Unity接入Bugly   用其原生的package文件导入,结果在Ios打包时报错,找不到相对应的库. 经过排查: 这个地方如果不加拦截的话,项目中所有的 .projmods文件都会按照xupor ...

  2. go timer定时器 WaitGroup用法

    参考文章: timer定时器: https://www.cnblogs.com/oxspirt/p/7107312.html WaitGroup用法: https://studygolang.com/ ...

  3. super的实例及实现原理

    super实例 class A(): def go(self): print ("go A go!") def stop(self): print ("stop A st ...

  4. php iconv实现编码转换

    php iconv实现编码转换 <pre><?php $content = iconv('GB2312', 'UTF-8//IGNORE', $content); ?> < ...

  5. Windows Terminal Preview v0.7 Release

    Windows Terminal Preview v0.7 Release The following key bindings are included by default within this ...

  6. 数据库数据生成Excel表格(多用在导出数据)

    最近在项目开发中遇到这样一个需求,用户聊天模块产品要求记录用户聊天信息,但只保存当天的,每天都要刷新清空数据,但聊天记录要以Excel的形式打印出来,于是就引出了将数据库的数据导出成Excel表格的需 ...

  7. 【计算几何】Water Testing

    Water Testing 题目描述 You just bought a large piece of agricultural land, but you noticed that – accord ...

  8. 读取一整行,保留空白,直到遇到换行符:getline()

  9. easyui实现树形菜单Tab功能、layout布局

    一:常见三种前端ui框架 在初学者入门的状态下,我们常见的前端框架有三种且都有自己的官方网站: 1.easyui:官方网站(http://www.jeasyui.net/) 基于jquery的用户页面 ...

  10. Thread,Task,async/await,IAsyncResult

    1.线程(Thread) 多线程的意义在于一个应用程序中,有多个执行部分可以同时执行:对于比较耗时的操作(例如io,数据库操作),或者等待响应(如WCF通信)的操作,可以单独开启后台线程来执行,这样主 ...