poium


Namepoium JSON
Version 1.5.1 PyPI version JSON
download
home_pagehttps://seldomqa.github.io
SummaryPage Objects design pattern test library.
upload_time2024-04-15 10:30:37
maintainerNone
docs_urlNone
authorfnngj
requires_python<4.0,>=3.8
licenseApache-2.0
keywords selenium appium playwright
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            ![](logo.png)

> Page Objects design pattern test library; support selenium、appium、playwright, etc

Page Objects 设计模式测试库;支持 selenium、appium、playwright 等。

## Features

* 极简的Page层的元素定义。
* 支持主流的 Web/App UI库。
* 对原生 API 无损。

__支持库:__

- [x] selenium ✔️
- [x] appium ✔️
- [x] playwright ✔️
- [x] uiautomator2 ⚠️
- [x] facebook-wda ️ ⚠️

## Installation

pip install:

```shell
> pip install poium
> pip install playwright [可选]
> pip install uiautomator2 [可选]
> pip install facebook-wda [可选]
```

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/poium.git@master
```

## Sample

### selenium/appium

`poium` 对 `selenium/appium` 提供了良好的支持。

👉 [详细文档](./sample/selenium_sample)

* selenium

```python
from selenium import webdriver
from poium import Page, Element, Elements


# page
class BaiduPage(Page):
    input = Element("#kw")
    button = Element("id=su")
    result = Elements("//div/h3/a", describe="搜索结果", timeout=2)


# selenium
driver = webdriver.Chrome()

page = BaiduPage(driver)
page.open("https://www.baidu.com")
page.input.send_keys("baidu")
page.button.click()

for r in page.result:
    print(r.text)

driver.close()
```

* appium

```python
from appium import webdriver
from appium.options.android import UiAutomator2Options
from poium import Page, Element


# page
class CalculatorPage(Page):
    number_1 = Element(id_="com.android.calculator2:id/digit_1")
    number_2 = Element(id_="com.android.calculator2:id/digit_2")
    add = Element(id_="com.android.calculator2:id/op_add")
    eq = Element(id_="com.android.calculator2:id/eq")


# appium
capabilities = {
    "automationName": "UiAutomator2",
    "platformName": "Android",
    'appPackage': 'com.android.calculator2',
    'appActivity': '.Calculator'
}
options = UiAutomator2Options().load_capabilities(capabilities)
driver = webdriver.Remote('http://localhost:4723/wd/hub', options=options)

page = CalculatorPage(driver)
page.number_1.click()
page.add.click()
page.number_2.click()
page.eq.click()

driver.quit()
```

### playwright

`poium 1.2` 版本支持playwright库, 目前仅支持`sync`的用法.

👉 [详细文档](./sample/playwright_sample)

```python
import re
from playwright.sync_api import sync_playwright
from playwright.sync_api import expect
from poium.playwright import Page, Locator


# page
class BingPage(Page):
    search_input = Locator('id=sb_form_q', describe="bing搜索框")
    search_icon = Locator('id=search_icon', describe="bing搜索按钮")


# playwright
with sync_playwright() as p:
    # 启动浏浏览器
    browser = p.chromium.launch(headless=False)
    # 创建新的页面
    page = browser.new_page()
    # 进入指定URL
    page.goto("https://cn.bing.com")

    # 获得元素
    search_page = BingPage(page)
    search_page.search_input.highlight()
    search_page.search_input.fill("playwright")
    search_page.search_icon.highlight()
    search_page.search_icon.screenshot(path="./docs/abc.png")
    search_page.search_icon.click()

    # 断言URL
    expect(page).to_have_title(re.compile("playwright"))

    # 关闭浏览器
    browser.close()
```

### openatx

`openatx` 有国内是非常流行的移动App自动化工具,`poium`同样对它做了支持。

👉 [详细文档](./sample/u2_sample)

* uiautomator2

```python
import uiautomator2 as u2

from poium.u2 import Page, XpathElement


class BingPage(Page):
    search = XpathElement('//*[@resource-id="com.microsoft.bing:id/sa_hp_header_search_box"]')
    search_input = XpathElement('//*[@resource-id="com.microsoft.bing:id/sapphire_search_header_input"]')
    search_count = XpathElement('//*[@resource-id="count"]')


d = u2.connect()
d.app_start("com.microsoft.bing")
page = BingPage(d)
page.search.click()

page.search_input.click()
page.search_input.set_text("uiautomator2")
page.press("enter")
page.sleep(2)
result = page.search_count.get_text()
assert "个结果" in result

d.app_stop("com.microsoft.bing")
```

### seldom

seldom是一个全功能自动化测试框架。

👉 [详细文档](./sample/seldom_sample)

```python
import seldom
from poium import Page, Element


class BaiduPage(Page):
    """baidu page"""
    input = Element(id_="kw", describe="搜索输入框")
    button = Element(id_="su", describe="搜索按钮")


class BaiduTest(seldom.TestCase):
    """Baidu search test case"""

    def test_case(self):
        """A simple test"""
        page = BaiduPage(self.driver, print_log=True)
        page.open("https://www.baidu.com")
        page.input.send_keys("seldom")
        page.button.click()
        self.assertTitle("seldom_百度搜索")


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

### Star History

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

## Project History

* [page-objects](https://github.com/eeaston/page-objects)

poium 参考 page-objects,他项目已经不再维护,原项目代码虽然只有100多行,但设计非常精妙。本项目在此基础上进行开发。

* [selenium-page-objects](https://pypi.org/project/selenium-page-objects/)

selenium-page-objects是poium的前身,为了简化项目名称,改名为poium。__po__ 取自 Page Object 首字母, __ium__
取自selenium/appium 共同后缀。


            

Raw data

            {
    "_id": null,
    "home_page": "https://seldomqa.github.io",
    "name": "poium",
    "maintainer": null,
    "docs_url": null,
    "requires_python": "<4.0,>=3.8",
    "maintainer_email": null,
    "keywords": "selenium, appium, playwright",
    "author": "fnngj",
    "author_email": "fnngj@126.com",
    "download_url": "https://files.pythonhosted.org/packages/c2/82/e1dbdb89bee14a7657c6a92652cadab0d39d96d914e7217a8c5b0ceaa3d3/poium-1.5.1.tar.gz",
    "platform": null,
    "description": "![](logo.png)\n\n> Page Objects design pattern test library; support selenium\u3001appium\u3001playwright, etc\n\nPage Objects \u8bbe\u8ba1\u6a21\u5f0f\u6d4b\u8bd5\u5e93\uff1b\u652f\u6301 selenium\u3001appium\u3001playwright \u7b49\u3002\n\n## Features\n\n* \u6781\u7b80\u7684Page\u5c42\u7684\u5143\u7d20\u5b9a\u4e49\u3002\n* \u652f\u6301\u4e3b\u6d41\u7684 Web/App UI\u5e93\u3002\n* \u5bf9\u539f\u751f API \u65e0\u635f\u3002\n\n__\u652f\u6301\u5e93\uff1a__\n\n- [x] selenium \u2714\ufe0f\n- [x] appium \u2714\ufe0f\n- [x] playwright \u2714\ufe0f\n- [x] uiautomator2 \u26a0\ufe0f\n- [x] facebook-wda \ufe0f \u26a0\ufe0f\n\n## Installation\n\npip install:\n\n```shell\n> pip install poium\n> pip install playwright [\u53ef\u9009]\n> pip install uiautomator2 [\u53ef\u9009]\n> pip install facebook-wda [\u53ef\u9009]\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/poium.git@master\n```\n\n## Sample\n\n### selenium/appium\n\n`poium` \u5bf9 `selenium/appium` \u63d0\u4f9b\u4e86\u826f\u597d\u7684\u652f\u6301\u3002\n\n\ud83d\udc49 [\u8be6\u7ec6\u6587\u6863](./sample/selenium_sample)\n\n* selenium\n\n```python\nfrom selenium import webdriver\nfrom poium import Page, Element, Elements\n\n\n# page\nclass BaiduPage(Page):\n    input = Element(\"#kw\")\n    button = Element(\"id=su\")\n    result = Elements(\"//div/h3/a\", describe=\"\u641c\u7d22\u7ed3\u679c\", timeout=2)\n\n\n# selenium\ndriver = webdriver.Chrome()\n\npage = BaiduPage(driver)\npage.open(\"https://www.baidu.com\")\npage.input.send_keys(\"baidu\")\npage.button.click()\n\nfor r in page.result:\n    print(r.text)\n\ndriver.close()\n```\n\n* appium\n\n```python\nfrom appium import webdriver\nfrom appium.options.android import UiAutomator2Options\nfrom poium import Page, Element\n\n\n# page\nclass CalculatorPage(Page):\n    number_1 = Element(id_=\"com.android.calculator2:id/digit_1\")\n    number_2 = Element(id_=\"com.android.calculator2:id/digit_2\")\n    add = Element(id_=\"com.android.calculator2:id/op_add\")\n    eq = Element(id_=\"com.android.calculator2:id/eq\")\n\n\n# appium\ncapabilities = {\n    \"automationName\": \"UiAutomator2\",\n    \"platformName\": \"Android\",\n    'appPackage': 'com.android.calculator2',\n    'appActivity': '.Calculator'\n}\noptions = UiAutomator2Options().load_capabilities(capabilities)\ndriver = webdriver.Remote('http://localhost:4723/wd/hub', options=options)\n\npage = CalculatorPage(driver)\npage.number_1.click()\npage.add.click()\npage.number_2.click()\npage.eq.click()\n\ndriver.quit()\n```\n\n### playwright\n\n`poium 1.2` \u7248\u672c\u652f\u6301playwright\u5e93, \u76ee\u524d\u4ec5\u652f\u6301`sync`\u7684\u7528\u6cd5.\n\n\ud83d\udc49 [\u8be6\u7ec6\u6587\u6863](./sample/playwright_sample)\n\n```python\nimport re\nfrom playwright.sync_api import sync_playwright\nfrom playwright.sync_api import expect\nfrom poium.playwright import Page, Locator\n\n\n# page\nclass BingPage(Page):\n    search_input = Locator('id=sb_form_q', describe=\"bing\u641c\u7d22\u6846\")\n    search_icon = Locator('id=search_icon', describe=\"bing\u641c\u7d22\u6309\u94ae\")\n\n\n# playwright\nwith sync_playwright() as p:\n    # \u542f\u52a8\u6d4f\u6d4f\u89c8\u5668\n    browser = p.chromium.launch(headless=False)\n    # \u521b\u5efa\u65b0\u7684\u9875\u9762\n    page = browser.new_page()\n    # \u8fdb\u5165\u6307\u5b9aURL\n    page.goto(\"https://cn.bing.com\")\n\n    # \u83b7\u5f97\u5143\u7d20\n    search_page = BingPage(page)\n    search_page.search_input.highlight()\n    search_page.search_input.fill(\"playwright\")\n    search_page.search_icon.highlight()\n    search_page.search_icon.screenshot(path=\"./docs/abc.png\")\n    search_page.search_icon.click()\n\n    # \u65ad\u8a00URL\n    expect(page).to_have_title(re.compile(\"playwright\"))\n\n    # \u5173\u95ed\u6d4f\u89c8\u5668\n    browser.close()\n```\n\n### openatx\n\n`openatx` \u6709\u56fd\u5185\u662f\u975e\u5e38\u6d41\u884c\u7684\u79fb\u52a8App\u81ea\u52a8\u5316\u5de5\u5177\uff0c`poium`\u540c\u6837\u5bf9\u5b83\u505a\u4e86\u652f\u6301\u3002\n\n\ud83d\udc49 [\u8be6\u7ec6\u6587\u6863](./sample/u2_sample)\n\n* uiautomator2\n\n```python\nimport uiautomator2 as u2\n\nfrom poium.u2 import Page, XpathElement\n\n\nclass BingPage(Page):\n    search = XpathElement('//*[@resource-id=\"com.microsoft.bing:id/sa_hp_header_search_box\"]')\n    search_input = XpathElement('//*[@resource-id=\"com.microsoft.bing:id/sapphire_search_header_input\"]')\n    search_count = XpathElement('//*[@resource-id=\"count\"]')\n\n\nd = u2.connect()\nd.app_start(\"com.microsoft.bing\")\npage = BingPage(d)\npage.search.click()\n\npage.search_input.click()\npage.search_input.set_text(\"uiautomator2\")\npage.press(\"enter\")\npage.sleep(2)\nresult = page.search_count.get_text()\nassert \"\u4e2a\u7ed3\u679c\" in result\n\nd.app_stop(\"com.microsoft.bing\")\n```\n\n### seldom\n\nseldom\u662f\u4e00\u4e2a\u5168\u529f\u80fd\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u3002\n\n\ud83d\udc49 [\u8be6\u7ec6\u6587\u6863](./sample/seldom_sample)\n\n```python\nimport seldom\nfrom poium import Page, Element\n\n\nclass BaiduPage(Page):\n    \"\"\"baidu page\"\"\"\n    input = Element(id_=\"kw\", describe=\"\u641c\u7d22\u8f93\u5165\u6846\")\n    button = Element(id_=\"su\", describe=\"\u641c\u7d22\u6309\u94ae\")\n\n\nclass BaiduTest(seldom.TestCase):\n    \"\"\"Baidu search test case\"\"\"\n\n    def test_case(self):\n        \"\"\"A simple test\"\"\"\n        page = BaiduPage(self.driver, print_log=True)\n        page.open(\"https://www.baidu.com\")\n        page.input.send_keys(\"seldom\")\n        page.button.click()\n        self.assertTitle(\"seldom_\u767e\u5ea6\u641c\u7d22\")\n\n\nif __name__ == '__main__':\n    seldom.main(browser='edge')\n```\n\n### Star History\n\n![Star History Chart](https://api.star-history.com/svg?repos=SeldomQA/poium&type=Date)\n\n## Project History\n\n* [page-objects](https://github.com/eeaston/page-objects)\n\npoium \u53c2\u8003 page-objects\uff0c\u4ed6\u9879\u76ee\u5df2\u7ecf\u4e0d\u518d\u7ef4\u62a4\uff0c\u539f\u9879\u76ee\u4ee3\u7801\u867d\u7136\u53ea\u6709100\u591a\u884c\uff0c\u4f46\u8bbe\u8ba1\u975e\u5e38\u7cbe\u5999\u3002\u672c\u9879\u76ee\u5728\u6b64\u57fa\u7840\u4e0a\u8fdb\u884c\u5f00\u53d1\u3002\n\n* [selenium-page-objects](https://pypi.org/project/selenium-page-objects/)\n\nselenium-page-objects\u662fpoium\u7684\u524d\u8eab\uff0c\u4e3a\u4e86\u7b80\u5316\u9879\u76ee\u540d\u79f0\uff0c\u6539\u540d\u4e3apoium\u3002__po__ \u53d6\u81ea Page Object \u9996\u5b57\u6bcd, __ium__\n\u53d6\u81easelenium/appium \u5171\u540c\u540e\u7f00\u3002\n\n",
    "bugtrack_url": null,
    "license": "Apache-2.0",
    "summary": "Page Objects design pattern test library.",
    "version": "1.5.1",
    "project_urls": {
        "Homepage": "https://seldomqa.github.io",
        "Repository": "https://github.com/SeldomQA/poium"
    },
    "split_keywords": [
        "selenium",
        " appium",
        " playwright"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "929e8202e8ef4f7843b4ddd4e0c6c26b3e9d95481c2eab6ca6b5236ebb5a45e4",
                "md5": "3f4a879f74735eea6a204c7631317c62",
                "sha256": "6987ab9f57110abc06d198f464fc7fd166b9dbdbe7e3be7c7e113bf4c8715a35"
            },
            "downloads": -1,
            "filename": "poium-1.5.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "3f4a879f74735eea6a204c7631317c62",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": "<4.0,>=3.8",
            "size": 35587,
            "upload_time": "2024-04-15T10:30:35",
            "upload_time_iso_8601": "2024-04-15T10:30:35.810615Z",
            "url": "https://files.pythonhosted.org/packages/92/9e/8202e8ef4f7843b4ddd4e0c6c26b3e9d95481c2eab6ca6b5236ebb5a45e4/poium-1.5.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "c282e1dbdb89bee14a7657c6a92652cadab0d39d96d914e7217a8c5b0ceaa3d3",
                "md5": "b170d06a3e166442632d6467c84c807e",
                "sha256": "785c214d20357204c1612374ecfd5e4f79d306615b9979a9d2a29e1744a321b8"
            },
            "downloads": -1,
            "filename": "poium-1.5.1.tar.gz",
            "has_sig": false,
            "md5_digest": "b170d06a3e166442632d6467c84c807e",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": "<4.0,>=3.8",
            "size": 30432,
            "upload_time": "2024-04-15T10:30:37",
            "upload_time_iso_8601": "2024-04-15T10:30:37.535814Z",
            "url": "https://files.pythonhosted.org/packages/c2/82/e1dbdb89bee14a7657c6a92652cadab0d39d96d914e7217a8c5b0ceaa3d3/poium-1.5.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-04-15 10:30:37",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "SeldomQA",
    "github_project": "poium",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "poium"
}
        
Elapsed time: 0.22448s