前言

初步认识seleniumbase,它解决了我快速开发UI自动化脚本的需求,留出更多的时间进行探索性测试。这个系列是基于落地+产品文档+issue+源码api解读最终形成的可以再次支撑快速落地的总结。


一、为什么学seleniumbase?

  想找一款基于pytest封装的UI自动化框架,github搜到这个2.6星,另外自己对slenium比较熟悉,就选了这款框架用来快速落地UI自动化脚本,并最终结合jenkins形成服务化。

二、seleniumbase是什么?

  1. 简称sbase,是Web 和移动 E2E UI 测试的完整测试自动化框架,推荐理由:github2.5k的pytest+unittest+selenium的成熟框架。
  2. 在核心,SeleniumBase的工作原理是将pytest扩展为直接插件,SeleniumBase会自动启动Web浏览器进行测试(使用SeleniumWebDriver),然后通过BaseCase类向这些测试提供对SeleniumBase库的访问权限。测试还可以访问SeleniumBase命令行参数和SeleniumBase方法,它们提供了额外的功能。
  3. 我们主要是用已经封装好的 seleniumbase的方法、命令行参数,简化了代码,非常方便,主要用于迭代开发中的快速回归测试、包括各浏览器兼容性测试
  4. 中文文档:https://seleniumbase.io/help_docs/chinese/
  5. github地址:https://github.com/seleniumbase/SeleniumBase

三、框架优点:

  1. 简化代码
  2. pytest配置文件
  3. 已自动添加隐形等待,无须再添加"time.sleep()"
  4. MasterQA的解决方案,自动化结合手动
  5. 测试失败时,日志、截图的保存及转移
  6. 测试报告
    在这里插入图片描述
    在这里插入图片描述

四、常用语法格式

1、直接继承BaseCase示例:pytest test_demo_site.py

from seleniumbase import BaseCase


class DemoSiteTests(BaseCase):
    def test_demo_site(self):
        self.open("https://seleniumbase.io/demo_page")

        # Assert the title of the current web page
        self.assert_title("Web Testing Page")

        # Assert that the element is visible on the page
        self.assert_element("tbody#tbodyId")

        # Assert that the text appears within a given element
        self.assert_text("Demo Page", "h1")

2、子类继承BaseCase:

cd examples/boilerplates
pytest base_test_case.py

from seleniumbase import BaseCase


class BaseTestCase(BaseCase):
    def setUp(self):
        super(BaseTestCase, self).setUp()
        # <<< 在 super().setUp() 之后运行自定义 setUp() 代码进行测试 >>>

    def tearDown(self):
        self.save_teardown_screenshot()
        if self.has_exception():
            # <<< 如果测试失败,则运行自定义代码。 >>>
            pass
        else:
            # <<< 如果测试通过,则运行自定义代码。 >>>
            pass
        # (将不可靠的tearDown() 代码包装在try/except 块中。)
        # <<< 在 super().tearDown() 之前运行自定义的 tearDown() 代码 >>>
        super(BaseTestCase, self).tearDown()

    def login(self):
        # <<< 占位符。 在此处添加您的代码。 >>>
        # 通过使用像这样的可重用方法来减少测试中的重复代码。
        # 如果用户界面发生变化,修复可以在一个地方应用。
        pass

    def example_method(self):
        # <<< 占位符。 在此处添加您的代码。 >>>
        pass

3、不在类中使用 pytest 的夹具 fixture

pytest test_sb_fixture.py

# The pytest fixture (no class)sb:不再需要Python文件中的导入语句来使用SeleniumBase
# "sb" pytest fixture test in a method with no class
def test_sb_fixture_with_no_class(sb):
    sb.open("https://google.com/ncr")
    sb.type('input[title="Search"]', "SeleniumBase GitHub\n")
    sb.click('a[href*="github.com/seleniumbase/SeleniumBase"]')
    sb.click('a[title="seleniumbase"]')


# "sb" pytest fixture test in a method inside a class
class Test_SB_Fixture:
    def test_sb_fixture_inside_class(self, sb):
        sb.open("https://google.com/ncr")
        sb.type('input[title="Search"]', "SeleniumBase GitHub\n")
        sb.click('a[href*="github.com/seleniumbase/SeleniumBase"]')
        sb.click('a[title="examples"]')

4、不带有 pytest 夹具类的用法

examples/boilerplates/samples/swag_labs_test.py
pytest swag_labs_test.py

""" Classic Page Object Model with the "sb" fixture """


class LoginPage:
    def login_to_swag_labs(self, sb, username):
        sb.open("https://www.saucedemo.com")
        sb.type("#user-name", username)
        sb.type("#password", "secret_sauce")
        sb.click('input[type="submit"]')


class MyTests:
    def test_swag_labs_login(self, sb):
        LoginPage().login_to_swag_labs(sb, "standard_user")
        sb.assert_element("#inventory_container")
        sb.assert_element('div:contains("Sauce Labs Backpack")')

5、带有 pytest 夹具类的语法

examples/boilerplates/samples/sb_swag_test.py
pytest sb_swag_test.py

class LoginPage:
    def login_to_swag_labs(self, sb, username):
        sb.open("https://www.saucedemo.com")
        sb.type("#user-name", username)
        sb.type("#password", "secret_sauce")
        sb.click('input[type="submit"]')


class MyTests:
    def test_swag_labs_login(self, sb):
        LoginPage().login_to_swag_labs(sb, "standard_user")
        sb.assert_element("#inventory_container")
        sb.assert_element('div:contains("Sauce Labs Backpack")')

6、使用夹具获取夹具(无类)request夹具获取sb夹具

pytest test_request_sb_fixture.py
pytest夹具可用于从测试中检索其他pytest夹具,例如夹具。这使您可以更好地控制夹具的初始化时间,因为夹具不再需要在测试方法的一开始就加载。这是通过从测试调用来完成的。

# Use the pytest "request" fixture to get the "sb" fixture (no class)
def test_request_sb_fixture(request):
    sb = request.getfixturevalue("sb")
    sb.open("https://seleniumbase.io/demo_page")
    sb.assert_text("SeleniumBase", "#myForm h2")
    sb.assert_element("input#myTextInput")
    sb.type("#myTextarea", "This is me")
    sb.click("#myButton")
    sb.tearDown()


# Use the pytest "request" fixture to get the "sb" fixture (in class)
class Test_Request_Fixture:
    def test_request_sb_fixture_in_class(self, request):
        sb = request.getfixturevalue("sb")
        sb.open("https://seleniumbase.io/demo_page")
        sb.assert_element("input#myTextInput")
        sb.type("#myTextarea", "Automated")
        sb.assert_text("This Text is Green", "#pText")
        sb.click("#myButton")
        sb.assert_text("This Text is Purple", "#pText")
        sb.tearDown()

7、使用夹具获取夹具(有类)request夹具获取sb夹具

pytest test_request_sb_fixture.py
pytest夹具可用于从测试中检索其他pytest夹具,例如夹具。这使您可以更好地控制夹具的初始化时间,因为夹具不再需要在测试方法的一开始就加载。这是通过从测试调用来完成的。

# Use the pytest "request" fixture to get the "sb" fixture (no class)
def test_request_sb_fixture(request):
    sb = request.getfixturevalue("sb")
    sb.open("https://seleniumbase.io/demo_page")
    sb.assert_text("SeleniumBase", "#myForm h2")
    sb.assert_element("input#myTextInput")
    sb.type("#myTextarea", "This is me")
    sb.click("#myButton")
    sb.tearDown()


# Use the pytest "request" fixture to get the "sb" fixture (in class)
class Test_Request_Fixture:
    def test_request_sb_fixture_in_class(self, request):
        sb = request.getfixturevalue("sb")
        sb.open("https://seleniumbase.io/demo_page")
        sb.assert_element("input#myTextInput")
        sb.type("#myTextarea", "Automated")
        sb.assert_text("This Text is Green", "#pText")
        sb.click("#myButton")
        sb.assert_text("This Text is Purple", "#pText")
        sb.tearDown()

8、中文版 seleniumbase

examples/translations/chinese_test_1.py
pytest chinese_test_1.py

# Chinese Language Test
from seleniumbase.translate.chinese import 硒测试用例  # noqa


class 我的测试类(硒测试用例):
    def test_例子1(self):
        self.开启("https://zh.wikipedia.org/wiki/")
        self.断言标题("维基百科,自由的百科全书")
        self.断言元素('a[title="首页"]')
        self.断言文本("新闻动态", "span#新闻动态")
        self.输入文本("#searchInput", "舞龍")
        self.单击("#searchButton")
        self.断言文本("舞龍", "#firstHeading")
        self.断言元素('img[src*="Chinese_draak.jpg"]')
        self.输入文本("#searchInput", "麻婆豆腐")
        self.单击("#searchButton")
        self.断言文本("麻婆豆腐", "#firstHeading")
        self.断言元素('div.thumb div:contains("一家中餐館的麻婆豆腐")')
        self.输入文本("#searchInput", "精武英雄")
        self.单击("#searchButton")
        self.断言元素('img[src*="Fist_of_legend.jpg"]')
        self.断言文本("李连杰", 'li a[title="李连杰"]')
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐