Selenium自动化测试基于Python


简介

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))


        
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值