Seldom3.0: 支持App测试

2761 篇文章 16 订阅
2688 篇文章 27 订阅

官方文档:https://seldomqa.github.io/

seldom 版本回顾

2015年7月15号我在github上提交一个项目,取名为:pyse = python + selenium。项目非常简单核心就三个。

  • pyse.py:针对 selenium API做了简单封装。
  • HTMLTestRunner.py: 修改的HTMLTestRunner报告。
  • TestRunner.py: 一个简单的 unittest运行器。

之后项目断断续续的在维护,直到2019年,也许是太闲了,加上对UI自动化有了更深入的理解,重新投入主要精力维护pyse项目。

后来就需要将提交到pypi,这样更方便通过pip安装,发现 pyse 已经被占用了,后来更名为seldom,其实命名没有太多寓意,就是看他长得和selenium比较接近。

2020年1月发布1.0版本,之所以发布1.0 是因为自认为框架的功能比较成熟了,并且花费时间补充了文档。大家都不重视文档,其实文档非常重要,也需要花大量的时间编写和维护。有时间你加个功能很简单,编写说明文档和使用示例就要花费等同的时间。

1.0 版本之后,项目核心围绕着 selenium API的封装 和 unittest框架扩展(seldom基于unittest)等。

2021年4月正式发布 2.0,集成requests, 正式支持http接口测试。起因是发现cypress支持http调用,哦,原来UI测试工具也可以去做接口,格局一下子打开了!如何在不影响现有selenium API的情况下集成requests是2.0考虑的重点。

2022年1月seldom项目正式在公司内部推广使用,当时我们做了几版的接口测试平台,平台的开发维护成本比较高,对于复杂的场景用例,编写成本不比框架简单;测试人员也苦平台久已(小白当然喜欢平台,懂点儿编程得测试,都不太愿意被平台束缚)。

因为在公司得到推广使用,seldom 明显进入了更加快速的迭代开发阶段。

seldom 3.0 背景

seldom集成App测试是顺理成章的事情,早在几个月前我已经在公司项目中尝试 seldom + appium 进行App自动化测试。App自动化的维护成本确实比接口要高许多,这是由App本身的特点决定的,框架很难做到实质上的改变。

2020年10月seldom 3.0 beta发布,之所以选择appium有几个原因:

appium 是由商业工具在维护,历史比较长,不会随意停止维护。
appium 应用更加广泛,使用得人更多,支持得平台多(android/ios/flutter)
appium 继承selenium,对于seldom来说对原有API改动最小。
注:目前刚刚发布 seldom beta2 版本。

seldom App测试示例

如果你熟悉appium 自动化测试环境,那么使用seldom 几乎不需要学习成本,他只是对Appium-Python-Client 的API做了简单的封装。

简单示例:

# test_app.py
import seldom

class TestBBS(seldom.TestCase):

    def test_bbs_search(self):
        """BBS搜索测试 """
        self.click(id_="com.meizu.flyme.flymebbs:id/nw")
        self.type(id_="com.meizu.flyme.flymebbs:id/nw", text="flyme")
        self.click(id_="com.meizu.flyme.flymebbs:id/o1")
        self.sleep(2)
        elems = self.get_elements(id_="com.meizu.flyme.flymebbs:id/a29")
        for title in elems:
            self.assertIn("lyme", title.text)


if __name__ == '__main__':
    desired_caps = {
        'deviceName': 'JEF_AN20',
        'automationName': 'UiAutomator2',
        'platformName': 'Android',
        'platformVersion': '10.0',
        'appPackage': 'com.meizu.flyme.flymebbs',
        'appActivity': '.ui.LoadingActivity',
        'noReset': True,
    }
    seldom.main(app_info=desired_caps, app_server="http://127.0.0.1:4723")

运行日志:

> python .\test_app.py

              __    __
   ________  / /___/ /___  ____ ____
  / ___/ _ \/ / __  / __ \/ __ ` ___/
 (__  )  __/ / /_/ / /_/ / / / / / /
/____/\___/_/\__,_/\____/_/ /_/ /_/  v3.0.0beta1
-----------------------------------------
                             @itest.info


XTestRunner Running tests...

----------------------------------------------------------------------
2022-10-03 00:01:30 webdriver.py | INFO | 💤️ sleep: 5s.
2022-10-03 00:01:35 webdriver.py | INFO | ✅ Find 1 element: id=com.meizu.flyme.flymebbs:id/nw  -> click.
2022-10-03 00:01:36 webdriver.py | INFO | ✅ Find 1 element: id=com.meizu.flyme.flymebbs:id/nw  -> input 'flyme'.
2022-10-03 00:01:37 webdriver.py | INFO | ✅ Find 1 element: id=com.meizu.flyme.flymebbs:id/o1  -> click.
2022-10-03 00:01:37 webdriver.py | INFO | 💤️ sleep: 2s.
2022-10-03 00:01:39 webdriver.py | INFO | ✅ Find 5 element: id=com.meizu.flyme.flymebbs:id/a29 .
flyme的屏幕色彩显示应该是比较差的

魅族17的Flyme9状态栏下拉问题。

flyme9.3连上耳机来电话还是会外放

flyme自带录屏功能吗?

关于Flyme 8.18.0A稳定版


Generating HTML reports...
.12022-10-03 00:01:40 runner.py | SUCCESS | generated html file: file:///D:\github\seldom\reports\2022_10_03_00_01_23_result.html
2022-10-03 00:01:40 runner.py | SUCCESS | generated log file: file:///D:\github\seldom\reports\seldom_log.log

AppiumLab 类

Lab即实验室的意思,在AppiumLab 类中对 appium 的一些API做了二次封装。

Action

Action中提供基本滑动/触摸操作。

from seldom.appium_lab import AppiumLab

appium_lab = AppiumLab(self.driver)
# 触摸坐标位
appium_lab.tap(x=100, y=200)
# 上划
appium_lab.swipe_up()
# 下划
appium_lab.swipe_down()

Switch

Switch中提供基本上下文切换操作。

from seldom.appium_lab import AppiumLab

appium_lab = AppiumLab(self.driver)

# 切换原生app
appium_lab.switch_to_app()
# 切换webview
appium_lab.switch_to_web()
# 切换flutter
appium_lab.switch_to_flutter()

Find

Find中提供基于文本的查找,一个元素可以没有ID、name,但一定有显示的文本,这里提供了一组基于文本的查找。

from seldom.appium_lab import AppiumLab

appium_lab = AppiumLab(self.driver)

# Android
appium_lab.find_view(text="xxx标题").click()
appium_lab.find_view(content_desc="xxx标题").click()
appium_lab.find_edit_text(text="xxx标题").click()
appium_lab.find_button(text="xxx标题").click()
appium_lab.find_button(content_desc="xxx标题").click()
appium_lab.find_text_view(text="xxx标题").click()
appium_lab.find_image_view(text="xxx标题").click()
appium_lab.find_check_box(text="xxx标题").click()

# iOS
appium_lab.find_static_text(text="xxx标题").click()
appium_lab.find_other(text="xxx标题").click()
appium_lab.find_text_field(text="xxx标题").click()
appium_lab.find_image(text="xxx标题").click()
appium_lab.find_ios_button(text="xxx标题").click()

keyboard

keyboard中提供基于键盘的输入和操作。

from seldom.appium_lab import AppiumLab

appium_lab = AppiumLab(self.driver)

# 基于键盘输入(支持大小写)
appium_lab.key_text("Hello123")
# 手机home键
appium_lab.home()
# 手机返回键
appium_lab.back()
# 判断当前虚拟键盘是否显示(True/False)
ret = appium_lab.is_keyboard_shown()
print(ret)
# 收起虚拟键盘
appium_lab.hide_keyboard()

Page Object设计模式

在编写App自动化测试时,推荐使用page object models(简称 PO设计模式)。你可以看到seldom并没有完全封装appium的API,我们可以借助 poium 来实现基于元素的定位。

github: https://github.com/SeldomQA/poium

安装poium

> pip install poium

使用poium

在seldom中基于poium实现元素的定位和操作。

import seldom
from poium import Page, Element, Elements


class BBSPage(Page):
    search_input = Element(id_="com.meizu.flyme.flymebbs:id/nw")
    search_button = Element(id_="com.meizu.flyme.flymebbs:id/o1")
    search_result = Elements(id_="com.meizu.flyme.flymebbs:id/a29")


class TestBBS(seldom.TestCase):

    def start(self):
        self.bbs_page = BBSPage(self.driver)

    def test_bbs(self):
        # 定义运行环境
        self.sleep(5)
        self.bbs_page.search_input.click()
        self.bbs_page.search_input.send_keys("flyme")
        self.bbs_page.search_button.click()
        elems = self.bbs_page.search_result
        for title in elems:
            print(title.text)
            self.assertIn("flyme", title.text.lower())

定位方法

poium 支持的定位方法。

# selenium
css = "xx"
id_ = "xx"
name = "xx"
xpath = "xx"
link_text = "xx"
partial_link_text = "xx"
tag = "xx"
class_name = "xx"

# appium
ios_uiautomation = "xx"
ios_predicate = "xx"
ios_class_chain = "xx"
android_uiautomator = "xx"
android_viewtag = "xx"
android_data_matcher = "xx"
android_view_matcher = "xx"
windows_uiautomation = "xx"
accessibility_id = "xx"
image = "xx"
custom = "xx"

Element类参数

timeout: 设置超时检查次数,默认为5。

index: 设置元素索引,当你的定位方式默认匹配到多个元素时,默认返回第1个,即为0.

describe: 设置元素描述,默认为undefined, 建议为每个元素增加描述。


资源分享

下方这份完整的软件测试视频学习教程已经上传CSDN官方认证的二维码,朋友们如果需要可以自行免费领取 【保证100%免费】

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值