diff options
| author | CoprDistGit <infra@openeuler.org> | 2023-04-10 12:37:36 +0000 |
|---|---|---|
| committer | CoprDistGit <infra@openeuler.org> | 2023-04-10 12:37:36 +0000 |
| commit | c20c2906c5d7f1d9a6796fbdc67a70eeacf7dd52 (patch) | |
| tree | 21fb1ed0304467327f55ecaf4e30995d8dde564d | |
| parent | e236817918f6253fc6b38f5c53effdcd34423a7c (diff) | |
automatic import of python-appium-python-client
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | python-appium-python-client.spec | 1053 | ||||
| -rw-r--r-- | sources | 1 |
3 files changed, 1055 insertions, 0 deletions
@@ -0,0 +1 @@ +/Appium-Python-Client-2.9.0.tar.gz diff --git a/python-appium-python-client.spec b/python-appium-python-client.spec new file mode 100644 index 0000000..146d3df --- /dev/null +++ b/python-appium-python-client.spec @@ -0,0 +1,1053 @@ +%global _empty_manifest_terminate_build 0 +Name: python-Appium-Python-Client +Version: 2.9.0 +Release: 1 +Summary: Python client for Appium +License: Apache 2.0 +URL: http://appium.io/ +Source0: https://mirrors.nju.edu.cn/pypi/web/packages/e3/bd/ed36966337d80d66fb2b794320b765b065a6656befa5c4e9232728fd15cd/Appium-Python-Client-2.9.0.tar.gz +BuildArch: noarch + + +%description +# Appium Python Client + +[](https://badge.fury.io/py/Appium-Python-Client) +[](https://pepy.tech/project/appium-python-client) + +[](https://dev.azure.com/AppiumCI/Appium%20CI/_build/latest?definitionId=56&branchName=master) + +[](https://github.com/psf/black) + +An extension library for adding [WebDriver Protocol](https://www.w3.org/TR/webdriver/) and Appium commands to the Selenium Python language binding for use with the mobile testing framework [Appium](https://appium.io). + +## Notice + +Since **v1.0.0**, only Python 3.7+ is supported. + +Since **v2.0.0**, the base selenium client version is v4. +The version only works in W3C WebDriver protocol format. +If you would like to use the old protocol (MJSONWP), please use v1 Appium Python client. + +### Quick migration guide from v1 to v2 +- Enhancement + - Updated base Selenium Python binding version to v4 + - Removed `forceMjsonwp` since Selenium v4 and Appium Python client v2 expect only W3C WebDriver protocol + - Methods `ActionHelpers#scroll`, `ActionHelpers#drag_and_drop`, `ActionHelpers#tap`, `ActionHelpers#swipe` and `ActionHelpers#flick` now call W3C actions as its backend + - Please check each behavior. Their behaviors could slightly differ. + - Added `strict_ssl` to relax SSL error such as self-signed ones +- Deprecated + - `MultiAction` and `TouchAction` are deprecated. Please use W3C WebDriver actions. + - e.g. + - [appium/webdriver/extensions/action_helpers.py](appium/webdriver/extensions/action_helpers.py) + - https://www.selenium.dev/documentation/support_packages/mouse_and_keyboard_actions_in_detail/ + - https://www.youtube.com/watch?v=oAJ7jwMNFVU + - https://appiumpro.com/editions/30-ios-specific-touch-action-methods + - https://appiumpro.com/editions/29-automating-complex-gestures-with-the-w3c-actions-api + - `launch_app`, `close_app` and `reset` are deprecated. Please read [issues#15807](https://github.com/appium/appium/issues/15807) for more details + +#### MultiAction/TouchAction to W3C actions + +On UIA2, some elements can be handled with `touch` pointer action insead of the default `mouse` pointer action in the Selenium Python cleint. +For example, the below action builder is to replace the default one with the `touch` pointer action. + +```python +from selenium.webdriver.common.actions import interaction +from selenium.webdriver.common.actions.action_builder import ActionBuilder + +actions = ActionChains(driver) +# override as 'touch' pointer action +actions.w3c_actions = ActionBuilder(driver, mouse=PointerInput(interaction.POINTER_TOUCH, "touch")) +actions.w3c_actions.pointer_action.move_to_location(start_x, start_y) +actions.w3c_actions.pointer_action.pointer_down() +actions.w3c_actions.pointer_action.pause(2) +actions.w3c_actions.pointer_action.move_to_location(end_x, end_y) +actions.w3c_actions.pointer_action.release() +actions.perform() +``` + +## Getting the Appium Python client + +There are three ways to install and use the Appium Python client. + +1. Install from [PyPi](https://pypi.org), as +['Appium-Python-Client'](https://pypi.org/project/Appium-Python-Client/). + + ```shell + pip install Appium-Python-Client + ``` + + You can see the history from [here](https://pypi.org/project/Appium-Python-Client/#history) + +2. Install from source, via [PyPi](https://pypi.org). From ['Appium-Python-Client'](https://pypi.org/project/Appium-Python-Client/), +download and unarchive the source tarball (Appium-Python-Client-X.X.tar.gz). + + ```shell + tar -xvf Appium-Python-Client-X.X.tar.gz + cd Appium-Python-Client-X.X + python setup.py install + ``` + +3. Install from source via [GitHub](https://github.com/appium/python-client). + + ```shell + git clone git@github.com:appium/python-client.git + cd python-client + python setup.py install + ``` + +## Usage + +The Appium Python Client is fully compliant with the WebDriver Protocol +including several helpers to make mobile testing in Python easier. + +To use the new functionality now, and to use the superset of functions, instead of +including the Selenium `webdriver` module in your test code, use that from +Appium instead. + +```python +from appium import webdriver +``` + +From there much of your test code will work with no change. + +As a base for the following code examples, the following sets up the [UnitTest](https://docs.python.org/3/library/unittest.html) +environment: + +```python +# Android environment +from appium import webdriver +# Options are only available since client version 2.3.0 +# If you use an older client then switch to desired_capabilities +# instead: https://github.com/appium/python-client/pull/720 +from appium.options.android import UiAutomator2Options +from appium.webdriver.common.appiumby import AppiumBy + +options = UiAutomator2Options() +options.platformVersion = '10' +options.udid = '123456789ABC' +options.app = PATH('../../../apps/test-app.apk') +# Appium1 points to http://127.0.0.1:4723/wd/hub by default +self.driver = webdriver.Remote('http://127.0.0.1:4723', options=options) +el = self.driver.find_element(by=AppiumBy.ACCESSIBILITY_ID, value='item') +el.click() +``` + +```python +# iOS environment +from appium import webdriver +# Options are only available since client version 2.3.0 +# If you use an older client then switch to desired_capabilities +# instead: https://github.com/appium/python-client/pull/720 +from appium.options.ios import XCUITestOptions +from appium.webdriver.common.appiumby import AppiumBy + +options = XCUITestOptions() +options.platformVersion = '13.4' +options.udid = '123456789ABC' +options.app = PATH('../../apps/UICatalog.app.zip') +# Appium1 points to http://127.0.0.1:4723/wd/hub by default +self.driver = webdriver.Remote('http://127.0.0.1:4723', options=options) +el = self.driver.find_element(by=AppiumBy.ACCESSIBILITY_ID, value='item') +el.click() +``` + +## Direct Connect URLs + +If your Selenium/Appium server decorates the new session capabilities response with the following keys: + +- `directConnectProtocol` +- `directConnectHost` +- `directConnectPort` +- `directConnectPath` + +Then python client will switch its endpoint to the one specified by the values of those keys. + +```python +from appium import webdriver +# Options are only available since client version 2.3.0 +# If you use an older client then switch to desired_capabilities +# instead: https://github.com/appium/python-client/pull/720 +from appium.options.ios import XCUITestOptions + +# load_capabilities API could be used to +# load options mapping stored in a dictionary +options = XCUITestOptions().load_capabilities({ + 'platformVersion': '13.4', + 'deviceName': 'iPhone Simulator', + 'app': PATH('../../apps/UICatalog.app.zip'), +}) + +self.driver = webdriver.Remote( + # Appium1 points to http://127.0.0.1:4723/wd/hub by default + 'http://127.0.0.1:4723', + options=options, + direct_connection=True +) +``` + +## Relax SSL validation + +`strict_ssl` option allows you to send commands to an invalid certificate host like a self-signed one. + +```python +from appium import webdriver +# Options are only available since client version 2.3.0 +# If you use an older client then switch to desired_capabilities +# instead: https://github.com/appium/python-client/pull/720 +from appium.options.common import AppiumOptions + +options = AppiumOptions() +options.platform_name = 'mac' +options.automation_name = 'safari' +# set_capability API allows to provide any custom option +# calls to it could be chained +options.set_capability('browser_name', 'safari') + +# Appium1 points to http://127.0.0.1:4723/wd/hub by default +self.driver = webdriver.Remote('http://127.0.0.1:4723', options=options, strict_ssl=False) +``` + +## Set custom `AppiumConnection` + +The first argument of `webdriver.Remote` can set an arbitrary command executor for you. + +1. Set init arguments for the pool manager Appium Python client uses to manage http requests. + +```python +from appium import webdriver +from appium.options.ios import XCUITestOptions + +import urllib3 +from appium.webdriver.appium_connection import AppiumConnection + +# Retry connection error up to 3 times. +init_args_for_pool_manage = { + 'retries': urllib3.util.retry.Retry(total=3, connect=3, read=False) +} +appium_executor = AppiumConnection(remote_server_addr='http://127.0.0.1:4723', + init_args_for_pool_manage=init_args_for_pool_manage) + +options = XCUITestOptions() +options.platformVersion = '13.4' +options.udid = '123456789ABC' +options.app = PATH('../../apps/UICatalog.app.zip') +driver = webdriver.Remote(appium_executor, options=options) +``` + + +2. Define a subclass of `AppiumConnection` + +```python +from appium import webdriver +from appium.options.ios import XCUITestOptions + +from appium.webdriver.appium_connection import AppiumConnection + +class CustomAppiumConnection(AppiumConnection): + # Can add your own methods for the custom class + pass + +custom_executor = CustomAppiumConnection(remote_server_addr='http://127.0.0.1:4723') + +options = XCUITestOptions().load_capabilities({ + 'platformVersion': '13.4', + 'deviceName': 'iPhone Simulator', + 'app': PATH('../../apps/UICatalog.app.zip'), +}) +driver = webdriver.Remote(custom_executor, options=options) + +``` + + +## Documentation + +- https://appium.github.io/python-client-sphinx/ is detailed documentation +- [functional tests](test/functional) also may help to see concrete examples. + +## Development + +- Code Style: [PEP-0008](https://www.python.org/dev/peps/pep-0008/) + - Apply `black`, `isort` and `mypy` as pre commit hook + - Run `make` command for development. See `make help` output for details +- Docstring style: [Google Style](https://sphinxcontrib-napoleon.readthedocs.io/en/latest/example_google.html) +- `gitchangelog` generates `CHANGELOG.rst` + +### Setup + +- `pip install --user pipenv` +- `python -m pipenv lock --clear` + - If you experience `Locking Failed! unknown locale: UTF-8` error, then refer [pypa/pipenv#187](https://github.com/pypa/pipenv/issues/187) to solve it. +- `python -m pipenv install --dev --system` +- `pre-commit install` + +### Run tests + +You can run all of tests running on CI via `tox` in your local. + +```bash +$ tox +``` + +You also can run particular tests like below. + +#### Unit + +```bash +$ pytest test/unit +``` + +Run with `pytest-xdist` + +```bash +$ pytest -n 2 test/unit +``` + +#### Functional + +```bash +$ pytest test/functional/ios/search_context/find_by_ios_class_chain_tests.py +``` + +#### In parallel for iOS + +1. Create simulators named 'iPhone X - 8100' and 'iPhone X - 8101' +2. Install test libraries via pip, `pip install pytest pytest-xdist` +3. Run tests + +```bash +$ pytest -n 2 test/functional/ios/search_context/find_by_ios_class_chain_tests.py +``` + +## Release + +Follow below steps. + +```bash +$ pip install twine +$ pip install git+git://github.com/vaab/gitchangelog.git # Getting via GitHub repository is necessary for Python 3.7 +# Type the new version number and 'yes' if you can publish it +# You can test the command with DRY_RUN +$ DRY_RUN=1 ./release.sh +$ ./release.sh # release +``` + +## License + +Apache License v2 + + + + +%package -n python3-Appium-Python-Client +Summary: Python client for Appium +Provides: python-Appium-Python-Client +BuildRequires: python3-devel +BuildRequires: python3-setuptools +BuildRequires: python3-pip +%description -n python3-Appium-Python-Client +# Appium Python Client + +[](https://badge.fury.io/py/Appium-Python-Client) +[](https://pepy.tech/project/appium-python-client) + +[](https://dev.azure.com/AppiumCI/Appium%20CI/_build/latest?definitionId=56&branchName=master) + +[](https://github.com/psf/black) + +An extension library for adding [WebDriver Protocol](https://www.w3.org/TR/webdriver/) and Appium commands to the Selenium Python language binding for use with the mobile testing framework [Appium](https://appium.io). + +## Notice + +Since **v1.0.0**, only Python 3.7+ is supported. + +Since **v2.0.0**, the base selenium client version is v4. +The version only works in W3C WebDriver protocol format. +If you would like to use the old protocol (MJSONWP), please use v1 Appium Python client. + +### Quick migration guide from v1 to v2 +- Enhancement + - Updated base Selenium Python binding version to v4 + - Removed `forceMjsonwp` since Selenium v4 and Appium Python client v2 expect only W3C WebDriver protocol + - Methods `ActionHelpers#scroll`, `ActionHelpers#drag_and_drop`, `ActionHelpers#tap`, `ActionHelpers#swipe` and `ActionHelpers#flick` now call W3C actions as its backend + - Please check each behavior. Their behaviors could slightly differ. + - Added `strict_ssl` to relax SSL error such as self-signed ones +- Deprecated + - `MultiAction` and `TouchAction` are deprecated. Please use W3C WebDriver actions. + - e.g. + - [appium/webdriver/extensions/action_helpers.py](appium/webdriver/extensions/action_helpers.py) + - https://www.selenium.dev/documentation/support_packages/mouse_and_keyboard_actions_in_detail/ + - https://www.youtube.com/watch?v=oAJ7jwMNFVU + - https://appiumpro.com/editions/30-ios-specific-touch-action-methods + - https://appiumpro.com/editions/29-automating-complex-gestures-with-the-w3c-actions-api + - `launch_app`, `close_app` and `reset` are deprecated. Please read [issues#15807](https://github.com/appium/appium/issues/15807) for more details + +#### MultiAction/TouchAction to W3C actions + +On UIA2, some elements can be handled with `touch` pointer action insead of the default `mouse` pointer action in the Selenium Python cleint. +For example, the below action builder is to replace the default one with the `touch` pointer action. + +```python +from selenium.webdriver.common.actions import interaction +from selenium.webdriver.common.actions.action_builder import ActionBuilder + +actions = ActionChains(driver) +# override as 'touch' pointer action +actions.w3c_actions = ActionBuilder(driver, mouse=PointerInput(interaction.POINTER_TOUCH, "touch")) +actions.w3c_actions.pointer_action.move_to_location(start_x, start_y) +actions.w3c_actions.pointer_action.pointer_down() +actions.w3c_actions.pointer_action.pause(2) +actions.w3c_actions.pointer_action.move_to_location(end_x, end_y) +actions.w3c_actions.pointer_action.release() +actions.perform() +``` + +## Getting the Appium Python client + +There are three ways to install and use the Appium Python client. + +1. Install from [PyPi](https://pypi.org), as +['Appium-Python-Client'](https://pypi.org/project/Appium-Python-Client/). + + ```shell + pip install Appium-Python-Client + ``` + + You can see the history from [here](https://pypi.org/project/Appium-Python-Client/#history) + +2. Install from source, via [PyPi](https://pypi.org). From ['Appium-Python-Client'](https://pypi.org/project/Appium-Python-Client/), +download and unarchive the source tarball (Appium-Python-Client-X.X.tar.gz). + + ```shell + tar -xvf Appium-Python-Client-X.X.tar.gz + cd Appium-Python-Client-X.X + python setup.py install + ``` + +3. Install from source via [GitHub](https://github.com/appium/python-client). + + ```shell + git clone git@github.com:appium/python-client.git + cd python-client + python setup.py install + ``` + +## Usage + +The Appium Python Client is fully compliant with the WebDriver Protocol +including several helpers to make mobile testing in Python easier. + +To use the new functionality now, and to use the superset of functions, instead of +including the Selenium `webdriver` module in your test code, use that from +Appium instead. + +```python +from appium import webdriver +``` + +From there much of your test code will work with no change. + +As a base for the following code examples, the following sets up the [UnitTest](https://docs.python.org/3/library/unittest.html) +environment: + +```python +# Android environment +from appium import webdriver +# Options are only available since client version 2.3.0 +# If you use an older client then switch to desired_capabilities +# instead: https://github.com/appium/python-client/pull/720 +from appium.options.android import UiAutomator2Options +from appium.webdriver.common.appiumby import AppiumBy + +options = UiAutomator2Options() +options.platformVersion = '10' +options.udid = '123456789ABC' +options.app = PATH('../../../apps/test-app.apk') +# Appium1 points to http://127.0.0.1:4723/wd/hub by default +self.driver = webdriver.Remote('http://127.0.0.1:4723', options=options) +el = self.driver.find_element(by=AppiumBy.ACCESSIBILITY_ID, value='item') +el.click() +``` + +```python +# iOS environment +from appium import webdriver +# Options are only available since client version 2.3.0 +# If you use an older client then switch to desired_capabilities +# instead: https://github.com/appium/python-client/pull/720 +from appium.options.ios import XCUITestOptions +from appium.webdriver.common.appiumby import AppiumBy + +options = XCUITestOptions() +options.platformVersion = '13.4' +options.udid = '123456789ABC' +options.app = PATH('../../apps/UICatalog.app.zip') +# Appium1 points to http://127.0.0.1:4723/wd/hub by default +self.driver = webdriver.Remote('http://127.0.0.1:4723', options=options) +el = self.driver.find_element(by=AppiumBy.ACCESSIBILITY_ID, value='item') +el.click() +``` + +## Direct Connect URLs + +If your Selenium/Appium server decorates the new session capabilities response with the following keys: + +- `directConnectProtocol` +- `directConnectHost` +- `directConnectPort` +- `directConnectPath` + +Then python client will switch its endpoint to the one specified by the values of those keys. + +```python +from appium import webdriver +# Options are only available since client version 2.3.0 +# If you use an older client then switch to desired_capabilities +# instead: https://github.com/appium/python-client/pull/720 +from appium.options.ios import XCUITestOptions + +# load_capabilities API could be used to +# load options mapping stored in a dictionary +options = XCUITestOptions().load_capabilities({ + 'platformVersion': '13.4', + 'deviceName': 'iPhone Simulator', + 'app': PATH('../../apps/UICatalog.app.zip'), +}) + +self.driver = webdriver.Remote( + # Appium1 points to http://127.0.0.1:4723/wd/hub by default + 'http://127.0.0.1:4723', + options=options, + direct_connection=True +) +``` + +## Relax SSL validation + +`strict_ssl` option allows you to send commands to an invalid certificate host like a self-signed one. + +```python +from appium import webdriver +# Options are only available since client version 2.3.0 +# If you use an older client then switch to desired_capabilities +# instead: https://github.com/appium/python-client/pull/720 +from appium.options.common import AppiumOptions + +options = AppiumOptions() +options.platform_name = 'mac' +options.automation_name = 'safari' +# set_capability API allows to provide any custom option +# calls to it could be chained +options.set_capability('browser_name', 'safari') + +# Appium1 points to http://127.0.0.1:4723/wd/hub by default +self.driver = webdriver.Remote('http://127.0.0.1:4723', options=options, strict_ssl=False) +``` + +## Set custom `AppiumConnection` + +The first argument of `webdriver.Remote` can set an arbitrary command executor for you. + +1. Set init arguments for the pool manager Appium Python client uses to manage http requests. + +```python +from appium import webdriver +from appium.options.ios import XCUITestOptions + +import urllib3 +from appium.webdriver.appium_connection import AppiumConnection + +# Retry connection error up to 3 times. +init_args_for_pool_manage = { + 'retries': urllib3.util.retry.Retry(total=3, connect=3, read=False) +} +appium_executor = AppiumConnection(remote_server_addr='http://127.0.0.1:4723', + init_args_for_pool_manage=init_args_for_pool_manage) + +options = XCUITestOptions() +options.platformVersion = '13.4' +options.udid = '123456789ABC' +options.app = PATH('../../apps/UICatalog.app.zip') +driver = webdriver.Remote(appium_executor, options=options) +``` + + +2. Define a subclass of `AppiumConnection` + +```python +from appium import webdriver +from appium.options.ios import XCUITestOptions + +from appium.webdriver.appium_connection import AppiumConnection + +class CustomAppiumConnection(AppiumConnection): + # Can add your own methods for the custom class + pass + +custom_executor = CustomAppiumConnection(remote_server_addr='http://127.0.0.1:4723') + +options = XCUITestOptions().load_capabilities({ + 'platformVersion': '13.4', + 'deviceName': 'iPhone Simulator', + 'app': PATH('../../apps/UICatalog.app.zip'), +}) +driver = webdriver.Remote(custom_executor, options=options) + +``` + + +## Documentation + +- https://appium.github.io/python-client-sphinx/ is detailed documentation +- [functional tests](test/functional) also may help to see concrete examples. + +## Development + +- Code Style: [PEP-0008](https://www.python.org/dev/peps/pep-0008/) + - Apply `black`, `isort` and `mypy` as pre commit hook + - Run `make` command for development. See `make help` output for details +- Docstring style: [Google Style](https://sphinxcontrib-napoleon.readthedocs.io/en/latest/example_google.html) +- `gitchangelog` generates `CHANGELOG.rst` + +### Setup + +- `pip install --user pipenv` +- `python -m pipenv lock --clear` + - If you experience `Locking Failed! unknown locale: UTF-8` error, then refer [pypa/pipenv#187](https://github.com/pypa/pipenv/issues/187) to solve it. +- `python -m pipenv install --dev --system` +- `pre-commit install` + +### Run tests + +You can run all of tests running on CI via `tox` in your local. + +```bash +$ tox +``` + +You also can run particular tests like below. + +#### Unit + +```bash +$ pytest test/unit +``` + +Run with `pytest-xdist` + +```bash +$ pytest -n 2 test/unit +``` + +#### Functional + +```bash +$ pytest test/functional/ios/search_context/find_by_ios_class_chain_tests.py +``` + +#### In parallel for iOS + +1. Create simulators named 'iPhone X - 8100' and 'iPhone X - 8101' +2. Install test libraries via pip, `pip install pytest pytest-xdist` +3. Run tests + +```bash +$ pytest -n 2 test/functional/ios/search_context/find_by_ios_class_chain_tests.py +``` + +## Release + +Follow below steps. + +```bash +$ pip install twine +$ pip install git+git://github.com/vaab/gitchangelog.git # Getting via GitHub repository is necessary for Python 3.7 +# Type the new version number and 'yes' if you can publish it +# You can test the command with DRY_RUN +$ DRY_RUN=1 ./release.sh +$ ./release.sh # release +``` + +## License + +Apache License v2 + + + + +%package help +Summary: Development documents and examples for Appium-Python-Client +Provides: python3-Appium-Python-Client-doc +%description help +# Appium Python Client + +[](https://badge.fury.io/py/Appium-Python-Client) +[](https://pepy.tech/project/appium-python-client) + +[](https://dev.azure.com/AppiumCI/Appium%20CI/_build/latest?definitionId=56&branchName=master) + +[](https://github.com/psf/black) + +An extension library for adding [WebDriver Protocol](https://www.w3.org/TR/webdriver/) and Appium commands to the Selenium Python language binding for use with the mobile testing framework [Appium](https://appium.io). + +## Notice + +Since **v1.0.0**, only Python 3.7+ is supported. + +Since **v2.0.0**, the base selenium client version is v4. +The version only works in W3C WebDriver protocol format. +If you would like to use the old protocol (MJSONWP), please use v1 Appium Python client. + +### Quick migration guide from v1 to v2 +- Enhancement + - Updated base Selenium Python binding version to v4 + - Removed `forceMjsonwp` since Selenium v4 and Appium Python client v2 expect only W3C WebDriver protocol + - Methods `ActionHelpers#scroll`, `ActionHelpers#drag_and_drop`, `ActionHelpers#tap`, `ActionHelpers#swipe` and `ActionHelpers#flick` now call W3C actions as its backend + - Please check each behavior. Their behaviors could slightly differ. + - Added `strict_ssl` to relax SSL error such as self-signed ones +- Deprecated + - `MultiAction` and `TouchAction` are deprecated. Please use W3C WebDriver actions. + - e.g. + - [appium/webdriver/extensions/action_helpers.py](appium/webdriver/extensions/action_helpers.py) + - https://www.selenium.dev/documentation/support_packages/mouse_and_keyboard_actions_in_detail/ + - https://www.youtube.com/watch?v=oAJ7jwMNFVU + - https://appiumpro.com/editions/30-ios-specific-touch-action-methods + - https://appiumpro.com/editions/29-automating-complex-gestures-with-the-w3c-actions-api + - `launch_app`, `close_app` and `reset` are deprecated. Please read [issues#15807](https://github.com/appium/appium/issues/15807) for more details + +#### MultiAction/TouchAction to W3C actions + +On UIA2, some elements can be handled with `touch` pointer action insead of the default `mouse` pointer action in the Selenium Python cleint. +For example, the below action builder is to replace the default one with the `touch` pointer action. + +```python +from selenium.webdriver.common.actions import interaction +from selenium.webdriver.common.actions.action_builder import ActionBuilder + +actions = ActionChains(driver) +# override as 'touch' pointer action +actions.w3c_actions = ActionBuilder(driver, mouse=PointerInput(interaction.POINTER_TOUCH, "touch")) +actions.w3c_actions.pointer_action.move_to_location(start_x, start_y) +actions.w3c_actions.pointer_action.pointer_down() +actions.w3c_actions.pointer_action.pause(2) +actions.w3c_actions.pointer_action.move_to_location(end_x, end_y) +actions.w3c_actions.pointer_action.release() +actions.perform() +``` + +## Getting the Appium Python client + +There are three ways to install and use the Appium Python client. + +1. Install from [PyPi](https://pypi.org), as +['Appium-Python-Client'](https://pypi.org/project/Appium-Python-Client/). + + ```shell + pip install Appium-Python-Client + ``` + + You can see the history from [here](https://pypi.org/project/Appium-Python-Client/#history) + +2. Install from source, via [PyPi](https://pypi.org). From ['Appium-Python-Client'](https://pypi.org/project/Appium-Python-Client/), +download and unarchive the source tarball (Appium-Python-Client-X.X.tar.gz). + + ```shell + tar -xvf Appium-Python-Client-X.X.tar.gz + cd Appium-Python-Client-X.X + python setup.py install + ``` + +3. Install from source via [GitHub](https://github.com/appium/python-client). + + ```shell + git clone git@github.com:appium/python-client.git + cd python-client + python setup.py install + ``` + +## Usage + +The Appium Python Client is fully compliant with the WebDriver Protocol +including several helpers to make mobile testing in Python easier. + +To use the new functionality now, and to use the superset of functions, instead of +including the Selenium `webdriver` module in your test code, use that from +Appium instead. + +```python +from appium import webdriver +``` + +From there much of your test code will work with no change. + +As a base for the following code examples, the following sets up the [UnitTest](https://docs.python.org/3/library/unittest.html) +environment: + +```python +# Android environment +from appium import webdriver +# Options are only available since client version 2.3.0 +# If you use an older client then switch to desired_capabilities +# instead: https://github.com/appium/python-client/pull/720 +from appium.options.android import UiAutomator2Options +from appium.webdriver.common.appiumby import AppiumBy + +options = UiAutomator2Options() +options.platformVersion = '10' +options.udid = '123456789ABC' +options.app = PATH('../../../apps/test-app.apk') +# Appium1 points to http://127.0.0.1:4723/wd/hub by default +self.driver = webdriver.Remote('http://127.0.0.1:4723', options=options) +el = self.driver.find_element(by=AppiumBy.ACCESSIBILITY_ID, value='item') +el.click() +``` + +```python +# iOS environment +from appium import webdriver +# Options are only available since client version 2.3.0 +# If you use an older client then switch to desired_capabilities +# instead: https://github.com/appium/python-client/pull/720 +from appium.options.ios import XCUITestOptions +from appium.webdriver.common.appiumby import AppiumBy + +options = XCUITestOptions() +options.platformVersion = '13.4' +options.udid = '123456789ABC' +options.app = PATH('../../apps/UICatalog.app.zip') +# Appium1 points to http://127.0.0.1:4723/wd/hub by default +self.driver = webdriver.Remote('http://127.0.0.1:4723', options=options) +el = self.driver.find_element(by=AppiumBy.ACCESSIBILITY_ID, value='item') +el.click() +``` + +## Direct Connect URLs + +If your Selenium/Appium server decorates the new session capabilities response with the following keys: + +- `directConnectProtocol` +- `directConnectHost` +- `directConnectPort` +- `directConnectPath` + +Then python client will switch its endpoint to the one specified by the values of those keys. + +```python +from appium import webdriver +# Options are only available since client version 2.3.0 +# If you use an older client then switch to desired_capabilities +# instead: https://github.com/appium/python-client/pull/720 +from appium.options.ios import XCUITestOptions + +# load_capabilities API could be used to +# load options mapping stored in a dictionary +options = XCUITestOptions().load_capabilities({ + 'platformVersion': '13.4', + 'deviceName': 'iPhone Simulator', + 'app': PATH('../../apps/UICatalog.app.zip'), +}) + +self.driver = webdriver.Remote( + # Appium1 points to http://127.0.0.1:4723/wd/hub by default + 'http://127.0.0.1:4723', + options=options, + direct_connection=True +) +``` + +## Relax SSL validation + +`strict_ssl` option allows you to send commands to an invalid certificate host like a self-signed one. + +```python +from appium import webdriver +# Options are only available since client version 2.3.0 +# If you use an older client then switch to desired_capabilities +# instead: https://github.com/appium/python-client/pull/720 +from appium.options.common import AppiumOptions + +options = AppiumOptions() +options.platform_name = 'mac' +options.automation_name = 'safari' +# set_capability API allows to provide any custom option +# calls to it could be chained +options.set_capability('browser_name', 'safari') + +# Appium1 points to http://127.0.0.1:4723/wd/hub by default +self.driver = webdriver.Remote('http://127.0.0.1:4723', options=options, strict_ssl=False) +``` + +## Set custom `AppiumConnection` + +The first argument of `webdriver.Remote` can set an arbitrary command executor for you. + +1. Set init arguments for the pool manager Appium Python client uses to manage http requests. + +```python +from appium import webdriver +from appium.options.ios import XCUITestOptions + +import urllib3 +from appium.webdriver.appium_connection import AppiumConnection + +# Retry connection error up to 3 times. +init_args_for_pool_manage = { + 'retries': urllib3.util.retry.Retry(total=3, connect=3, read=False) +} +appium_executor = AppiumConnection(remote_server_addr='http://127.0.0.1:4723', + init_args_for_pool_manage=init_args_for_pool_manage) + +options = XCUITestOptions() +options.platformVersion = '13.4' +options.udid = '123456789ABC' +options.app = PATH('../../apps/UICatalog.app.zip') +driver = webdriver.Remote(appium_executor, options=options) +``` + + +2. Define a subclass of `AppiumConnection` + +```python +from appium import webdriver +from appium.options.ios import XCUITestOptions + +from appium.webdriver.appium_connection import AppiumConnection + +class CustomAppiumConnection(AppiumConnection): + # Can add your own methods for the custom class + pass + +custom_executor = CustomAppiumConnection(remote_server_addr='http://127.0.0.1:4723') + +options = XCUITestOptions().load_capabilities({ + 'platformVersion': '13.4', + 'deviceName': 'iPhone Simulator', + 'app': PATH('../../apps/UICatalog.app.zip'), +}) +driver = webdriver.Remote(custom_executor, options=options) + +``` + + +## Documentation + +- https://appium.github.io/python-client-sphinx/ is detailed documentation +- [functional tests](test/functional) also may help to see concrete examples. + +## Development + +- Code Style: [PEP-0008](https://www.python.org/dev/peps/pep-0008/) + - Apply `black`, `isort` and `mypy` as pre commit hook + - Run `make` command for development. See `make help` output for details +- Docstring style: [Google Style](https://sphinxcontrib-napoleon.readthedocs.io/en/latest/example_google.html) +- `gitchangelog` generates `CHANGELOG.rst` + +### Setup + +- `pip install --user pipenv` +- `python -m pipenv lock --clear` + - If you experience `Locking Failed! unknown locale: UTF-8` error, then refer [pypa/pipenv#187](https://github.com/pypa/pipenv/issues/187) to solve it. +- `python -m pipenv install --dev --system` +- `pre-commit install` + +### Run tests + +You can run all of tests running on CI via `tox` in your local. + +```bash +$ tox +``` + +You also can run particular tests like below. + +#### Unit + +```bash +$ pytest test/unit +``` + +Run with `pytest-xdist` + +```bash +$ pytest -n 2 test/unit +``` + +#### Functional + +```bash +$ pytest test/functional/ios/search_context/find_by_ios_class_chain_tests.py +``` + +#### In parallel for iOS + +1. Create simulators named 'iPhone X - 8100' and 'iPhone X - 8101' +2. Install test libraries via pip, `pip install pytest pytest-xdist` +3. Run tests + +```bash +$ pytest -n 2 test/functional/ios/search_context/find_by_ios_class_chain_tests.py +``` + +## Release + +Follow below steps. + +```bash +$ pip install twine +$ pip install git+git://github.com/vaab/gitchangelog.git # Getting via GitHub repository is necessary for Python 3.7 +# Type the new version number and 'yes' if you can publish it +# You can test the command with DRY_RUN +$ DRY_RUN=1 ./release.sh +$ ./release.sh # release +``` + +## License + +Apache License v2 + + + + +%prep +%autosetup -n Appium-Python-Client-2.9.0 + +%build +%py3_build + +%install +%py3_install +install -d -m755 %{buildroot}/%{_pkgdocdir} +if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi +if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi +if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi +if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi +pushd %{buildroot} +if [ -d usr/lib ]; then + find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/lib64 ]; then + find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/bin ]; then + find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/sbin ]; then + find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst +fi +touch doclist.lst +if [ -d usr/share/man ]; then + find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst +fi +popd +mv %{buildroot}/filelist.lst . +mv %{buildroot}/doclist.lst . + +%files -n python3-Appium-Python-Client -f filelist.lst +%dir %{python3_sitelib}/* + +%files help -f doclist.lst +%{_docdir}/* + +%changelog +* Mon Apr 10 2023 Python_Bot <Python_Bot@openeuler.org> - 2.9.0-1 +- Package Spec generated @@ -0,0 +1 @@ +2f6aafc6c568ca93923ff0e077f1aaba Appium-Python-Client-2.9.0.tar.gz |
