一、常用函数的封装

在使用selenium做web自动化测试的过程中,经常会碰到各种各样的问题,比如:

  1、页面加载比较慢时,selenium查找元素抛出异常,导致脚本运行中止

  2、写完脚本后发现代码逻辑不够清晰,维护困难,降低测试效率

所以很有必要对selenium进行封装使框架更适合公司的需求,下面是基类的封装,主要使用单例模式,可以将业务逻辑代码存放在不同的Python文件中

注:BASE_URL为博客园的登录地址

 # -*- coding:utf-8 -*-
from selenium import webdriver
import time OVER_TIME = 5
BASE_URL = "https://passport.cnblogs.com/user/signin?ReturnUrl=https%3A%2F%2Fwww.cnblogs.com%2F" class Driver(object): def __new__(cls, *args, **kw):
"""
使用单例模式将类设置为运行时只有一个实例,在其他Python类中使用基类时,
可以创建多个对象,保证所有的对象都是基于一个浏览器
"""
if not hasattr(cls, '_instance'):
orig = super(Driver, cls)
cls._instance = orig.__new__(cls, *args, **kw)
return cls._instance def start(self, url=BASE_URL, driver_name="Chrome"):
"""
启动浏览器
:param url: 测试地址
:param driver_name: 在启动时设置浏览器的类型
:return:
"""
if driver_name == "Firefox":
self.driver = webdriver.Firefox()
elif driver_name == "Ie":
self.driver = webdriver.Ie()
else:
self.driver = webdriver.Chrome()
self.driver.implicitly_wait(OVER_TIME)
self.driver.get(url)
self.driver.maximize_window() def get_url(self):
"""返回浏览器的地址"""
return BASE_URL def find_element(self, by, value):
"""
这里添加了一个OVER_TIME作为查找元素的超时次数,根据系统的实际情况设置OVER_TIME的大小
"""
for i in range(OVER_TIME):
try:
return self.driver.find_element(by=by, value=value)
except Exception, e:
print e def find_elements(self, by, value):
"""与find_element一致"""
for i in range(OVER_TIME):
try:
return self.driver.find_elements(by=by, value=value)
except Exception, e:
print e def find_display_elements(self, by, value):
"""
查找状态为displayed的元素集合,当查找一类元素时,
经常出现有些元素是不可见的情况,此函数屏蔽那些不可见的元素
"""
for i in range(OVER_TIME):
try:
elements = self.driver.find_elements(by=by, value=value)
num = elements.__len__()
except Exception, e:
print e
time.sleep(1)
if num >= 1:
break
display_element = []
# 将可见的元素放到列表中, 并返回
for j in range(num):
element = elements.__getitem__(j)
if element.is_displayed():
display_element.append(element)
return display_element def is_element_present(self, By, Value):
"""判断元素是否存在"""
try:
self.driver.find_element(by=By, value=Value)
return True
except Exception, e:
print e
return False def close(self):
self.driver.close() def quit(self):
u"""退出浏览器"""
self.driver.quit() if __name__ == "__main__":
page = Driver()
page.start()

 二、使用封装过的框架和pageobject模式设计登录脚本

 # -*- coding:utf-8 -*-
from webdriver import Driver
from selenium.webdriver.common.by import By class Login(object): def __init__(self, user_name="xxx", pwd="xxx"):
self.page = Driver()
page = self.page
page.start(url=page.get_url())
self.user_name = page.find_element(By.ID, "input1")
self.pwd = page.find_element(By.ID, "input2")
self.login_btn = page.find_element(By.ID, "signin")
self.login(user_name, pwd) def login(self, user_name, pwd):
self.user_name.clear()
self.user_name.send_keys(user_name)
self.pwd.clear()
self.pwd.send_keys(pwd)
self.login_btn.click() if __name__ == "__main__":
Login("xxx", "xxx")

 三、打开博客园新闻、博问等子页面脚本设计

 # -*- coding:utf-8 -*-
from webdriver import Driver
from login import Login
from selenium.webdriver.common.by import By class SubPage(object): def __init__(self):
self.page = Driver()
page = self.page
self.home_page = page.find_element(By.LINK_TEXT, u"园子")
self.news_page = page.find_element(By.LINK_TEXT, u"新闻")
self.q_page = page.find_element(By.LINK_TEXT, u"博问")
self.ing_page = page.find_element(By.LINK_TEXT, u"闪存") def open_home_page(self):
self.home_page.click() def open_news_page(self):
self.news_page.click() def open_q_page(self):
self.q_page.click() def open_ing_page(self):
self.ing_page.click() if __name__ == '__main__':
Login("xxx", "xxx")
sub = SubPage()
sub.open_q_page()

四、其他

  按照此模式博友可根据公司具体的业务来实现自动化测试脚本,本文抛砖引玉,如有其他更好的想法可以一起探讨

                                                      Thanks!

selenium基础框架的封装(Python版)的更多相关文章

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

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

  2. python selenium 基础框架

    base_page.py # coding=utf-8 import time from selenium.common.exceptions import NoSuchElementExceptio ...

  3. selenium截取具体元素图片(python版)

    原理: 1.截图(整个窗口) 2.获取此元素坐标 element = driver.find_element_by_id("xx") element.location) 3.获取此 ...

  4. 数论基础算法总结(python版)

    /* Author: wsnpyo Update Date: 2014-11-16 Algorithm: 快速幂/Fermat, Solovay_Stassen, Miller-Rabin素性检验/E ...

  5. 『心善渊』Selenium3.0基础 — 2、Selenium测试框架环境搭建(Windows)

    目录 1.浏览器安装 2.浏览器驱动下载 (1)ChromeDriver for Chrome (2)Geckodriver for Firefox (3)IEDriverServer for IE ...

  6. 《手把手教你》系列基础篇(九十七)-java+ selenium自动化测试-框架设计篇-Selenium方法的二次封装和页面基类(详解教程)

    1.简介 上一篇宏哥介绍了如何设计支持不同浏览器测试,宏哥的方法就是通过来切换配置文件设置的浏览器名称的值,来确定启动什么浏览器进行脚本测试.宏哥将这个叫做浏览器引擎类.这个类负责获取浏览器类型和启动 ...

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

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

  8. Python基础教程(第3版)PDF高清完整版免费下载|百度云盘

    百度云盘:Python基础教程(第3版)PDF高清完整版免费下载 提取码:gkiy 内容简介 本书包括Python程序设计的方方面面:首先从Python的安装开始,随后介绍了Python的基础知识和基 ...

  9. python+selenium之框架设计

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

随机推荐

  1. linux下处理excel里copy的某列的字符串,去除行末空格并添加特殊字段

    背景:从excel里copy出一列数据到txt,然后放到linux下处理,发现每一行末尾都是固定个数的空格,我想要在每行字符串末尾加固定字段并逗号隔开输出, 1.将特定字段取出,去掉每行末尾的不定个数 ...

  2. VM安装centos

    1,centOS下载地址:http://mirrors.163.com/centos/7/isos/x86_64/ 2,VM下载地址:http://rj.baidu.com/soft/detail/1 ...

  3. iOS中书写代码规范35条小建议

    1.精简代码, 返回最后一句的值,这个方法有一个优点,所有的变量都在代码块中,也就是只在代码块的区域中有效,这意味着可以减少对其他作用域的命名污染.但缺点是可读性比较差 NSURL *url = ({ ...

  4. PT20150801隆重开班

    PT20150801隆重开班 伴随着秋天的的脚步,带着对梦想的憧憬,POPTEST1508期学员步入正式学习阶段:POPTEST的课程内容吸收了互联网公司先进技术的特点,同时坚持深入浅出的教育特点,完 ...

  5. Framework7首页隐藏navbar其他页面显示navbar

    Framework7首页隐藏navbar其他页面显示navbar 帮别人解决问题,自己也记录一下, 首页.navbar加.navbar-hidden, 首页.page加.no-navbar, 如果首页 ...

  6. CF #401 (Div. 2) E. Hanoi Factory (栈+贪心)

    题意:给你一堆汉诺塔的盘子,设内半径为a,设外半径为b,高度为h,如果bj ≤ bi 同时bj > ai 我们就认为i盘子能落在在j盘子上,问你最高能落多高 思路:一看题意我们就能想到贪心,首先 ...

  7. qt5的.ui文件在VS2010中无法编译问题

    自己手动添加的.ui文件在VS中是无法右键编译的,也即是说,在用QT designer编辑过的.ui文件无法实时更新相应的ui_XX.h文件,造成调试结果无法显示编辑过的新界面. 解决办法: 右键.u ...

  8. JavaScript学习总结(一)DOM文档对象模型

    一.文档(D) 一个网页运行在浏览器中,他就是一个文档对象. 二.对象(O) "对象"是一种自足的数据集合.与某个特定对象相关联的变量被称为这个对象的属性,只能通过某个对象调用的函 ...

  9. linux mail命令详解

    用程序发送邮件有3种方式,分别是: 1.模拟http请求邮件服务商网页实现邮件的发送 2.如果邮件服务商开通了smtp服务,那么可以通过smtp协议通过邮件代理服务商发送邮件 3.自己部署邮件服务器, ...

  10. html+css底部自动固定底部

    前端在切图过程中,肯定遇见过这种情况. 页面结构由三个部分组成,头部.内容.底部. 当一个页面的内容没撑满屏幕时,底部是跟着内容而并列存在的. 这个时候如果是大屏的话,底部下面会有多余的空白区域,而网 ...