文章目录
前言
初步认识seleniumbase,它解决了我快速开发UI自动化脚本的需求,留出更多的时间进行探索性测试。这个系列是基于落地+产品文档+issue+源码api解读最终形成的可以再次支撑快速落地的总结。
一、为什么学seleniumbase?
想找一款基于pytest封装的UI自动化框架,github搜到这个2.6星,另外自己对slenium比较熟悉,就选了这款框架用来快速落地UI自动化脚本,并最终结合jenkins形成服务化。
二、seleniumbase是什么?
- 简称sbase,是Web 和移动 E2E UI 测试的完整测试自动化框架,推荐理由:github2.5k的pytest+unittest+selenium的成熟框架。
- 在核心,SeleniumBase的工作原理是将pytest扩展为直接插件,SeleniumBase会自动启动Web浏览器进行测试(使用SeleniumWebDriver),然后通过BaseCase类向这些测试提供对SeleniumBase库的访问权限。测试还可以访问SeleniumBase命令行参数和SeleniumBase方法,它们提供了额外的功能。
- 我们主要是用已经封装好的 seleniumbase的方法、命令行参数,简化了代码,非常方便,主要用于迭代开发中的快速回归测试、包括各浏览器兼容性测试
- 中文文档:https://seleniumbase.io/help_docs/chinese/
- github地址:https://github.com/seleniumbase/SeleniumBase
三、框架优点:
- 简化代码
- pytest配置文件
- 已自动添加隐形等待,无须再添加"time.sleep()"
- MasterQA的解决方案,自动化结合手动
- 测试失败时,日志、截图的保存及转移
- 测试报告
四、常用语法格式
1、直接继承BaseCase示例:pytest test_demo_site.py
from seleniumbase import BaseCase
classDemoSiteTests(BaseCase):deftest_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
classBaseTestCase(BaseCase):defsetUp(self):super(BaseTestCase, self).setUp()# <<< 在 super().setUp() 之后运行自定义 setUp() 代码进行测试 >>>deftearDown(self):
self.save_teardown_screenshot()if self.has_exception():# <<< 如果测试失败,则运行自定义代码。 >>>passelse:# <<< 如果测试通过,则运行自定义代码。 >>>pass# (将不可靠的tearDown() 代码包装在try/except 块中。)# <<< 在 super().tearDown() 之前运行自定义的 tearDown() 代码 >>>super(BaseTestCase, self).tearDown()deflogin(self):# <<< 占位符。 在此处添加您的代码。 >>># 通过使用像这样的可重用方法来减少测试中的重复代码。# 如果用户界面发生变化,修复可以在一个地方应用。passdefexample_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 classdeftest_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 classclassTest_SB_Fixture:deftest_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 """classLoginPage:deflogin_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"]')classMyTests:deftest_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
classLoginPage:deflogin_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"]')classMyTests:deftest_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)deftest_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)classTest_Request_Fixture:deftest_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)deftest_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)classTest_Request_Fixture:deftest_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 Testfrom seleniumbase.translate.chinese import 硒测试用例 # noqaclass 我的测试类(硒测试用例):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="李连杰"]')
版权归原作者 阿_焦 所有, 如有侵权,请联系我们删除。