summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2023-04-10 12:37:36 +0000
committerCoprDistGit <infra@openeuler.org>2023-04-10 12:37:36 +0000
commitc20c2906c5d7f1d9a6796fbdc67a70eeacf7dd52 (patch)
tree21fb1ed0304467327f55ecaf4e30995d8dde564d
parente236817918f6253fc6b38f5c53effdcd34423a7c (diff)
automatic import of python-appium-python-client
-rw-r--r--.gitignore1
-rw-r--r--python-appium-python-client.spec1053
-rw-r--r--sources1
3 files changed, 1055 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
index e69de29..2905b0c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -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
+
+[![PyPI version](https://badge.fury.io/py/Appium-Python-Client.svg)](https://badge.fury.io/py/Appium-Python-Client)
+[![Downloads](https://pepy.tech/badge/appium-python-client)](https://pepy.tech/project/appium-python-client)
+
+[![Build Status](https://dev.azure.com/AppiumCI/Appium%20CI/_apis/build/status/appium.python-client?branchName=master)](https://dev.azure.com/AppiumCI/Appium%20CI/_build/latest?definitionId=56&branchName=master)
+
+[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](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
+
+[![PyPI version](https://badge.fury.io/py/Appium-Python-Client.svg)](https://badge.fury.io/py/Appium-Python-Client)
+[![Downloads](https://pepy.tech/badge/appium-python-client)](https://pepy.tech/project/appium-python-client)
+
+[![Build Status](https://dev.azure.com/AppiumCI/Appium%20CI/_apis/build/status/appium.python-client?branchName=master)](https://dev.azure.com/AppiumCI/Appium%20CI/_build/latest?definitionId=56&branchName=master)
+
+[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](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
+
+[![PyPI version](https://badge.fury.io/py/Appium-Python-Client.svg)](https://badge.fury.io/py/Appium-Python-Client)
+[![Downloads](https://pepy.tech/badge/appium-python-client)](https://pepy.tech/project/appium-python-client)
+
+[![Build Status](https://dev.azure.com/AppiumCI/Appium%20CI/_apis/build/status/appium.python-client?branchName=master)](https://dev.azure.com/AppiumCI/Appium%20CI/_build/latest?definitionId=56&branchName=master)
+
+[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](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
diff --git a/sources b/sources
new file mode 100644
index 0000000..5724df3
--- /dev/null
+++ b/sources
@@ -0,0 +1 @@
+2f6aafc6c568ca93923ff0e077f1aaba Appium-Python-Client-2.9.0.tar.gz