seldom


Nameseldom JSON
Version 3.7.0 PyPI version JSON
download
home_pagehttps://seldomqa.github.io
SummarySeldom automation testing framework based on unittest.
upload_time2024-05-05 16:40:23
maintainerNone
docs_urlNone
authorbugmaster
requires_python<4.0,>=3.8
licenseApache-2.0
keywords sedom selenium appium requests
VCS
bugtrack_url
requirements Appium-Python-Client XTestRunner loguru openpyxl pyyaml requests jsonschema jmespath pymysql genson click python-dateutil websocket-client
Travis-CI No Travis.
coveralls test coverage No coveralls.
            [GitHub](https://github.com/SeldomQA/seldom) | [Gitee](https://gitee.com/fnngj/seldom) |

![](seldom_logo.jpg)

[![PyPI version](https://badge.fury.io/py/seldom.svg)](https://badge.fury.io/py/seldom) ![PyPI - Python Version](https://img.shields.io/pypi/pyversions/seldom)

Seldom is an automation testing framework based on unittest.

> seldom 是基于unittest 的自动化测试框架。

### Features

- [x] web/app/api全功能测试框架
- [x] 提供脚手架快速创建自动化项目
- [x] 集成`XTestRunner`测试报告,现代美观
- [x] 提供丰富的断言
- [x] 提供强大的`数据驱动`
- [x] 平台化支持

### Install

```shell
pip install seldom==3.6.0
```

If you want to keep up with the latest version, you can install with github repository url:

```shell
> pip install -U git+https://github.com/SeldomQA/seldom.git@master
```

### 🤖 Quick Start

1、查看帮助:

```shell
seldom --help
Usage: seldom [OPTIONS]

  seldom CLI.

Options:
  --version                       Show version.
  -P, --project TEXT              Create an Seldom automation test project.
  -cc, --clear-cache BOOLEAN      Clear all caches of seldom.
  -p, --path TEXT                 Run test case file path.
  -c, --collect / -nc, --no-collect
                                  Collect project test cases. Need the
                                  `--path`.
  -l, --level [data|method]       Parse the level of use cases. Need the
                                  --path.
  -j, --case-json TEXT            Test case files. Need the `--path`.
  -e, --env TEXT                  Set the Seldom run environment `Seldom.env`.
  -b, --browser [chrome|firefox|ie|edge|safari]
                                  The browser that runs the Web UI automation
                                  tests. Need the `--path`.
  -u, --base-url TEXT             The base-url that runs the HTTP automation
                                  tests. Need the `--path`.
  -d, --debug / -nd, --no-debug   Debug mode. Need the `--path`.
  -rr, --rerun INTEGER            The number of times a use case failed to run
                                  again. Need the `--path`.
  -r, --report TEXT               Set the test report for output. Need the
                                  `--path`.
  -m, --mod TEXT                  Run tests modules, classes or even
                                  individual test methods from the command
                                  line.
  -ll, --log-level [TRACE|DEBUG|INFO|SUCCESS|WARNING|ERROR]
                                  Set the log level.
  -h2c, --har2case TEXT           HAR file converts an seldom test case.
  -s2c, --swagger2case TEXT       Swagger file converts an seldom test case.
  --help                          Show this message and exit.
```

2、创建项目:

```shell
> seldom -P mypro
```

目录结构如下:

```shell
mypro/
├── test_dir/
│   ├── __init__.py
│   ├── test_web_sample.py
│   └── test_api_sample.py
├── test_data/
│   └── data.json
├── reports/
└── confrun.py
```

* `test_dir/` 测试用例目录。
* `test_data/` 测试数据文件目录。
* `reports/` 测试报告目录。
* `confrun.py` 运行配置文件。

3、运行项目:

* ❌️ 在`pyCharm`中右键执行。

* ✔️ 通过命令行工具执行。

```shell
> seldom -p test_dir # 运行 test_dir 测试目录


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

2022-04-30 18:37:29 log.py | INFO | -------------- Request -----------------[🚀]
2022-04-30 18:37:29 log.py | INFO | [method]: DELETE      [url]: http://httpbin.org/delete

2022-04-30 18:37:30 log.py | INFO | -------------- Response ----------------[🛬️]
2022-04-30 18:37:30 log.py | INFO | successful with status 200

2022-04-30 18:37:30 log.py | DEBUG | [type]: json      [time]: 0.725183

2022-04-30 18:37:30 log.py | DEBUG | [response]:
 {'args': {}, 'data': '', 'files': {}, 'form': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Content-Length': '0', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.25.0', 'X-Amzn-Trace-Id': 'Root=1-626d1168-457309ad306428ca5bcbb961'}, 'json': None, 'origin': '173.248.248.88', 'url': 'http://httpbin.org/delete'}

...

2022-04-30 18:37:36 log.py | INFO | ✅ Find 1 element: id=sb_form_q  -> input 'seldom'.
2022-04-30 18:37:39 log.py | INFO | 👀 assertIn title: seldom - 搜索.
.52022-04-30 18:37:39 log.py | INFO | 📖 https://cn.bing.com
2022-04-30 18:37:41 log.py | INFO | ✅ Find 1 element: id=sb_form_q  -> input 'poium'.
2022-04-30 18:37:42 log.py | INFO | 👀 assertIn title: poium - 搜索.
.62022-04-30 18:37:42 log.py | INFO | 📖 https://cn.bing.com
2022-04-30 18:37:43 log.py | INFO | ✅ Find 1 element: id=sb_form_q  -> input 'XTestRunner'.
2022-04-30 18:37:44 log.py | INFO | 👀 assertIn title: XTestRunner - 搜索.
.72022-04-30 18:37:44 log.py | INFO | 📖 http://www.itest.info
2022-04-30 18:37:52 log.py | INFO | 👀 assertIn url: http://www.itest.info/.
.82022-04-30 18:37:52 log.py | SUCCESS | generated html file: file:///D:\mypro\reports\2022_04_30_18_37_29_result.html
2022-04-30 18:37:52 log.py | SUCCESS | generated log file: file:///D:\mypro\reports\seldom_log.log
```

4、查看报告

你可以到 `mypro\reports\` 目录查看测试报告。

![test report](./test_report.png)

## 🔬 Demo

> seldom继承unittest单元测试框架,完全遵循unittest编写用例规范。

[demo](/demo) 提供了丰富实例,帮你快速了解seldom的用法。

### Web UI 测试

```python
import seldom
from seldom import Steps


class BaiduTest(seldom.TestCase):

    def test_case_one(self):
        """a simple test case """
        self.open("https://www.baidu.com")
        self.type(id_="kw", text="seldom")
        self.click(css="#su")
        self.assertTitle("seldom_百度搜索")

    def test_case_two(self):
        """method chaining """
        Steps(url="https://www.baidu.com").open().find("#kw").type("seldom").find("#su").click()
        self.assertTitle("seldom_百度搜索")


if __name__ == '__main__':
    seldom.main(browser="chrome")
```

__说明:__

* `seldom.main()` 通过 `browser` 指定运行的浏览器。

### HTTP 测试

seldom 2.0 支持HTTP测试

```python
import seldom


class TestRequest(seldom.TestCase):

    def test_put_method(self):
        self.put('/put', data={'key': 'value'})
        self.assertStatusCode(200)

    def test_post_method(self):
        self.post('/post', data={'key': 'value'})
        self.assertStatusCode(200)

    def test_get_method(self):
        payload = {'key1': 'value1', 'key2': 'value2'}
        self.get("/get", params=payload)
        self.assertStatusCode(200)

    def test_delete_method(self):
        self.delete('/delete')
        self.assertStatusCode(200)


if __name__ == '__main__':
    seldom.main(base_url="http://httpbin.org")
```

__说明:__

* `seldom.main()` 通过 `base_url` 指定接口项目基本URL地址。

### App 测试

seldom 3.0 支持App测试

```python
from appium.options.android import UiAutomator2Options

import seldom
from seldom.appium_lab.keyboard import KeyEvent


class TestBingApp(seldom.TestCase):
    """
    Test Bing APP
    """

    def start(self):
        self.ke = KeyEvent(self.driver)

    def test_bing_search(self):
        """
        test bing bbs search
        """
        self.sleep(2)
        self.click(id_="com.microsoft.bing:id/sa_hp_header_search_box")
        self.type(id_="com.microsoft.bing:id/sapphire_search_header_input", text="seldom")
        self.ke.press_key("ENTER")
        self.sleep(1)
        elem = self.get_element(xpath='//android.widget.TextView[@resource-id="count"]')
        self.assertIn("个结果", elem.text.lower())


if __name__ == '__main__':
    capabilities = {
        'deviceName': 'ELS-AN00',
        'automationName': 'UiAutomator2',
        'platformName': 'Android',
        'appPackage': 'com.microsoft.bing',
        'appActivity': 'com.microsoft.sapphire.app.main.MainSapphireActivity',
        'noReset': True,
    }
    options = UiAutomator2Options().load_capabilities(capabilities)
    seldom.main(app_server="http://127.0.0.1:4723", app_info=options, debug=True)
```

__说明:__

* `seldom.main()` 通过 `app_info` 指定App信息; `app_server` 指定appium server 地址。

### Run the test

```python
import seldom

seldom.main()  # 默认运行当前测试文件
seldom.main(path="./")  # 当前目录下的所有测试文件
seldom.main(path="./test_dir/")  # 指定目录下的所有测试文件
seldom.main(path="./test_dir/test_sample.py")  # 指定目录下的测试文件
```

## 📖 Document

[中文文档](https://seldomqa.github.io/)

### 项目实例

基于seldom的web UI自动化项目:

https://github.com/SeldomQA/seldom-web-testing

基于seldom的接口自动化项目:

https://github.com/defnngj/seldom-api-testing

## 微信(WeChat)

> 欢迎添加微信,交流和反馈问题。

<div style="display: flex;justify-content: space-between;width: 100%">
    <p><img alt="微信" src="wechat.jpg" style="width: 200px;height: 100%" ></p>
</div>

### Star History

![Star History Chart](https://api.star-history.com/svg?repos=SeldomQA/seldom&type=Date)

### 感谢

感谢从以下项目中得到思路和帮助。

* [parameterized](https://github.com/wolever/parameterized)

* [utx](https://github.com/jianbing/utx)

### 交流

QQ群:948994709


            

Raw data

            {
    "_id": null,
    "home_page": "https://seldomqa.github.io",
    "name": "seldom",
    "maintainer": null,
    "docs_url": null,
    "requires_python": "<4.0,>=3.8",
    "maintainer_email": null,
    "keywords": "sedom, selenium, appium, requests",
    "author": "bugmaster",
    "author_email": "fnngj@126.com",
    "download_url": "https://files.pythonhosted.org/packages/18/be/b5ed5a157eee133cf4667c9e8249f0209051401f91c7462b80f71c2e94bc/seldom-3.7.0.tar.gz",
    "platform": null,
    "description": "[GitHub](https://github.com/SeldomQA/seldom) | [Gitee](https://gitee.com/fnngj/seldom) |\n\n![](seldom_logo.jpg)\n\n[![PyPI version](https://badge.fury.io/py/seldom.svg)](https://badge.fury.io/py/seldom) ![PyPI - Python Version](https://img.shields.io/pypi/pyversions/seldom)\n\nSeldom is an automation testing framework based on unittest.\n\n> seldom \u662f\u57fa\u4e8eunittest \u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u3002\n\n### Features\n\n- [x] web/app/api\u5168\u529f\u80fd\u6d4b\u8bd5\u6846\u67b6\n- [x] \u63d0\u4f9b\u811a\u624b\u67b6\u5feb\u901f\u521b\u5efa\u81ea\u52a8\u5316\u9879\u76ee\n- [x] \u96c6\u6210`XTestRunner`\u6d4b\u8bd5\u62a5\u544a\uff0c\u73b0\u4ee3\u7f8e\u89c2\n- [x] \u63d0\u4f9b\u4e30\u5bcc\u7684\u65ad\u8a00\n- [x] \u63d0\u4f9b\u5f3a\u5927\u7684`\u6570\u636e\u9a71\u52a8`\n- [x] \u5e73\u53f0\u5316\u652f\u6301\n\n### Install\n\n```shell\npip install seldom==3.6.0\n```\n\nIf you want to keep up with the latest version, you can install with github repository url:\n\n```shell\n> pip install -U git+https://github.com/SeldomQA/seldom.git@master\n```\n\n### \ud83e\udd16 Quick Start\n\n1\u3001\u67e5\u770b\u5e2e\u52a9\uff1a\n\n```shell\nseldom --help\nUsage: seldom [OPTIONS]\n\n  seldom CLI.\n\nOptions:\n  --version                       Show version.\n  -P, --project TEXT              Create an Seldom automation test project.\n  -cc, --clear-cache BOOLEAN      Clear all caches of seldom.\n  -p, --path TEXT                 Run test case file path.\n  -c, --collect / -nc, --no-collect\n                                  Collect project test cases. Need the\n                                  `--path`.\n  -l, --level [data|method]       Parse the level of use cases. Need the\n                                  --path.\n  -j, --case-json TEXT            Test case files. Need the `--path`.\n  -e, --env TEXT                  Set the Seldom run environment `Seldom.env`.\n  -b, --browser [chrome|firefox|ie|edge|safari]\n                                  The browser that runs the Web UI automation\n                                  tests. Need the `--path`.\n  -u, --base-url TEXT             The base-url that runs the HTTP automation\n                                  tests. Need the `--path`.\n  -d, --debug / -nd, --no-debug   Debug mode. Need the `--path`.\n  -rr, --rerun INTEGER            The number of times a use case failed to run\n                                  again. Need the `--path`.\n  -r, --report TEXT               Set the test report for output. Need the\n                                  `--path`.\n  -m, --mod TEXT                  Run tests modules, classes or even\n                                  individual test methods from the command\n                                  line.\n  -ll, --log-level [TRACE|DEBUG|INFO|SUCCESS|WARNING|ERROR]\n                                  Set the log level.\n  -h2c, --har2case TEXT           HAR file converts an seldom test case.\n  -s2c, --swagger2case TEXT       Swagger file converts an seldom test case.\n  --help                          Show this message and exit.\n```\n\n2\u3001\u521b\u5efa\u9879\u76ee\uff1a\n\n```shell\n> seldom -P mypro\n```\n\n\u76ee\u5f55\u7ed3\u6784\u5982\u4e0b\uff1a\n\n```shell\nmypro/\n\u251c\u2500\u2500 test_dir/\n\u2502   \u251c\u2500\u2500 __init__.py\n\u2502   \u251c\u2500\u2500 test_web_sample.py\n\u2502   \u2514\u2500\u2500 test_api_sample.py\n\u251c\u2500\u2500 test_data/\n\u2502   \u2514\u2500\u2500 data.json\n\u251c\u2500\u2500 reports/\n\u2514\u2500\u2500 confrun.py\n```\n\n* `test_dir/` \u6d4b\u8bd5\u7528\u4f8b\u76ee\u5f55\u3002\n* `test_data/` \u6d4b\u8bd5\u6570\u636e\u6587\u4ef6\u76ee\u5f55\u3002\n* `reports/` \u6d4b\u8bd5\u62a5\u544a\u76ee\u5f55\u3002\n* `confrun.py` \u8fd0\u884c\u914d\u7f6e\u6587\u4ef6\u3002\n\n3\u3001\u8fd0\u884c\u9879\u76ee\uff1a\n\n* \u274c\ufe0f \u5728`pyCharm`\u4e2d\u53f3\u952e\u6267\u884c\u3002\n\n* \u2714\ufe0f \u901a\u8fc7\u547d\u4ee4\u884c\u5de5\u5177\u6267\u884c\u3002\n\n```shell\n> seldom -p test_dir # \u8fd0\u884c test_dir \u6d4b\u8bd5\u76ee\u5f55\n\n\n              __    __\n   ________  / /___/ /___  ____ ____\n  / ___/ _ \\/ / __  / __ \\/ __ ` ___/\n (__  )  __/ / /_/ / /_/ / / / / / /\n/____/\\___/_/\\__,_/\\____/_/ /_/ /_/  v3.x.x\n-----------------------------------------\n                             @itest.info\n...\n\n2022-04-30 18:37:29 log.py | INFO | -------------- Request -----------------[\ud83d\ude80]\n2022-04-30 18:37:29 log.py | INFO | [method]: DELETE      [url]: http://httpbin.org/delete\n\n2022-04-30 18:37:30 log.py | INFO | -------------- Response ----------------[\ud83d\udeec\ufe0f]\n2022-04-30 18:37:30 log.py | INFO | successful with status 200\n\n2022-04-30 18:37:30 log.py | DEBUG | [type]: json      [time]: 0.725183\n\n2022-04-30 18:37:30 log.py | DEBUG | [response]:\n {'args': {}, 'data': '', 'files': {}, 'form': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Content-Length': '0', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.25.0', 'X-Amzn-Trace-Id': 'Root=1-626d1168-457309ad306428ca5bcbb961'}, 'json': None, 'origin': '173.248.248.88', 'url': 'http://httpbin.org/delete'}\n\n...\n\n2022-04-30 18:37:36 log.py | INFO | \u2705 Find 1 element: id=sb_form_q  -> input 'seldom'.\n2022-04-30 18:37:39 log.py | INFO | \ud83d\udc40 assertIn title: seldom - \u641c\u7d22.\n.52022-04-30 18:37:39 log.py | INFO | \ud83d\udcd6 https://cn.bing.com\n2022-04-30 18:37:41 log.py | INFO | \u2705 Find 1 element: id=sb_form_q  -> input 'poium'.\n2022-04-30 18:37:42 log.py | INFO | \ud83d\udc40 assertIn title: poium - \u641c\u7d22.\n.62022-04-30 18:37:42 log.py | INFO | \ud83d\udcd6 https://cn.bing.com\n2022-04-30 18:37:43 log.py | INFO | \u2705 Find 1 element: id=sb_form_q  -> input 'XTestRunner'.\n2022-04-30 18:37:44 log.py | INFO | \ud83d\udc40 assertIn title: XTestRunner - \u641c\u7d22.\n.72022-04-30 18:37:44 log.py | INFO | \ud83d\udcd6 http://www.itest.info\n2022-04-30 18:37:52 log.py | INFO | \ud83d\udc40 assertIn url: http://www.itest.info/.\n.82022-04-30 18:37:52 log.py | SUCCESS | generated html file: file:///D:\\mypro\\reports\\2022_04_30_18_37_29_result.html\n2022-04-30 18:37:52 log.py | SUCCESS | generated log file: file:///D:\\mypro\\reports\\seldom_log.log\n```\n\n4\u3001\u67e5\u770b\u62a5\u544a\n\n\u4f60\u53ef\u4ee5\u5230 `mypro\\reports\\` \u76ee\u5f55\u67e5\u770b\u6d4b\u8bd5\u62a5\u544a\u3002\n\n![test report](./test_report.png)\n\n## \ud83d\udd2c Demo\n\n> seldom\u7ee7\u627funittest\u5355\u5143\u6d4b\u8bd5\u6846\u67b6\uff0c\u5b8c\u5168\u9075\u5faaunittest\u7f16\u5199\u7528\u4f8b\u89c4\u8303\u3002\n\n[demo](/demo) \u63d0\u4f9b\u4e86\u4e30\u5bcc\u5b9e\u4f8b\uff0c\u5e2e\u4f60\u5feb\u901f\u4e86\u89e3seldom\u7684\u7528\u6cd5\u3002\n\n### Web UI \u6d4b\u8bd5\n\n```python\nimport seldom\nfrom seldom import Steps\n\n\nclass BaiduTest(seldom.TestCase):\n\n    def test_case_one(self):\n        \"\"\"a simple test case \"\"\"\n        self.open(\"https://www.baidu.com\")\n        self.type(id_=\"kw\", text=\"seldom\")\n        self.click(css=\"#su\")\n        self.assertTitle(\"seldom_\u767e\u5ea6\u641c\u7d22\")\n\n    def test_case_two(self):\n        \"\"\"method chaining \"\"\"\n        Steps(url=\"https://www.baidu.com\").open().find(\"#kw\").type(\"seldom\").find(\"#su\").click()\n        self.assertTitle(\"seldom_\u767e\u5ea6\u641c\u7d22\")\n\n\nif __name__ == '__main__':\n    seldom.main(browser=\"chrome\")\n```\n\n__\u8bf4\u660e\uff1a__\n\n* `seldom.main()` \u901a\u8fc7 `browser` \u6307\u5b9a\u8fd0\u884c\u7684\u6d4f\u89c8\u5668\u3002\n\n### HTTP \u6d4b\u8bd5\n\nseldom 2.0 \u652f\u6301HTTP\u6d4b\u8bd5\n\n```python\nimport seldom\n\n\nclass TestRequest(seldom.TestCase):\n\n    def test_put_method(self):\n        self.put('/put', data={'key': 'value'})\n        self.assertStatusCode(200)\n\n    def test_post_method(self):\n        self.post('/post', data={'key': 'value'})\n        self.assertStatusCode(200)\n\n    def test_get_method(self):\n        payload = {'key1': 'value1', 'key2': 'value2'}\n        self.get(\"/get\", params=payload)\n        self.assertStatusCode(200)\n\n    def test_delete_method(self):\n        self.delete('/delete')\n        self.assertStatusCode(200)\n\n\nif __name__ == '__main__':\n    seldom.main(base_url=\"http://httpbin.org\")\n```\n\n__\u8bf4\u660e\uff1a__\n\n* `seldom.main()` \u901a\u8fc7 `base_url` \u6307\u5b9a\u63a5\u53e3\u9879\u76ee\u57fa\u672cURL\u5730\u5740\u3002\n\n### App \u6d4b\u8bd5\n\nseldom 3.0 \u652f\u6301App\u6d4b\u8bd5\n\n```python\nfrom appium.options.android import UiAutomator2Options\n\nimport seldom\nfrom seldom.appium_lab.keyboard import KeyEvent\n\n\nclass TestBingApp(seldom.TestCase):\n    \"\"\"\n    Test Bing APP\n    \"\"\"\n\n    def start(self):\n        self.ke = KeyEvent(self.driver)\n\n    def test_bing_search(self):\n        \"\"\"\n        test bing bbs search\n        \"\"\"\n        self.sleep(2)\n        self.click(id_=\"com.microsoft.bing:id/sa_hp_header_search_box\")\n        self.type(id_=\"com.microsoft.bing:id/sapphire_search_header_input\", text=\"seldom\")\n        self.ke.press_key(\"ENTER\")\n        self.sleep(1)\n        elem = self.get_element(xpath='//android.widget.TextView[@resource-id=\"count\"]')\n        self.assertIn(\"\u4e2a\u7ed3\u679c\", elem.text.lower())\n\n\nif __name__ == '__main__':\n    capabilities = {\n        'deviceName': 'ELS-AN00',\n        'automationName': 'UiAutomator2',\n        'platformName': 'Android',\n        'appPackage': 'com.microsoft.bing',\n        'appActivity': 'com.microsoft.sapphire.app.main.MainSapphireActivity',\n        'noReset': True,\n    }\n    options = UiAutomator2Options().load_capabilities(capabilities)\n    seldom.main(app_server=\"http://127.0.0.1:4723\", app_info=options, debug=True)\n```\n\n__\u8bf4\u660e\uff1a__\n\n* `seldom.main()` \u901a\u8fc7 `app_info` \u6307\u5b9aApp\u4fe1\u606f\uff1b `app_server` \u6307\u5b9aappium server \u5730\u5740\u3002\n\n### Run the test\n\n```python\nimport seldom\n\nseldom.main()  # \u9ed8\u8ba4\u8fd0\u884c\u5f53\u524d\u6d4b\u8bd5\u6587\u4ef6\nseldom.main(path=\"./\")  # \u5f53\u524d\u76ee\u5f55\u4e0b\u7684\u6240\u6709\u6d4b\u8bd5\u6587\u4ef6\nseldom.main(path=\"./test_dir/\")  # \u6307\u5b9a\u76ee\u5f55\u4e0b\u7684\u6240\u6709\u6d4b\u8bd5\u6587\u4ef6\nseldom.main(path=\"./test_dir/test_sample.py\")  # \u6307\u5b9a\u76ee\u5f55\u4e0b\u7684\u6d4b\u8bd5\u6587\u4ef6\n```\n\n## \ud83d\udcd6 Document\n\n[\u4e2d\u6587\u6587\u6863](https://seldomqa.github.io/)\n\n### \u9879\u76ee\u5b9e\u4f8b\n\n\u57fa\u4e8eseldom\u7684web UI\u81ea\u52a8\u5316\u9879\u76ee\uff1a\n\nhttps://github.com/SeldomQA/seldom-web-testing\n\n\u57fa\u4e8eseldom\u7684\u63a5\u53e3\u81ea\u52a8\u5316\u9879\u76ee:\n\nhttps://github.com/defnngj/seldom-api-testing\n\n## \u5fae\u4fe1\uff08WeChat\uff09\n\n> \u6b22\u8fce\u6dfb\u52a0\u5fae\u4fe1\uff0c\u4ea4\u6d41\u548c\u53cd\u9988\u95ee\u9898\u3002\n\n<div style=\"display: flex;justify-content: space-between;width: 100%\">\n    <p><img alt=\"\u5fae\u4fe1\" src=\"wechat.jpg\" style=\"width: 200px;height: 100%\" ></p>\n</div>\n\n### Star History\n\n![Star History Chart](https://api.star-history.com/svg?repos=SeldomQA/seldom&type=Date)\n\n### \u611f\u8c22\n\n\u611f\u8c22\u4ece\u4ee5\u4e0b\u9879\u76ee\u4e2d\u5f97\u5230\u601d\u8def\u548c\u5e2e\u52a9\u3002\n\n* [parameterized](https://github.com/wolever/parameterized)\n\n* [utx](https://github.com/jianbing/utx)\n\n### \u4ea4\u6d41\n\nQQ\u7fa4\uff1a948994709\n\n",
    "bugtrack_url": null,
    "license": "Apache-2.0",
    "summary": "Seldom automation testing framework based on unittest.",
    "version": "3.7.0",
    "project_urls": {
        "Documentation": "https://seldomqa.github.io",
        "Homepage": "https://seldomqa.github.io",
        "Repository": "https://github.com/SeldomQA/seldom"
    },
    "split_keywords": [
        "sedom",
        " selenium",
        " appium",
        " requests"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "7cc734d963d2af8a16a2079d82277347d2be12f7d6b923e2872d22952f620cfd",
                "md5": "8624ee48b63c6caf1e7ab2a1ce784ed5",
                "sha256": "178c3914cc716ba87c3ea5d85e7c7d61ad15da4ce3b24f77f94cb10f7e8ed7ec"
            },
            "downloads": -1,
            "filename": "seldom-3.7.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "8624ee48b63c6caf1e7ab2a1ce784ed5",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": "<4.0,>=3.8",
            "size": 102377,
            "upload_time": "2024-05-05T16:40:22",
            "upload_time_iso_8601": "2024-05-05T16:40:22.132388Z",
            "url": "https://files.pythonhosted.org/packages/7c/c7/34d963d2af8a16a2079d82277347d2be12f7d6b923e2872d22952f620cfd/seldom-3.7.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "18beb5ed5a157eee133cf4667c9e8249f0209051401f91c7462b80f71c2e94bc",
                "md5": "32e3b62ec7ee09c4bb33f9d4e7cc76fd",
                "sha256": "55c5009423c6f60bc3b000a396f7ec1773aa55e40c1d2d320eb789170bb9423c"
            },
            "downloads": -1,
            "filename": "seldom-3.7.0.tar.gz",
            "has_sig": false,
            "md5_digest": "32e3b62ec7ee09c4bb33f9d4e7cc76fd",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": "<4.0,>=3.8",
            "size": 88005,
            "upload_time": "2024-05-05T16:40:23",
            "upload_time_iso_8601": "2024-05-05T16:40:23.937727Z",
            "url": "https://files.pythonhosted.org/packages/18/be/b5ed5a157eee133cf4667c9e8249f0209051401f91c7462b80f71c2e94bc/seldom-3.7.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-05-05 16:40:23",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "SeldomQA",
    "github_project": "seldom",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "requirements": [
        {
            "name": "Appium-Python-Client",
            "specs": [
                [
                    ">=",
                    "3.1.0"
                ]
            ]
        },
        {
            "name": "XTestRunner",
            "specs": [
                [
                    ">=",
                    "1.7.0"
                ]
            ]
        },
        {
            "name": "loguru",
            "specs": [
                [
                    "==",
                    "0.6.0"
                ]
            ]
        },
        {
            "name": "openpyxl",
            "specs": [
                [
                    ">=",
                    "3.0.3"
                ]
            ]
        },
        {
            "name": "pyyaml",
            "specs": [
                [
                    ">=",
                    "6.0"
                ]
            ]
        },
        {
            "name": "requests",
            "specs": [
                [
                    ">=",
                    "2.29"
                ]
            ]
        },
        {
            "name": "jsonschema",
            "specs": [
                [
                    ">=",
                    "4.10.0"
                ]
            ]
        },
        {
            "name": "jmespath",
            "specs": [
                [
                    ">=",
                    "0.10.0"
                ]
            ]
        },
        {
            "name": "pymysql",
            "specs": [
                [
                    ">=",
                    "1.0.0"
                ]
            ]
        },
        {
            "name": "genson",
            "specs": [
                [
                    "==",
                    "1.2.2"
                ]
            ]
        },
        {
            "name": "click",
            "specs": [
                [
                    "~=",
                    "8.1.3"
                ]
            ]
        },
        {
            "name": "python-dateutil",
            "specs": [
                [
                    "==",
                    "2.8.2"
                ]
            ]
        },
        {
            "name": "websocket-client",
            "specs": [
                [
                    "==",
                    "1.7.0"
                ]
            ]
        }
    ],
    "lcname": "seldom"
}
        
Elapsed time: 0.26931s