seleniumbase学习总结1 - 简介、原理、常见语法场景
1、为什么给这个UI框架投入精力?想找一款基于pytest封装的UI自动化框架,github搜到这个2.6星,另外自己对slenium比较熟悉,就选了这款框架用来快速落地UI自动化脚本,并最终结合jenkins形成服务化。2、ing...
文章目录
前言
初步认识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
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="李连杰"]')
更多推荐
所有评论(0)