用 Python 和 Selenium WebDriver 自动化测试
Published on 2020 - 12 - 02
工具和软件
- Selenium 和 WebDriver for Chrome
- Chrome
- Python 3
- Python IDE:PyCharm 社区版
- 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 语言》虫师 著