用 Python 和 Selenium WebDriver 自动化测试

Published on 2020 - 12 - 02

工具和软件

  1. Selenium 和 WebDriver for Chrome
  2. Chrome
  3. Python 3
  4. Python IDE:PyCharm 社区版
  5. poium

Selenium 是目前 Web UI 测试的主流工具,开源,支持多种编程语言通过Selenium控制浏览器,安装不同的浏览器驱动(WebDriver)后,支持 FireFox、Chrome、Safari、Opera和微软Edge浏览器,主流的浏览器都支持,而且还支持Chrome 的 headless模式。

以下代码是一个简单的单元测试,测试过程就是打开浏览器,网址百度,搜索不同的关键词,验证断言。

import unittest
from time import sleep
from selenium import webdriver


class TestBaidu(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        cls.driver = webdriver.Chrome()
        cls.base_url = "https://www.baidu.com"

    def baidu_search(self, search_key):
        self.driver.get(self.base_url)
        self.driver.find_element_by_id("kw").send_keys(search_key)
        self.driver.find_element_by_id("su").click()
        sleep(2)

    def test_search_key_selenium(self):
        search_key = "selenium"
        self.baidu_search(search_key)
        self.assertEqual(self.driver.title, search_key + "_百度搜索")

    def test_search_key_unttest(self):
        search_key = "unittest"
        self.baidu_search(search_key)
        self.assertEqual(self.driver.title, search_key + "_百度搜索")

    @classmethod
    def tearDownClass(cls):
        cls.driver.quit()


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

两个测试的用例是相同的,可以重复使用,优化过的代码如下

import unittest
from time import sleep
from selenium import webdriver


class Browser:
    driver = None
    base_url = None


def setUpModule():
    Browser.driver = webdriver.Chrome()
    Browser.base_url = "https://www.baidu.com"


def tearDownModule():
    Browser.driver.quit()


def baidu_search(search_key):
    Browser.driver.get(Browser.base_url)
    Browser.driver.find_element_by_id("kw").send_keys(search_key)
    Browser.driver.find_element_by_id("su").click()
    sleep(2)


class TestBaidu(unittest.TestCase):

    def test_search_key_selenium(self):
        search_key = "selenium"
        baidu_search(search_key)
        self.assertEqual(Browser.driver.title, search_key + "_百度搜索")

    def test_search_key_unttest(self):
        search_key = "unittest"
        baidu_search(search_key)
        self.assertEqual(Browser.driver.title, search_key + "_百度搜索")


class TestBaidu2(unittest.TestCase):

    def test_search_key_python(self):
        search_key = "python"
        baidu_search(search_key)
        self.assertEqual(Browser.driver.title, search_key + "_百度搜索")


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

Page Object

是一种设计模式,将自动化测试中的内容和页面形式分离开。

poium 测试库

poium 是基于 Selenium 的 Page Object 测试库,简化了 Page 层元素的定义。
网址:https://github.com/SeldomQA/poium

from poium import Page, PageElement

class BaiduPage(Page):
    search_input = PageElement(id_="kw")
    search_button = PageElement(id_="su")

poium 使用方法

from poium import Page, PageElement, PageElements


class SomePage(Page):
    elem_id = PageElement(id_='id')
    elem_name = PageElement(name='name')
    elem_class = PageElement(class_='class')
    elem_tag = PageElement(tag='input')
    elem_link_text = PageElement(link_text='this_is_link')
    elem_partial_link_text = PageElement(partial_link_text='is_link')
    elem_xpath = PageElement(xpath='//*[@id="kk"]')
    elem_css = PageElement(css='#id')


class BaiduPage(Page):
    search_input = PageElement(id_='kw', timeout=5)
    search_button = PageElement(id_='su', timeout=30)


class LoginPage(Page):
    """
    登录page类
    """
    username = PageElement(css='#loginAccount', describe="用户名")
    password = PageElement(css='#loginPwd', describe="密码")
    login_button = PageElement(css='#login_btn', describe="登录按钮")
    user_info = PageElement(css="a.nav_user_name > span", describe="用户信息")


class ResultPage(Page):
    # 定位一组元素
    search_result = PageElements(xpath="//div/h3/a")

pytest 单元测试框架

pytest 是一个第三方单元测试框架,更加简单、灵活。

参考文档

  • 《Selenium 3 自动化测试实战 基于 Python 语言》虫师 著