Selenium自动化测试Python二:WebDriver基础
WebDriver基础
欢迎阅读WebDriver基础讲义。本篇讲义将会重点介绍Selenium WebDriver的环境搭建和基本使用方法。
WebDriver环境搭建
Selenium WebDriver 又称为 Selenium2。
Selenium 1 + WebDriver = Selenium 2
WebDriver是主流Web应用自动化测试框架,具有清晰面向对象 API,能以最佳的方式与浏览器进行交互。
支持的浏览器:
- Mozilla Firefox
- Google Chrome
- Microsoft Internet Explorer
- Opera
- Safari
- Apple iPhone
- Android browsers
环境搭建步骤
在上一篇中,我们已经确认使用Python来进行WebDriver的编码和操作。事实上Python+Selenium WebDriver环境的搭建分为两个部分:
- 安装python
- 安装Selenium
标准的安装步骤
选择Python的版本。
Python主流的有两个大的版本,2.7和3.5(请注意,从Python的3.5版本开始,不再支持Windows XP操作系统,Windows XP用户请安装3.4版本)。我们的例子将会选用面向未来的3.5版本。
安装Python。
在Python的官网下载最新的安装包,进行界面安装。https://www.python.org/
安装的时候,推荐选择“Add exe to path”,将会自动添加Python的程序到环境变量中。然后可以在命令行输入
python -V
检测安装的Python版本。当前的版本安装中将会默认已经安装了
setuptools
和pip
这两个Python的基本工具。如果使用了比较旧的Python版本的话,需要自行安装这两个工具。- setuptools:Python的基础工具包,用来构建、安装卸载Python程序
- pip:Python软件包的安装和管理工具。通过pip可以简单的安装Python的任意类库
安装Selenium2.0版本。
在Windows安装Selenium2.0,有两种途径。使用pip命令行或者源码安装。以下两种方法,使用任何一个均可。推荐pip的方式。
方法一:pip命令行安装,运行 | cmd,打开命令行,
-U
其实就是--upgrade
,升级安装。pip install -U selenium
方法二:源码解压安装,前往https://pypi.python.org/pypi/selenium下载最新版的PyPI版本的Selenium,解压后执行
python setup.py install
Ubuntu下的环境搭建
在Ubuntu下的Python的解释器一般情况下已经存在了。我们需要打开终端,输入python -V
命令进行验证。如果没有安装Python,那么需要去Python官网上下载指定版本的源文件,进行源码安装。安装完了以后并进行环境变量的设置。
安装Selenium WebDriver的方法与上述在Windows环境下安装部署的方法一致。依旧推荐使用pip命令行进行安装。
使用IDE编写Python
在上述环境搭建好以后,我们便可使用Python来编写自动化脚本程序,执行Selenium自动化测试。在此之前,我们依旧需要解决一个问题,那就是IDE的选择。
IDE,Integrated Development Environment,集成开发环境。一个好的编辑器或者好的IDE将会极大的提高生产力,帮我们做很多事情,使得编码工作更加简单,编码的体验更加容易。一般情况下,我们有以下几种工具可以选择:
- IDLE:Python自带的IDE,功能简单,使用方便
- Notepad++:一个强大的开源编辑器
- Vim:Linux系统中最好用的编辑器之一
- Sublime Text:一个非常轻便好用的现代化的编辑器,推荐。
- PyCharm:JetBrains公司提供的现代化的跨平台的Python IDE。
使用Sublime Text 3搭建Python环境
**通过快捷键
Ctrl
+ 或者View > Show Console打开控制台,输入以下代码并回车import urllib.request,os; pf = 'Package Control.sublime-package';
ipp = sublime.installed_packages_path();
urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) );
open(os.path.join(ipp, pf), 'wb').write(urllib.request.urlopen( 'http://sublime.wbond.net/' + pf.replace(' ','%20')).read())安装完以后,重启Sublime Text 3
如果在Perferences->package settings中看到package control这一项,则安装成功
按下Ctrl+Shift+P调出命令面板
输入install package选项并回车
输入i,匹配到以后,按回车,安装。Anaconda是一个终极的Python插件。安装完了以后便可用Sublime Text 3编写Python代码,并且使用
Ctrl
+B
来编译执行。
一般来说,一个好的IDE提供一下功能,使你的编码开发工作变得更有效率:
- 一个图形化的智能代码提示和补全功能
- 可以轻松查看方法和类
- 语法高亮
- 提供单元测试和调试的工具
- 源代码版本管理工具的支持
我们可以尝试用上述的编辑器或者IDE来进行Python代码编写工作。
开始使用WebDriver
接下来我们尝试几个简单的例子来体会一下Selenium WebDriver的使用。
示例1
## 引入WebDriver的包
from selenium import webdriver
## 创建浏览器对象
browser = webdriver.Firefox()
## 打开百度网站
browser.get('https://www.baidu.com/')
示例2
## 引入WebDriver包
from selenium import webdriver
## 引入WebDriver Keys包
from selenium.webdriver.common.keys import Keys
## 创建浏览器对象
browser = webdriver.Firefox()
## 导航到百度主页
browser.get('https://www.baidu.com')
## 检查标题是否为‘百度一下,你就知道’
assert '百度一下,你就知道' in browser.title
## 找到名字为wd的元素,赋值给elem
elem = browser.find_element_by_name('wd') # 找到搜索框
elem.send_keys('seleniumhq' + Keys.RETURN) # 搜索seleniumhq
## 关闭浏览器
browser.quit()
Selenium 3.0.1 出现的问题以及解决
3.0.1 更新以后,需要做两个操作:
- Geckodriver executable needs to be in PATH。Geckodirver的下载地址:https://github.com/mozilla/geckodriver/releases
报错内容:WebDriverException:Message:'geckodriver'executable needs to be in Path
geckodriver是一原生态的第三方浏览器,对于selenium3.x版本都会使用geckodriver来驱动firefox,所以需要下载geckodriver.exe。放置在Path 环境变量可以访问到的地方。例如 C:\python34
- 需要将火狐的安装路径放到path,然后重启(必须重启电脑)
报错内容:selenium.common.exceptions.WebDriverException: Message: 'geckodriver' executable needs to be in PATH.
XAMPP的安装部署和环境搭建
XAMPP的安装,在Windows操作系统中比较简单,可以直接运行安装文件,默认全部下一步,即可完成软件的安装。
请注意:Windows XP系统只能可以 XAMPP 1.8.2
版本;Windows 7以及以上的系统可以安装最新版的XAMPP。XAMPP不分32位和64位操作系统。
XAMPP的部署
XAMPP = OS + Apache + MySQL + PHP + Perl
我们一般部署的网站,符合XAMPP环境的话,只需要启动Apache和MySQL两个应用。
部署步骤
启动Apache
启动MySQL
解压网站源文件,例如解压然之:ranzhi.2.5.zip,请把压缩包里面的
ranzhi
这个文件夹解压出来;禅道也类似,需要把压缩包中的zentaopms
文件夹解压出来部署源文件,请将解压以后的源文件放到
xampp\htdocs
文件夹中通过浏览器访问部署好的网站源文件,进行向导安装。
http://localhost/ranzhi/www
PS
:这里我们主要支持的是PHP
+MySQL
开发的网站部署。
XAMPP的问题解决
无法启动Apache:请认真查看日志,判断80和443端口被什么样的程序占用,需要关闭对应程序,或者修改Apache的端口。
IIS
:控制面板 | 管理工具 | Internet信息服务 | 默认网站 | 关闭VisualSVN Server
: 控制面板 | 管理工具 | VisualSVN Server | 关闭VMware Workstation
: 开始 | VMware Workstation | 编辑 | 首选项 | 共享虚拟机 | 禁用共享HP LoadRunner
: 右侧任务栏 | 右键 | 关闭修改XAMPP Apache 端口
:Config | httpd.conf修改Linsten 80 | Httpd-ssl.conf修改 Listen 443
无法启动MySQL:请认真查看错误日志,找到已经启动的MySQL的程序进程,杀掉该进程。
使用unittest编写测试脚本
通过上面的例子,我们可以简单的写出Selenium WebDriver的脚本,但是对于测试工作来说,上述的脚本还远远不够。因为上述的脚本没有“检查”。
接下来我们将会使用Python语言的unittest
框架展开“检查”。
unittest基础
unittest
框架的原本的名字是PyUnit。是从JUnit这样一个被广泛使用的Java应用开发的单元测试框架创造而来。类似的框架还有NUnit(.Net开发的单元测试框架)等。
我们可以使用unittest框架为任意Python项目编写可理解的单元测试集合。现在这个unittest已经作为Python的标准库模块发布。我们安装完Python以后,便可以直接使用unittest。
unittest框架提供了编写test cases
,test suites
和test fixtures
的基本功能。我们首先关注 Test cases
的编写与执行。
使用unittest需要以下简单的三步:
- 引入unittest模组
- 继承unittest.TestCase基类
- 测试方法以
test
开头
unittest示例
## 引入unittest模组
import unittest
## 定义测试类,名字为DemoTests
## 该类必须继承unittest.TestCase基类
class DemoTests(unittest.TestCase):
## 使用'@'修饰符,注明该方法是类的方法
## setUpClass方法是在执行测试之前需要先调用的方法
## 是开始测试前的初始化工作
@classmethod
def setUpClass(cls):
pass
## 测试一(务必以test开头)
def test_01(self):
pass
## 测试三(务必以test开头)
def test_02(self):
pass
## 测试三(务必以test开头)
def test_03(self):
pass
## tearDownClass方法是执行完所有测试后调用的方法
## 是测试结束后的清除工作
@classmethod
def tearDownClass(cls):
pass
# 执行测试主函数
if __name__ == '__main__':
## 执行main全局方法,将会执行上述所有以test开头的测试方法
unittest.main(verbosity=2)
Python知识的补充:
- Python文件的后缀名是
.py
.py
文件可以用来直接执行。也可以被用来作为模块导入。在cmd命令行中执行的命令为python demo.py
- 在Python中导入模块(模组)一般使用的是
import
使用unittest框架编写Selenium WebDriver测试
接下来我们查看一个完整的Selenium WebDriver自动化测试实例
实例
import unittest
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
class SearchTests(unittest.TestCase):
def setUp(self):
# 创建一个新的浏览器对象
self.driver = webdriver.Firefox()
self.driver.implicitly_wait(30)
self.driver.maximize_window()
# 导航到京东主页
self.driver.get("https://www.jd.com/")
def test_search_by_category(self):
# 获取到搜索框
self.search_field = self.driver.find_element_by_id("key")
self.search_field.clear()
# 输入iphone 6s plus并按下回车进行搜索
self.search_field.send_keys("iphone 6s plus" + Keys.RETURN)
# 获取所有的查询结果
products = self.driver.find_elements_by_css_selector("li[class='gl-item']")
# 断言:检查查询出来的个数是否为24个
self.assertEqual(24, len(products))
def tearDown(self):
# 关闭浏览器对象
self.driver.quit()
if __name__ == '__main__':
unittest.main(verbosity=2)
理解unittest框架提供的各种断言方法
方法 Method | 检查条件 |
---|---|
assertEqual(a, b [, msg]) |
a == b,msg可选,用来解释失败的原因 |
assertNotEqual(a, b [, msg] |
a != b,msg可选,用来解释失败的原因 |
assertTrue(x [, msg]) |
x 是真,msg可选,用来解释失败的原因 |
assertFalse(x [, msg]) |
x 是假,msg可选,用来解释失败的原因 |
assertIsNot(a, b [, msg]) |
a 不是 b,msg可选,用来解释失败的原因 |
WebDriver API 基本操作
这里我们将会开始WebDriver API的基本操作,从元素定位以及浏览器的基本操作开始。
定位符
元素的定位和操作是自动化测试的核心部分,其操作是建立在定位的基础上的。因此我们首选要开始定位元素。
在html里面,元素具有各种各样的属性。我们可以通过这样唯一区别其他元素的属性来定位到这个元素。WebDriver提供了一系列的元素定位方法。常见的有以下几种:
- id
- name
- class name
- tag
- link text
- partial link text
- xpath
- css selector
查找简单元素
我们从简单的一个元素开始定位。最基本的方法是id
和name
。大多数元素有这两个属性,在对控件的id
和name
命名是一般也会使其有意义,而取不同的名字。
例如我们看下面这段html
<input id="search" type="text" name="q" value="" class="input-text" maxlength="128" />
我们可以使用对应的方法来定位这个input
find_element_by_id('search')
find_element_by_name('q')
find_element_by_class_name('input-text')
这里我们开始用最简单的方式来尝试定位
查看下面一个例子
self.driver.get('http://pro.demo.zentao.net')
# 用name定位用户文本输入框
self.account_field = self.driver.find_element_by_name('account')
# 用name定位密码文本输入框
self.password_field = self.driver.find_element_by_name('password')
self.account_field.clear()
self.password_field.clear()
self.driver.implicitly_wait(30)
# 输入用户名demo
self.account_field.send_keys('demo')
# 输入密码123456
self.password_field.send_keys('123456')
self.driver.find_element_by_id('submit').click()
self.driver.implicitly_wait(30)
companyname = self.driver.find_element_by_id('companyname')
self.assertEqual('demo项目管理系统', companyname.text)
示例2
self.driver.find_element_by_id('menuproduct').click()
self.driver.implicitly_wait(30)
self.driver.find_element_by_id('menuproject').click()
self.driver.implicitly_wait(30)
self.driver.find_element_by_id('menuqa').click()
self.driver.implicitly_wait(30)
self.driver.find_element_by_id('menudoc').click()
self.driver.implicitly_wait(30)
self.driver.find_element_by_id('menureport').click()
self.driver.implicitly_wait(30)
self.driver.find_element_by_id('menucompany').click()
self.driver.implicitly_wait(30)
self.driver.find_element_by_link_text('退出').click()
self.driver.implicitly_wait(30)
此外XPath
定位和CSS Selector
定位,和定位一组元素这样的内容案例,将在后续的讲义继续探讨和讲解。
控制浏览器
浏览器的控制也是自动化测试的一个基本组成部分,我们可以将浏览器最大化,设置浏览器的高度和宽度以及对浏览器进行导航操作等。
## 浏览器最大化
driver.maximize_window()
## 设置浏览器的高度为800像素,宽度为480像素
driver.set_window_size(480, 800)
## 浏览器后退
driver.back()
## 浏览器前进
driver.forward()
这里我们做一个综合性的练习实例
# coding=utf-8
import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
# import sys
# reload(sys)
# sys.setdefaultencoding('utf8')
class WebDriverTests(unittest.TestCase):
@classmethod
def setUpClass(cls):
# create a new Firefox session
cls.driver = webdriver.Firefox()
cls.driver.get('about:blank')
cls.driver.implicitly_wait(30)
print(" -- set up finished -- ")
print()
def test_01_navigate(self):
pass
url_baidu = 'https://www.baidu.com/'
url_zentao = 'http://pro.demo.zentao.net/user-login-Lw==.html'
# 导航到百度
self.driver.get(url_baidu)
self.driver.maximize_window()
self.driver.implicitly_wait(30)
# 导航到禅道
self.driver.get(url_zentao)
self.driver.maximize_window()
self.driver.implicitly_wait(30)
# 后退
self.driver.back()
self.assertEqual(url_baidu, self.driver.current_url)
self.driver.implicitly_wait(30)
# 前进
self.driver.forward()
self.assertEqual(url_zentao, self.driver.current_url)
self.driver.implicitly_wait(30)
print("-- test 01 finished -- ")
print()
def test_02_element_interaction(self):
self.driver.get('http://pro.demo.zentao.net')
## 找到用户名和密码的输入框
self.account_field = self.driver.find_element_by_name('account')
self.password_field = self.driver.find_element_by_name('password')
## 清除当前的输入
self.account_field.clear()
self.password_field.clear()
self.driver.implicitly_wait(30)
## 输入用户名和密码,进行登录
self.account_field.send_keys('demo')
self.password_field.send_keys('123456')
self.driver.find_element_by_id('submit').click()
self.driver.implicitly_wait(30)
companyname = self.driver.find_element_by_id('companyname')
self.assertEqual('demo项目管理系统', companyname.text)
print(companyname.get_attribute('type'))
print()
self.driver.implicitly_wait(30)
print('-- test 02 finished -- ')
print()
def test_03_element_interation2(self):
## 这里执行了一段JavaScript代码
js = 'selectTheme("green")'
self.driver.execute_script(js)
self.driver.implicitly_wait(30)
js = 'selectTheme("red")'
self.driver.execute_script(js)
self.driver.implicitly_wait(30)
js = 'selectTheme("lightblue")'
self.driver.execute_script(js)
self.driver.implicitly_wait(30)
js = 'selectTheme("blackberry")'
self.driver.execute_script(js)
self.driver.implicitly_wait(30)
self.driver.find_element_by_id('menuproduct').click()
self.driver.implicitly_wait(30)
self.driver.find_element_by_id('menuproject').click()
self.driver.implicitly_wait(30)
self.driver.find_element_by_id('menuqa').click()
self.driver.implicitly_wait(30)
self.driver.find_element_by_id('menudoc').click()
self.driver.implicitly_wait(30)
self.driver.find_element_by_id('menureport').click()
self.driver.implicitly_wait(30)
self.driver.find_element_by_id('menucompany').click()
self.driver.implicitly_wait(30)
self.driver.find_element_by_link_text('退出').click()
self.driver.implicitly_wait(30)
WebDriverWait(self.driver, 10).until(
expected_conditions.element_to_be_clickable((By.ID, "submit")))
self.driver.implicitly_wait(30)
print('-- test 03 finished -- ')
print()
def test_04_cookies(self):
self.driver.add_cookie(
{'name': 'key-neeeeew', 'value': 'value-neeeewwwww'})
# 遍历cookies 中的name 和value 信息打印,当然还有上面添加的信息
for cookie in self.driver.get_cookies():
print("%s -> %s" % (cookie['name'], cookie['value']))
print()
self.driver.delete_all_cookies()
cookies = self.driver.get_cookies()
print(cookies)
print()
print('-- test 04 finished -- ')
print()
@classmethod
def tearDownClass(cls):
# close the browser window
cls.driver.quit()
pass
print('-- tear down finished -- ')
print()
if __name__ == '__main__':
unittest.main(verbosity=2)
转载来源:http://www.jianshu.com/p/3ce95cbc65be
Selenium自动化测试Python二:WebDriver基础的更多相关文章
- Selenium自动化测试Python五:WebDriver设计模式
WebDriver 设计模式 欢迎阅读WebDriver进阶讲义.本篇讲义将会重点介绍Selenium WebDriver 自动化框架的设计,着重使用Page Object设计模式,以及使用HTML测 ...
- Selenium自动化测试Python一:Selenium入门
Selenium入门 欢迎阅读Selenium入门讲义,本讲义将会重点介绍Selenium的入门知识以及Selenium的前置知识. 自动化测试的基础 在Selenium的课程以前,我们先回顾一下软件 ...
- Selenium自动化测试Python六:持续集成
持续集成 欢迎阅读WebDriver持续集成讲义.本篇讲义将会重点介绍Selenium WebDriver API的在持续集成中的使用方法,以及使用Jenkins持续集成工具进行自动化测试的设计. 持 ...
- 《手把手教你》系列进阶篇之1-python+ selenium自动化测试 - python基础扫盲(详细教程)
1. 简介 如果你从一开始就跟着宏哥看博客文章到这里,基础篇和练习篇的文章.如果你认真看过,并且手动去敲过每一篇的脚本代码,那边恭喜你,至少说你算真正会利用Python+Selenium编写自动化脚本 ...
- Selenium自动化测试Python四:WebDriver封装
WebDriver 封装 欢迎阅读WebDriver封装讲义.本篇讲义将会重点介绍Selenium WebDriver API的封装的概念和方法,以及使用封装进行自动化测试的设计. WebDriver ...
- Selenium自动化测试Python三:WebDriver进阶
WebDriver 进阶 欢迎阅读WebDriver进阶讲义.本篇讲义将会重点介绍Selenium WebDriver API的重点使用方法,以及使用模块化和参数化进行自动化测试的设计. WebDri ...
- Selenium基于Python web自动化基础二 -- 免登录、等待及unittest单元测试框架
一.免登录在进行测试的过程中难免会遇到登录的情况,给测试工作添加了工作量,本文仅提供一些思路供参考解决方式:手动请求中添加cookies.火狐的profile文件记录信息实现.人工介入.万能验证码.去 ...
- 《手把手教你》系列进阶篇之2-python+ selenium自动化测试 - python基础扫盲(详细教程)
1. 简介 这篇文章主要是分享讲解一下,如何封装自己用到的方法和类.以便方便自己和别人的调用,这样就可以避免重复地再造轮子. 封装(Encapsulation)是面向对象的三大特征之一(另外两个是继承 ...
- selenium自动化测试python
一.环境部署 1.selenium安装 pip3 install selenium 1.安装浏览器驱动 WebDriver 需要通过浏览器驱动来与浏览器交互,以下列出几种常用的浏览器驱动下载地址: C ...
随机推荐
- vue的饿了么写作感受
1.在重复使用的组件中,要把重复使用组件的需要在数据的请求的地方设置为在富组件中,通过props船只到子组件,这样在重复调用次组件的时候既可以很好的避免组件的值的冲突 2.getData的使用,把所有 ...
- Oracle 数据库 dbConsole 配置笔记
Oracle安装后,DBConsole有时安装会失败,这时可以通过以下命令恢复: set oracle_sid=orclemca -repos recreateemca -config dbcontr ...
- currentTarget
定义和用法 currentTarget 事件属性返回其监听器触发事件的节点,即当前处理该事件的元素.文档或窗口. 在捕获和起泡阶段,该属性是非常有用的,因为在这两个节点,它不同于 target 属性. ...
- BUG 图片元素img下 高度超出 出现多余空白
BUG 图片元素img下 高度超出 出现多余空白 1.将图片转换为块级对象 即,设置img为“display:block;”. 2.设置图片的垂直对齐方式 即设置图片的vertical-align ...
- String、Stringbuffer、Stringbuilder三者之间的区别
1.首先说运行速度,速度由快到慢排列:StringBuilder > StringBuffer > String String最慢的原因: String为字符串常量,而StringBuil ...
- java基础-day20
第09天 IO流 今日内容介绍 u File类 u 字符流与字节流 第1章 File类 1.1 File概述 打开API,搜索File类.阅读其描述:File文件和目录路径名的抽象表 ...
- Java相关工具下载、配置环境变量
相关工具下载 JDK:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html Eclip ...
- hadoop一代集群运行代码案例
hadoop一代集群运行代码案例 集群 一个 master,两个slave,IP分别是192.168.1.2.192.168.1.3.192.168.1.4 hadoop版 ...
- excel冻结窗格
编辑excel时冻结窗格可以大大增加可读性.每个sheet都应该加上. 第一份工作的时候,上司比较严格,还因为这个挨过几次骂.所以这个技巧大家一定要掌握 方法很简单: 选中首行:视图 -- 冻结窗格 ...
- PowerDesigner常用功能介绍
PowerDesigner常用功能:1:把SQL脚步导入PowerDesigner打开powerdesigner,选择File --> Reverse Engineer --> Datab ...