页面元素定位信息

页面元素定位信息文件

  1. [leadscloud_login]
  2. input_user_name = xpath>//*[@id='main']/div/div[2]/div[2]/div[2]/div/form/div[1]/div/div/input
  3. input_user_password = xpath>//*[@id='main']/div/div[2]/div[2]/div[2]/div/form/div[2]/div/div[1]/input
  4. button_login = xpath>//*[@id='main']/div/div[2]/div[2]/div[2]/div/form/div[3]/div/button

解析定位信息获取元素对象

解析定位信息

  1. """
  2. 用于解析配置文件,并获取页面元素定位表达式
  3. """
  4. # -*- coding: utf-8 -*-
  5. # @Time: 2019/2/26 11:43
  6. # @Author : Yang DaWei
  7. # @Project : LeadsCloudAutomation
  8. # @FileName: ParseElementLocator.py
  9. from configparser import ConfigParser
  10. from time import sleep
  11. from selenium.webdriver.support.wait import WebDriverWait
  12.  
  13. class ParseConfigFile:
  14. """
  15. 初始化解析文件类
  16. """
  17. def __init__(self, driver, page_element_locator):
  18. self.driver = driver
  19. self.cf = ConfigParser()
  20. self.cf.read(page_element_locator, encoding='utf-8')
  21.  
  22. def get_items_section(self, section_name):
  23. """
  24. 获取配置文件中指定section下的所有option_name键值对,并以字典类型返回给调用者
  25. 注意:使用self.cf.items(sectionName)此种方法获取到
  26. 配置文件中的options内容均被转换成小写,如loginPage.frame将被转换成loginpage.frame
  27. """
  28. options_dict = dict(self.cf.items(section_name))
  29. return options_dict
  30.  
  31. def get_option_value(self, section_name, option_name):
  32. """
  33. 获取指定section下的指定option的值
  34. """
  35. value = self.cf.get(section_name, option_name)
  36. return value
  37.  
  38. def get_element_location(self, section_name, option_name, timeout):
  39. """
  40. 获取页面元素定位表达式,并以元素对象的形式返回给调用者
  41. :param section_name:
  42. :param option_name:
  43. :param timeout:
  44. :return:
  45. """
  46. driver = self.driver
  47. location = self.get_option_value(section_name, option_name)
  48. location_type = location.split(">")[0]
  49. location_value = location.split(">")[1]
  50. print("读取到的定位类型为:" + location_type + "\t读取到的定位信息为:" + location_value)
  51. try:
  52. element = WebDriverWait(driver, timeout).until(lambda x: x.find_element(by=location_type,
  53. value=location_value))
  54. return element
  55. except Exception as e:
  56. print("定位元素超过" + str(timeout) + "秒,详细异常信息入下:")
  57. raise e
  58.  
  59. def highlight_element(self, driver, element):
  60. """
  61. 调用JS,用于高亮控件
  62. :param driver:
  63. :param element:
  64. :return:
  65. """
  66. driver.execute_script("arguments[0].setAttribute('style', arguments[1]);", element,
  67. "background: yellow; border:2px solid red;")
  68.  
  69. if __name__ == '__main__':
  70. from selenium import webdriver
  71. # from Config import VarConfig
  72. from PageObject.Login_Page import Login_Page
  73. # locator_file = VarConfig.login_page
  74.  
  75. driver = webdriver.Firefox()
  76. driver.get("http://test.leadscloud.com/Front-Vue/#/login")
  77. sleep(5)
  78. Login_Page(driver).input_user_name().send_keys("yangdawei_10171")
  79. # ge = ParseConfigFile(driver, locator_file)
  80. # input_user_name = ge.get_element_location("leadscloud_login", "input_user_name", 5)
  81. # ge.highlight_element(driver, input_user_name)
  82. Login_Page(driver).input_user_password().send_keys("yangdawei_10166")
  83. # input_user_password = ge.get_element_location("leadscloud_login", "input_user_password", 5)
  84. # ge.highlight_element(driver, input_user_password)
  85. # input_user_password.send_keys("111111")
  86. # button_login = ge.get_element_location("leadscloud_login", "button_login", 5)
  87. # ge.highlight_element(driver, button_login)
  88. Login_Page(driver).login_button().click()
  89. driver.quit()

页面元素对象封装

解析定位文件并封装成可操作对象

  1. '''用于获取PageElementLocator.ini 中Login页面元素对象'''
  2. # encoding = utf-8
  3. """
  4. __title__ = ''
  5. __author__ = 'davieyang'
  6. __mtime__ = '2018/4/21'
  7. """
  8. from Util.GetElements import *
  9. from Util.ParseElementLocator import ParseConfigFile
  10.  
  11. class LoginPage(object):
  12.  
  13. def __init__(self, driver):
  14. self.driver = driver
  15. self.parseCF = ParseConfigFile()
  16. self.loginOptions = self.parseCF.getItemsSection("163mail_login")
  17. print(self.loginOptions)
  18.  
  19. def switchtoframe(self):
  20. try:
  21. # 从定位表达式配置文件中读取frame的定位表达式
  22. locatorExpression = self.loginOptions["loginPage.frame".lower()].split('>')[1]
  23. self.driver.switch_to.frame(locatorExpression)
  24. except Exception as e:
  25. raise e
  26.  
  27. def switchtodefaultframe(self):
  28. try:
  29. self.driver.switch_to.default_content()
  30. except Exception as e:
  31. raise e
  32.  
  33. def usernameobj(self):
  34. try:
  35. # 从定位表达式配置文件中读取定位用户名如输入框的定位方式和表达式
  36. locateType, locatorExpression = self.loginOptions["loginPage.username".lower()].split(">")
  37. # 获取登录页面的用户名输入框页面对象,返回给调用者
  38. elementobj = get_element(self.driver, locateType, locatorExpression)
  39. return elementobj
  40. except Exception as e:
  41. raise e
  42.  
  43. def passwordobj(self):
  44. try:
  45. # 从定位表达式配置文件中读取定位密码输入框的定位方式和表达式
  46. locateType, locatorExpression = self.loginOptions["loginPage.password".lower()].split(">")
  47. # 获取登录页面的密码输入框页面对象,并返回给调用者
  48. elementoj = get_element(self.driver, locateType, locatorExpression)
  49. return elementoj
  50. except Exception as e:
  51. raise e
  52.  
  53. def loginbutton(self):
  54. try:
  55. # 从定位表达式配置文件中读取定位登录按钮的定位方式和表达式
  56. locateType, locatorExpression = self.loginOptions["loginPage.loginbutton".lower()].split(">")
  57. # 获取登录页面的登录按钮页面对象,并返回给调用者
  58. elementobj = get_element(self.driver, locateType, locatorExpression)
  59. return elementobj
  60. except Exception as e:
  61. raise e
  62.  
  63. if __name__ == '__main__':
  64. from selenium import webdriver
  65. import time
  66. driver = webdriver.Chrome(executable_path="F:\\automation\\webdriver\\chromedriver.exe")
  67. driver.get("http://mail.163.com")
  68. time.sleep(5)
  69. login = LoginPage(driver)
  70. login.switchtoframe()
  71. login.usernameobj().send_keys("xxxx")
  72. login.passwordobj().send_keys("xxxx")
  73. login.loginbutton().click()
  74. time.sleep(10)
  75. login.switchtodefaultframe()
  76. assert u"未读邮件" in driver.page_source
  77. driver.quit()

测试代码示例

测试脚本

  1. # -*- coding: utf-8 -*-
  2. # @Time: 2019/3/1 13:40
  3. # @Author : Yang DaWei
  4. # @Project : LeadsCloudAutomation
  5. # @FileName: test_login_page.py
  6. import time
  7. import unittest
  8. from selenium import webdriver
  9. from PageObject.Login_Page import Login_Page
  10.  
  11. class Test_Login_Page(unittest.TestCase):
  12.  
  13. driver = None
  14. @classmethod
  15. def setUpClass(cls):
  16. """ set Up method """
  17. cls.driver = webdriver.Chrome()
  18. cls.test_page = ''
  19. time.sleep(3)
  20.  
  21. def tearDown(self):
  22. """ tear Down method """
  23.  
  24. def setUp(self):
  25. """setUP pass"""
  26.  
  27. @classmethod
  28. def tearDownClass(cls):
  29. """ tear Down method """
  30. cls.driver.close()
  31.  
  32. def test_login(self):
  33. self.driver.get("http://admin.leadscloud.com/Front-Vue/#/")
  34. Login_Page(self.driver).input_user_name().send_keys("yangdawei_10171")
  35. Login_Page(self.driver).input_user_password().send_keys("")
  36. Login_Page(self.driver).login_button().click()
  37. try:
  38. self.assertTrue("仪表盘", self.driver.page_source)
  39. print("断言成功")
  40. except Exception as e:
  41. raise e
  42. 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. .git泄露及利用php弱类型松散比较构造json的payload

    一道ctf题,文章搬运到了自己的网站上: http://101.132.137.140:202/archives/2019-11-16

  2. 【miscellaneous】各种音视频编解码学习详解

    编解码学习笔记(一):基本概念 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中媒体的编解码服务涉及需求分析.应用开发.释放license收费等等 ...

  3. 酒店移动端入住离店日期选择demo(转)

    原作者:http://blog.csdn.net/cj14227/article/details/65629737 效果图: demo 代码: <!DOCTYPE html> <ht ...

  4. 乐字节Java学习01-Java语言概述,Java发展前景,Java的特点

    从这篇文章开始,小乐准备写一整系列的Java学习文章,一步一步带您进入Java的神奇世界! 这是第一篇:Java语言概述以及Java的发展前景 1.SUN公司介绍 SUN公司全称是Stanford U ...

  5. [转帖]「日常小记」linux中强大且常用命令:find、grep

    「日常小记」linux中强大且常用命令:find.grep https://zhuanlan.zhihu.com/p/74379265 在linux下面工作,有些命令能够大大提高效率.本文就向大家介绍 ...

  6. Turn.js 实现翻书效果(自适应单双页)

    来源:https://www.cnblogs.com/hellman/p/10683492.html在上面的来源基础上增加页码显示,自适应单双页PC端效果: 移动端展示: 源码下载地址:http:// ...

  7. (九)easyUI之选项卡

    前台 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncodi ...

  8. eclipse智能提示报错(to avoid the message, disable the...)

    然后这里可能会再报别的错误  我的做法是   再重新将 code recommenders 打开 ********************************** 为什么会出现 这样错误呢 ? 简 ...

  9. 洛谷 P1307 数字反转

    链接:https://www.luogu.org/problem/P1307 题目: 题目描述 给定一个整数,请将该数各个位上数字反转得到一个新数.新数也应满足整数的常见形式,即除非给定的原数为零,否 ...

  10. gin框架初识(先跑一个简单demo) ①

    Gin 是一个 go 写的 web 框架,具有高性能的优点.官方地址:https://github.com/gin-gonic/gin 先跑一个demo(先安装gin框架,具体见官方地址): 1.vs ...