目录
-
- 简介
- 第一个Selenium例子
- unitt-基本认识
- unitt增加测试用例
- unitt设置同一个开头和结尾
- unitt断言
- unitt测试套件
- unitt生成HTML格式的测试报告
- unitt定位
- WebDriver功能(一)
- WebDriver方法(一)
- WebElement接口
- WebElement接口实战(已失效)
- WebDriver操作下拉菜单
- WebDriver操作警告和弹窗框
- selenium隐式等待
- selenium显示等待
- selenium预期条件判断等待
- selenium使用ddt执行数据驱动测试(内部自定义,CSV,excel,数据库)
- selenium的PageObject模式
- selenium的PageObject模式-仿写测试百度
- Selenium WebDriver的高级特性-键盘与鼠标事件
- Selenium WebDriver的高级特性-调用JavaScript
- Selenium WebDriver的高级特性-屏幕截图
- Selenium WebDriver的高级特性-屏幕录制(有问题,待解决)
- Selenium WebDriver的高级特性-弹出窗处理
- Selenium WebDriver的高级特性-操作cookie
- 移动端测试
简介
Selenium是一个主要用于Web应用程序自动化测试的工具集合,在行业内已经得到广泛的应用。介绍如何用Python语言调用Selenium WebDriver接口进行自动化测试。主要内容为:基于Python 的 SeleniumWebDriver 入门知识、第一个Selenium Python脚本、使用unittest 编写单元测试、生成HTML格式的测试报告、元素定位、Selenium Python API 介绍、元素等待机制、跨浏览器测试、移动端测试、编写一个iOS测试脚本、编写一个Android测试脚本、Page Object与数据驱动测试、Selenium WebDriver的高级特性、第三方工具与框架集成等核心技术。
第一个Selenium例子
"""
我们需要从Selenium包中导入WebDriver才能使用
Selenium WebDriver方法.
from selenium import webdriver
"""
from selenium import webdriver
"""
我们使用的是Chrom浏览器。我们可以通
过下方命令来创建一个Chrom浏览器驱动实例.
browser=webdriver.Chrome()
"""
browser=webdriver.Chrome()
"""
我们使用30秒隐式等待时间来定义Selenium执行步
骤的超时时间,并且调用Selenium API来最大化浏览器
窗口。
"""
browser.implicitly_wait(30)
browser.maximize_window()
"""
我们使用示例程序的URL作为参数,通过调
用browser.get()方法访问该应用程序。在get()方法被调用
后,WebDriver会等待,一直到页面加载完成才继续控
制脚本。在加载页面后,Selenium会像用户真实使用那样,
和页面上各种各样的元素交互。
browser.get('https://www.baidu.com/')
"""
browser.get('https://www.baidu.com/')
"""
我们使用find_element_by_name方
法来定位搜索输入框。这个方法会返回第一个name属
性值与输入参数匹配的元素。HTML元素是用标签和属
性来定义的,我们可以使用这些信息来定位一个元素,
步骤如下。
search_field = browser.find_element_by_name("wd")
"""
search_field = browser.find_element_by_name("wd")
"""
一旦找到这个搜索输入框,我们可以使用
clear()方法来清理之前的值(如果搜索输入框已经有值
的话),并且通过send_keys()方法输入新的特定的值。
"""
search_field.clear()
search_field.send_keys("Selenium")
"""
接着我们通过调用submit()方法提交搜索请求。(对于输入框这些可以直接提交)
"""
search_field.submit()
"""
在脚本的最后,我们使用browser.quit()方法来
关闭Chrom浏览器。
"""
browser.quit()
unitt-基本认识
# 引入unittest模块
import unittest
from selenium import webdriver
"""
定义一个继承于
TestCase 类的子类,具体如下
"""
class SearchTest(unittest.TestCase):
"""
setUp()方法
一个测试用例是从setUp()方法开始执行的,我们可
以用这个方法在每个测试开始前去执行一些初始化的任
务。可以是这样的初始化准备:比如创建浏览器实例,
访问URL,加载测试数据和打开日志文件等。
此方法没有参数,而且不返回任何值。当定义了一
个setUp()方法,测试执行器在每次执行测试方法之前优
先执行该方法。在下面的例子里,我们将用setUp()方法
来创建Firefox的实例,设置properties,而且在测试开始
执行之前访问到被测程序的主页。例子如下。
"""
def setUp(self):
self.browser = webdriver.Chrome()
self.browser.implicitly_wait(30)
self.browser.maximize_window()
self.browser.get("http://demo.magentocommerce.com")
"""
编写测试
有了setUp()方法,现在可以写一些测试用来验证我
们想要测试的程序的功能。在这个例子里,我们将搜索
一个产品,然后检查是否返回一些相应的结果。与
setUp()方法相似,test方法也是在TestCase类中实现。
重要的一点是我们需要给测试方法命名为test开头。这
种命名约定通知test runner哪个方法代表测试方法。
对于test runner能找到的每个测试方法,都会在执
行测试方法之前先执行setUp()方法。这样做有助于确保
每个测试方法都能够依赖相同的环境,无论类中有多少
测试方法。我们将使用简单的assertEqual()方法来验证
用程序搜索该术语返回的结果是否和预期结果相匹配。
我们将在本章后面内容探讨更多关于断言的内容。
添加一个新的测试方法test_search_by_category(),
通过分类来搜索产品,然后校验返回的产品的数量是否
正确,具体如下。
"""
def test_search_by_category(self):
# get the search textbox
self.search_field = self.browser.find_element_by_name("q")
self.search_field.clear()
# enter search keyword and submit
self.search_field.send_keys("phones")
self.search_field.submit()
# get all the anchor elements which have product names
# displayed currently on result page using
# find_elements_by_xpath method
products = self.browser.find_elements_by_xpath("//h2[@class='product-name']/a")
self.assertEqual(2, len(products))
"""
代码清理
类似于setUp()方法在每个测试方法之前被调用,
TestCase类也会在测试执行完成之后调用tearDown()方法
来清理所有的初始化值。一旦测试被执行,在setUp()
方法中定义的值将不再需要,所以最好的做法是在测试
执行完成的时候清理掉由setUp()方法初始化的数值。在
我们的例子里,在测试执行完成后,就不再需要Firefox
的实例。我们将在tearDown()方法中关闭Firefox实例,
如下代码所示。
"""
def tearDown(self):
self.browser.quit()
"""
运行测试
为了通过命令行运行测试,我们可以在测试用例中
添加对main方法的调用。我们将传递verbosity参数以便
使详细的测试总量展示在控制台
"""
if __name__ == '__main__':
unittest.main(verbosity=2)
unitt增加测试用例
# 引入unittest模块
import unittest
from selenium import webdriver
"""
定义一个继承于
TestCase 类的子类,具体如下
"""
class SearchTest(unittest.TestCase):
"""
setUp()方法
一个测试用例是从setUp()方法开始执行的,我们可
以用这个方法在每个测试开始前去执行一些初始化的任
务。可以是这样的初始化准备:比如创建浏览器实例,
访问URL,加载测试数据和打开日志文件等。
此方法没有参数,而且不返回任何值。当定义了一
个setUp()方法,测试执行器在每次执行测试方法之前优
先执行该方法。在下面的例子里,我们将用setUp()方法
来创建Firefox的实例,设置properties,而且在测试开始
执行之前访问到被测程序的主页。例子如下。
"""
def setUp(self):
self.browser = webdriver.Chrome()
self.browser.implicitly_wait(30)
self.browser.maximize_window()
self.browser.get("http://demo.magentocommerce.com")
"""
编写测试
有了setUp()方法,现在可以写一些测试用来验证我
们想要测试的程序的功能。在这个例子里,我们将搜索
一个产品,然后检查是否返回一些相应的结果。与
setUp()方法相似,test方法也是在TestCase类中实现。
重要的一点是我们需要给测试方法命名为test开头。这
种命名约定通知test runner哪个方法代表测试方法。
对于test runner能找到的每个测试方法,都会在执
行测试方法之前先执行setUp()方法。这样做有助于确保
每个测试方法都能够依赖相同的环境,无论类中有多少
测试方法。我们将使用简单的assertEqual()方法来验证
用程序搜索该术语返回的结果是否和预期结果相匹配。
我们将在本章后面内容探讨更多关于断言的内容。
添加一个新的测试方法test_search_by_category(),
通过分类来搜索产品,然后校验返回的产品的数量是否
正确,具体如下。
"""
def test_search_by_category(self):
# get the search textbox
self.search_field = self.browser.find_element_by_name("q")
self.search_field.clear()
# enter search keyword and submit
self.search_field.send_keys("phones")
self.search_field.submit()
# get all the anchor elements which have product names
# displayed currently on result page using
# find_elements_by_xpath method
products = self.browser.find_elements_by_xpath("//h2[@class='product-name']/a")
self.assertEqual(2, len(products))
"""
添加其他测试
我们可以用一组测试来构建一个测试类,这样有助
于为一个特定功能创建一组更合乎逻辑的测试。下面为
测试类添加其他的测试。规则很简单,新的测试方法命
名也要以test开头,如下列代码。
"""
def test_search_by_name(self):
# get the search textbox
self.search_field = self.browser.find_element_by_name("q")
self.search_field.clear()
# enter search keyword and submit
self.search_field.send_keys("salt shaker")
self.search_field.submit()
# get all the anchor elements which have
# product names displayed
# currently on result page using
# find_elements_by_xpath method
products = self.browser.find_elements_by_xpath("//h2[@class='product-name']/a")
self.assertEqual(1, len(products))
"""
代码清理
类似于setUp()方法在每个测试方法之前被调用,
TestCase类也会在测试执行完成之后调用tearDown()方法
来清理所有的初始化值。一旦测试被执行,在setUp()
方法中定义的值将不再需要,所以最好的做法是在测试
执行完成的时候清理掉由setUp()方法初始化的数值。在
我们的例子里,在测试执行完成后,就不再需要Firefox
的实例。我们将在tearDown()方法中关闭Firefox实例,
如下代码所示。
"""
def tearDown(self):
self.browser.quit()
"""
运行测试
为了通过命令行运行测试,我们可以在测试用例中
添加对main方法的调用。我们将传递verbosity参数以便
使详细的测试总量展示在控制台
"""
if __name__ == '__main__':
unittest.main(verbosity=2)
unitt设置同一个开头和结尾
# 引入unittest模块
import unittest
from selenium import webdriver
"""
定义一个继承于
TestCase 类的子类,具体如下
"""
class SearchTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.browser = webdriver.Chrome()
cls.browser.implicitly_wait(30)
cls.browser.maximize_window()
cls.browser.get("http://demo.magentocommerce.com")
def test_search_by_category(self):
# get the search textbox
self.search_field = self.browser.find_element_by_name("q")
self.search_field.clear()
# enter search keyword and submit
self.search_field.send_keys("phones")
self.search_field.submit()
# get all the anchor elements which have product names
# displayed currently on result page using
# find_elements_by_xpath method
products = self.browser.find_elements_by_xpath("//h2[@class='product-name']/a")
self.assertEqual(2, len(products))
def test_search_by_name(self):
# get the search textbox
self.search_field = self.browser.find_element_by_name("q")
self.search_field.clear()
# enter search keyword and submit
self.search_field.send_keys("salt shaker")
self.search_field.submit()
products = self.browser.find_elements_by_xpath("//h2[@class='product-name']/a")
self.assertEqual(1, len(products))
@classmethod
def tearDownClass(cls):
cls.browser.quit()
"""
运行测试
为了通过命令行运行测试,我们可以在测试用例中
添加对main方法的调用。我们将传递verbosity参数以便
使详细的测试总量展示在控制台
"""
if __name__ == '__main__':
unittest.main(verbosity=2)
unitt断言
import unittest
from selenium import webdriver
browers = webdriver.Chrome()
class SearchTest(unittest.TestCase):
def setUp(self):
self.browser = webdriver.Chrome()
self.browser.implicitly_wait(30)
self.browser.maximize_window()
self.browser.get("https:www.baidu.com")
def test_search_by_category(self):
# get the search textbox
self.search_field = self.browser.find_element_by_name("wd")
self.search_field.clear()
# enter search keyword and submit
self.search_field.send_keys("phones")
self.search_field.submit()
"""
断言
unittest的TestCase类提供了很多实用的方法来校验
预期结果和程序返回的实际结果是否一致。这些方法要
求必须满足某些条件才能继续执行接下来的测试。大致
有3种这样的方法,各覆盖一个特定类型的条件,例如
等价校验、逻辑校验和异常校验。如果给定的断言通过
了,接下来的测试代码将会执行;相反,将会导致测试
立即停止并且给出异常信息。
"""
products = self.browser.find_elements_by_xpath("//h2[@class='product-name']/a")
self.assertEqual(2, len(products))