base_page.py

  1. # coding=utf-8
  2. import time
  3. from selenium.common.exceptions import NoSuchElementException
  4. import os.path
  5. from unittest3.framework.logger import Logger
  6.  
  7. # create a logger instance
  8. logger = Logger(logger="BasePage").getlog()
  9.  
  10. class BasePage(object):
  11. """
  12. 定义一个页面基类,让所有页面都继承这个类,封装一些常用的页面操作方法到这个类
  13. """
  14.  
  15. def __init__(self, driver):
  16. self.driver = driver
  17.  
  18. # quit browser and end testing
  19.  
  20. def quit_browser(self):
  21. self.driver.quit()
  22.  
  23. # 浏览器前进操作
  24.  
  25. def forward(self):
  26. self.driver.forward()
  27. logger.info("Click forward on current page.")
  28.  
  29. # 浏览器后退操作
  30.  
  31. def back(self):
  32. self.driver.back()
  33. logger.info("Click back on current page.")
  34.  
  35. # 隐式等待
  36.  
  37. def wait(self, seconds):
  38. self.driver.implicitly_wait(seconds)
  39. logger.info("wait for %d seconds." % seconds)
  40.  
  41. # 点击关闭当前窗口
  42.  
  43. def close(self):
  44. try:
  45. self.driver.close()
  46. logger.info("Closing and quit the browser.")
  47. except NameError as e:
  48. logger.error("Failed to quit the browser with %s" % e)
  49.  
  50. # 保存图片
  51.  
  52. def get_windows_img(self):
  53. """
  54. 在这里我们把file_path这个参数写死,直接保存到我们项目根目录的一个文件夹.\Screenshots下
  55. """
  56. file_path = os.path.dirname(os.path.abspath('.')) + '/screenshots/'
  57. rq = time.strftime('%Y%m%d%H%M', time.localtime(time.time()))
  58. screen_name = file_path + rq + '.png'
  59. try:
  60. self.driver.get_screenshot_as_file(screen_name)
  61. logger.info("Had take screenshot and save to folder : /screenshots")
  62. except NameError as e:
  63. logger.error("Failed to take screenshot! %s" % e)
  64. self.get_windows_img()
  65.  
  66. # 定位元素方法
  67.  
  68. def find_element(self, selector):
  69. """
  70. 这个地方为什么是根据=>来切割字符串,请看页面里定位元素的方法
  71. submit_btn = "id=>su"
  72. login_lnk = "xpath => //*[@id='u1']/a[7]" # 百度首页登录链接定位
  73. 如果采用等号,结果很多xpath表达式中包含一个=,这样会造成切割不准确,影响元素定位
  74. :param selector:
  75. :return: element
  76. """
  77. element = ''
  78. if '=>' not in selector:
  79. return self.driver.find_element_by_id(selector)
  80. selector_by = selector.split('=>')[0]
  81. selector_value = selector.split('=>')[1]
  82.  
  83. if selector_by == "i" or selector_by == 'id':
  84. try:
  85. element = self.driver.find_element_by_id(selector_value)
  86. logger.info("Had find the element \' %s \' successful "
  87. "by %s via value: %s " % (element.text, selector_by, selector_value))
  88. except NoSuchElementException as e:
  89. logger.error("NoSuchElementException: %s" % e)
  90. self.get_windows_img() # take screenshot
  91. elif selector_by == "n" or selector_by == 'name':
  92. element = self.driver.find_element_by_name(selector_value)
  93. elif selector_by == "c" or selector_by == 'class_name':
  94. element = self.driver.find_element_by_class_name(selector_value)
  95. elif selector_by == "l" or selector_by == 'link_text':
  96. element = self.driver.find_element_by_link_text(selector_value)
  97. elif selector_by == "p" or selector_by == 'partial_link_text':
  98. element = self.driver.find_element_by_partial_link_text(selector_value)
  99. elif selector_by == "t" or selector_by == 'tag_name':
  100. element = self.driver.find_element_by_tag_name(selector_value)
  101. elif selector_by == "x" or selector_by == 'xpath':
  102. try:
  103. element = self.driver.find_element_by_xpath(selector_value)
  104. logger.info("Had find the element \' %s \' successful "
  105. "by %s via value: %s " % (element.text, selector_by, selector_value))
  106. except NoSuchElementException as e:
  107. logger.error("NoSuchElementException: %s" % e)
  108. self.get_windows_img()
  109. elif selector_by == "s" or selector_by == 'selector_selector':
  110. element = self.driver.find_element_by_css_selector(selector_value)
  111. else:
  112. raise NameError("Please enter a valid type of targeting elements.")
  113.  
  114. return element
  115.  
  116. # 输入
  117.  
  118. def type(self, selector, text):
  119.  
  120. el = self.find_element(selector)
  121. el.clear()
  122. try:
  123. el.send_keys(text)
  124. logger.info("Had type \' %s \' in inputBox" % text)
  125. except NameError as e:
  126. logger.error("Failed to type in input box with %s" % e)
  127. self.get_windows_img()
  128.  
  129. # 清除文本框
  130.  
  131. def clear(self, selector):
  132.  
  133. el = self.find_element(selector)
  134. try:
  135. el.clear()
  136. logger.info("Clear text in input box before typing.")
  137. except NameError as e:
  138. logger.error("Failed to clear in input box with %s" % e)
  139. self.get_windows_img()
  140.  
  141. # 点击元素
  142.  
  143. def click(self, selector):
  144.  
  145. el = self.find_element(selector)
  146. try:
  147. el.click()
  148. logger.info("The element \' %s \' was clicked." % el.text)
  149. except NameError as e:
  150. logger.error("Failed to click the element with %s" % e)
  151.  
  152. # 或者网页标题
  153.  
  154. def get_page_title(self):
  155. logger.info("Current page title is %s" % self.driver.title)
  156. return self.driver.title
  157.  
  158. @staticmethod
  159. def sleep(seconds):
  160. time.sleep(seconds)
  161. logger.info("Sleep for %d seconds" % seconds)

browser_engine.py

  1. # coding=utf-8
  2. from selenium import webdriver
  3.  
  4. class BrowserEngine(object):
  5. """
  6. 定义一个浏览器引擎类,根据browser_type的值去,控制启动不同的浏览器,这里主要是IE,Firefox, Chrome
  7.  
  8. """
  9.  
  10. def __init__(self, driver):
  11. self.driver = driver
  12.  
  13. browser_type = "Chrome" # maybe Firefox, Chrome, IE
  14.  
  15. def get_browser(self):
  16. """
  17. 通过if语句,来控制初始化不同浏览器的启动,默认是启动Chrome
  18. :return: driver
  19. """
  20.  
  21. if self.browser_type == 'Firefox':
  22. driver = webdriver.Firefox()
  23. elif self.browser_type == 'Chrome':
  24. driver = webdriver.Chrome()
  25. elif self.browser_type == 'IE':
  26. driver = webdriver.Ie()
  27. else:
  28. driver = webdriver.Chrome()
  29.  
  30. # driver.maximize_window()
  31. driver.implicitly_wait(10)
  32. driver.get("https://www.baidu.com")
  33. return driver

logger.py

  1. # _*_ coding: utf-8 _*_
  2. import logging
  3. import os.path
  4. import time
  5.  
  6. class Logger(object):
  7. def __init__(self, logger):
  8. """
  9. 指定保存日志的文件路径,日志级别,以及调用文件
  10. 将日志存入到指定的文件中
  11. :param logger:
  12. """
  13. # 创建一个logger
  14. self.logger = logging.getLogger(logger)
  15. self.logger.setLevel(logging.DEBUG)
  16.  
  17. # 创建一个handler,用于写入日志文件
  18. rq = time.strftime('%Y%m%d%H%M', time.localtime(time.time()))
  19. log_path = os.path.dirname(os.getcwd()) + '/Logs/'
  20. log_name = log_path + rq + '.log'
  21. fh = logging.FileHandler(log_name)
  22. fh.setLevel(logging.INFO)
  23.  
  24. # 再创建一个handler,用于输出到控制台
  25. ch = logging.StreamHandler()
  26. ch.setLevel(logging.INFO)
  27.  
  28. # 定义handler的输出格式
  29. formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
  30. fh.setFormatter(formatter)
  31. ch.setFormatter(formatter)
  32.  
  33. # 给logger添加handler
  34. self.logger.addHandler(fh)
  35. self.logger.addHandler(ch)
  36.  
  37. def getlog(self):
  38. return self.logger

baidu_homepage.py

  1. # coding=utf-8
  2. from unittest3.framework.base_page import BasePage
  3.  
  4. class HomePage(BasePage):
  5. input_box = "id=>kw"
  6. search_submit_btn = "xpath=>//*[@id='su']"
  7.  
  8. def type_search(self, text):
  9. self.type(self.input_box, text)
  10.  
  11. def send_submit_btn(self):
  12. self.click(self.search_submit_btn)

测试类代码 baidu_search.py

  1. # coding=utf-8
  2. import time
  3. import unittest
  4. from selenium import webdriver
  5. from unittest3.page_object.baidu_homepage import HomePage
  6. from unittest3.framework.browser_engine import BrowserEngine
  7.  
  8. class BaiduSearch(unittest.TestCase):
  9. def setUp(self):
  10. """
  11. 测试固件的setUp()的代码,主要是测试的前提准备工作
  12. :return:
  13. """
  14. # 添加如下代码,可运行
  15. # -------------------------------------------
  16. # browse = BrowserEngine(self)
  17. # self.driver = webdriver.Firefox()
  18. # self.driver.get('https://www.baidu.com')
  19. #-------------------------------------------
  20. # 修改代码可以执行
  21. browse = BrowserEngine(self)
  22. self.driver=browse.get_browser()
  23.  
  24. def tearDown(self):
  25. """
  26. 测试结束后的操作,这里基本上都是关闭浏览器
  27. :return:
  28. """
  29. self.driver.quit()
  30.  
  31. def test_baidu_search(self):
  32. """
  33. 这里一定要test开头,把测试逻辑代码封装到一个test开头的方法里。
  34. :return:
  35. """
  36. homepage = HomePage(self.driver)
  37. homepage.type_search('selenium') # 调用页面对象中的方法
  38. homepage.send_submit_btn() # 调用页面对象类中的点击搜索按钮方法
  39. time.sleep(2)
  40. homepage.get_windows_img() # 调用基类截图方法
  41. try:
  42. assert 'selenium' in homepage.get_page_title() # 调用页面对象继承基类中的获取页面标题方法
  43. print('Test Pass.')
  44. except Exception as e:
  45. print('Test Fail.', format(e))
  46.  
  47. if __name__ == '__main__':
  48. unittest.main()

python selenium 基础框架的更多相关文章

  1. Python+Selenium基础入门及实践

    Python+Selenium基础入门及实践 32018.08.29 11:21:52字数 3220阅读 23422 一.Selenium+Python环境搭建及配置 1.1 selenium 介绍 ...

  2. python+selenium+unnittest框架

    python+selenium+unnittest框架,以百度搜索为例,做了一个简单的框架,先看一下整个项目目录结构 我用的是pycharm工具,我觉得这个工具是天使,超好用也超好看! 这些要感谢原作 ...

  3. 从零开始到设计Python+Selenium自动化测试框架-如何开始

    如何开始学习web ui自动化测试?如何选择一门脚本语言?选择什么自动化测试工具? 本人已经做测试快5年,很惭愧,感觉积累不够,很多测试都不会,三年多功能测试,最近两年才开始接触和学习自动化测试.打算 ...

  4. 《一头扎进》系列之Python+Selenium自动化测试框架实战篇6 - 价值好几K的框架,呦!这个框架还真牛叉哦!!!

    1. 简介 本文开始介绍如何通过unittest来管理和执行测试用例,这一篇主要是介绍unittest下addTest()方法来加载测试用例到测试套件中去.用addTest()方法来加载我们测试用例到 ...

  5. python+selenium基础篇,切入切出frame

    1.首先制作一个html的文件,代码如下 <!DOCTYPE html> <html> <head> <title>Frame_test</tit ...

  6. Python+Selenium基础篇之1-环境搭建

    Python + Selenium 自动化环境搭建过程 1. 所需组建 1.1 Selenium for python 1.2 Python 1.3 Notepad++ 作为刚初学者,这里不建议使用P ...

  7. python+selenium之框架设计

    一.自动化测试框架 1.什么是自动化测试框架 简单来说,自动化测试框架就是由一些标准,协议,规则组成,提供脚本运行的环境.自动化测试框架能够提供很多便利给用户高效完成一些事情,例如,结构清晰开发脚本, ...

  8. selenium基础框架的封装(Python版)

    一.常用函数的封装 在使用selenium做web自动化测试的过程中,经常会碰到各种各样的问题,比如: 1.页面加载比较慢时,selenium查找元素抛出异常,导致脚本运行中止 2.写完脚本后发现代码 ...

  9. selenium基础框架的封装(Python版)这篇帖子在百度关键词搜索的第一位了,有图为证,开心!

    百度搜索结果页地址:https://www.baidu.com/s?ie=utf-8&f=3&rsv_bp=1&rsv_idx=1&tn=baidu&wd=se ...

随机推荐

  1. IO流8 --- 使用FileReader和FileWriter实现文本文件的复制 --- 技术搬运工(尚硅谷)

    @Test public void test4(){ FileReader fr = null; FileWriter fw = null; try { fr = new FileReader(&qu ...

  2. Dockerfile Tomcat镜像制作

    FROM centos MAINTAINER taohaijun "thjtao@126.com" WORKDIR /home #上传安装包 COPY jdk-8u131-linu ...

  3. web前端学习(三)css学习笔记部分(7)-- 文字和字体相关样式、盒子相关样式、背景与边框相关样式

    12.  文字和字体相关样式 12.1  CSS3 给文字添加阴影 使用 text-shadow 属性给页面上的文字添加阴影效果,text-shadow 属性是在CSS2中定义的,在 CSS2.1 中 ...

  4. Python判断文件和文件夹是否存在的方法

    Python判断文件和文件夹是否存在的方法 这篇文章主要介绍了Python判断文件和文件夹是否存在的方法,本文还讲解了判断是否为文件或者目录的方法.os.path.lexist的作用.FTP中判断文件 ...

  5. Vue. 之 npm安装Element

    Vue. 之 npm安装Element 前提: 相关运行环境以搭建完成,例如:Node.Npm等.    假如我的项目目录如下: D:\DISK WORKSPACE\VSCODE\CDS\cds-ap ...

  6. tomcat的日志不输出日志信息的解决方法

    1.下载日志jar包,例如:commons-logging-1.1.1.jar.放在tomcat的bin目录下,或者是自己项目的lib包里. 2.修改tomcat的bin目录下面的catalina.b ...

  7. 【POJ 3294】Life Forms

    [链接]h在这里写链接 [题意] 给你n个字符串. 让你找最长的字符串s; 这个s在超过一半的子串里面都有出现过且长度大于n/2; 如果有多个,输出多行. (按字典序输出) 也没说会不会出现大写. [ ...

  8. 大数据技术之HBase

    第1章 HBase简介 1.1 什么是HBase HBase的原型是Google的BigTable论文,受到了该论文思想的启发,目前作为Hadoop的子项目来开发维护,用于支持结构化的数据存储. 官方 ...

  9. fedora 安装ftp

    fedora默认不安装ftp服务(包括client程序/service程序),需要进行手动安装: yum install ftp(安装client) yum install vsftpd(安装serv ...

  10. MUI - 封装localStorage与plus.storage

    MUI - 封装localStorage与plus.storage 2.0版本 在使用plus.storage频繁地存取数据时,可以感觉到明显的卡顿,而且很耗内存, 在切换到localstorage时 ...