python selenium 基础框架

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

browser_engine.py

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

logger.py

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

baidu_homepage.py

# coding=utf-8
from unittest3.framework.base_page import BasePage

class HomePage(BasePage):
    input_box = "id=>kw"
    search_submit_btn = "xpath=>//*[@id=‘su‘]"

    def type_search(self, text):
        self.type(self.input_box, text)

    def send_submit_btn(self):
        self.click(self.search_submit_btn)

测试类代码 baidu_search.py

# coding=utf-8
import time
import unittest
from selenium import  webdriver
from unittest3.page_object.baidu_homepage import HomePage
from unittest3.framework.browser_engine import BrowserEngine

class BaiduSearch(unittest.TestCase):
    def setUp(self):
        """
        测试固件的setUp()的代码,主要是测试的前提准备工作
        :return:
        """
        # 添加如下代码,可运行
        # -------------------------------------------
        # browse = BrowserEngine(self)
        # self.driver = webdriver.Firefox()
        # self.driver.get(‘https://www.baidu.com‘)
        #-------------------------------------------
        # 修改代码可以执行
        browse = BrowserEngine(self)
        self.driver=browse.get_browser()

    def tearDown(self):
        """
        测试结束后的操作,这里基本上都是关闭浏览器
        :return:
        """
        self.driver.quit()

    def test_baidu_search(self):
        """
        这里一定要test开头,把测试逻辑代码封装到一个test开头的方法里。
        :return:
        """
        homepage = HomePage(self.driver)
        homepage.type_search(‘selenium‘)  # 调用页面对象中的方法
        homepage.send_submit_btn()  # 调用页面对象类中的点击搜索按钮方法
        time.sleep(2)
        homepage.get_windows_img()  # 调用基类截图方法
        try:
            assert ‘selenium‘ in homepage.get_page_title()  # 调用页面对象继承基类中的获取页面标题方法
            print(‘Test Pass.‘)
        except Exception as e:
            print(‘Test Fail.‘, format(e))

if __name__ == ‘__main__‘:
    unittest.main()

原文地址:https://www.cnblogs.com/yye2010/p/8607949.html

时间: 2024-11-05 16:12:41

python selenium 基础框架的相关文章

python+selenium之框架设计

一.自动化测试框架 1.什么是自动化测试框架 简单来说,自动化测试框架就是由一些标准,协议,规则组成,提供脚本运行的环境.自动化测试框架能够提供很多便利给用户高效完成一些事情,例如,结构清晰开发脚本,多种方式.平台执行脚本,良好的报告去跟踪脚本执行结果. 框架具有以下一些优点: 1)代码复用 2)最大覆盖率 3)很低成本维护 4)很少人工干预 5)简单报告输出 2.常见的测试框架分类 好多Selenium自动化测试开发人员是有QTP那边转过来的,所以,他们在早期设计的框架大致可分为以下几类: 1

python编程基础框架

a.python 开发 a.1基础 python,java语言优势:可以写网页+后台功能,python开发效率高,执行效率低,java执行效率高,开发效率低 环境变量配置:进入--->控制面板\用户帐户和家庭安全\用户帐户--->更改我的环境变量--->系统变量--->path--->;F:\python3.6.3(分号+python安装位置) python后缀名:以.py结束 执行方式:1)python编译器(软件),py文件路径:解释器路径:#!/usr/bin/env

2.自动化测试之python+selenium基础

元素的定位    浏览器控制    鼠标事件      键盘事件    获取验证 设置等待      sleep休眠    定位一组元素   多表单切换  多窗口切换 警告框处理    上传文件      下载文件      cookies操作 javascript调用 截图          关闭窗口      验证码处理 一.元素的定位 1.webdriver提供的8种页面元素定位方法:     id/name/class name/tag name/link text/partial li

python+selenium+unitest框架断言方法详细教程

常用断言 assertLocation(判断当前是在正确的页面) assertTitle(检查当前页面的 title 是否正确) assertValue(检查 input 的值, checkbox 或 radio,有值为"on"无为"off") assertSelected(检查 select 的下拉菜单中选中是否正确) assertSelectedOptions(检查下拉菜单中的选项的是否正确) assertText(检查指定元素的文本) assertTextPr

python+selenium自动化框架搭建入门到实用(一)-框架解决

1.整个框架目录如下: constant:存放一些常量,比如测试的url,以及一些公关方法需要用到的元素: errorpicture:用于存放自动运行过程中的错误截图: framework:用于存放一些基础的类及方法: pages:用于存放PageObject的页面类: publicmethod:用于存放一些公关方法: question:用于存放开发过程中遇到的一些问题,以及框架目前需要优化的地方: report:存放测试报告: resource:存放测试数据: testmethods:存放测试

Python+Selenium基础篇之5-第一个完整的自动化测试脚本

前面文章,我们介绍了如何采用XPath表达式去定位网页元素,在掌握了如何抓取或者如何书写精确的XPath表达式后,我们可以开始写自己的第一个真正意义上的webui 自动化测试脚本,就相当于,你在学习Python,如何在控制台打印Hello,Python! 一样. 我们的测试用例是:打开百度首页,搜索Selenium,然后检查搜索列表,有没有Selenium这个官网链接选项. 在写自动化脚本之前,需要明确手动脚本的步骤,然后去拆分到具体没一个步骤做什么,考虑好了之后,才开始动手去写脚本.我把这个测

Python+Selenium基础篇之3-打开和关闭IE/Chrome浏览器

前面文章介绍了,如何调用webdriver接口方法来打开和关闭Firefox浏览器,本文介绍如何打开IE和Chrome浏览器.web项目,需要做兼容性测试,最重要的是浏览器兼容性测试.如果只考虑windows平台,相信应该很多公司必须要测试IE.Firefox.Chrome这三大浏览器.所以webui 自动化测试,也需要在这三大浏览器上面运行和测试脚本.从前面文章,我们知道,要调用Firefox浏览器,我们需要下载geckodriver.exe这个文件,放到Python的安装路径下,例如在安装P

python+selenium基础之XPATH定位

世界上最远的距离大概就是明明看到一个页面元素矗在那里,但是我却定位不到!! selenium定位元素的方法有很多种,像是通过id.name.class_name.tag_name.link_text等等,但是这些方法局限性太大,拿id属性来说,首先一定不会每个元素都有id属性,其次元素的id属性也不一定是固定不变的.所以这些方法了解一下即可,我们真正需要熟练掌握的是通过xpath和css定位,一般只要掌握一种就可以应对大部分定位工作了. 下面总结一下xpath的定位方法,结合自己练习的实例加深一

Python+Selenium基础篇之4-XPath的使用

开始写自动化脚本之前,我们先学习几个概念,在完全掌握了这几个概念之后,有助于我们快速上手,如何去编写自动化测试脚本. 元素,在这个教程系列,我们说的元素之网页元素(web element).在网页上面的文本输入框,按钮,多选,单选,标签,和文字都叫元素,总之,凡是能在页面显示的对象都可以作为页面元素对象. 元素定位,有时候也叫Locator,一个HTML页面元素,可以用很多方法去描述这个元素的位置.打个比方,生活中地址,一个大厦,正常的地址是 xx省xx市xx区xx街道xxx号,这个具体描述就是