Appium-Python-Client 5.2.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (324) hide show
  1. appium/__init__.py +17 -0
  2. appium/common/__init__.py +17 -0
  3. appium/common/exceptions.py +26 -0
  4. appium/common/helper.py +42 -0
  5. appium/common/logger.py +28 -0
  6. appium/options/__init__.py +0 -0
  7. appium/options/android/__init__.py +2 -0
  8. appium/options/android/common/__init__.py +0 -0
  9. appium/options/android/common/adb/__init__.py +0 -0
  10. appium/options/android/common/adb/adb_exec_timeout_option.py +41 -0
  11. appium/options/android/common/adb/adb_port_option.py +38 -0
  12. appium/options/android/common/adb/allow_delay_adb_option.py +39 -0
  13. appium/options/android/common/adb/build_tools_version_option.py +42 -0
  14. appium/options/android/common/adb/clear_device_logs_on_start_option.py +40 -0
  15. appium/options/android/common/adb/ignore_hidden_api_policy_error_option.py +40 -0
  16. appium/options/android/common/adb/logcat_filter_specs_option.py +42 -0
  17. appium/options/android/common/adb/logcat_format_option.py +39 -0
  18. appium/options/android/common/adb/mock_location_app_option.py +42 -0
  19. appium/options/android/common/adb/remote_adb_host_option.py +39 -0
  20. appium/options/android/common/adb/skip_logcat_capture_option.py +40 -0
  21. appium/options/android/common/adb/suppress_kill_server_option.py +39 -0
  22. appium/options/android/common/app/__init__.py +0 -0
  23. appium/options/android/common/app/allow_test_packages_option.py +40 -0
  24. appium/options/android/common/app/android_install_timeout_option.py +43 -0
  25. appium/options/android/common/app/app_activity_option.py +39 -0
  26. appium/options/android/common/app/app_package_option.py +39 -0
  27. appium/options/android/common/app/app_wait_activity_option.py +40 -0
  28. appium/options/android/common/app/app_wait_duration_option.py +41 -0
  29. appium/options/android/common/app/app_wait_for_launch_option.py +41 -0
  30. appium/options/android/common/app/app_wait_package_option.py +40 -0
  31. appium/options/android/common/app/auto_grant_premissions_option.py +40 -0
  32. appium/options/android/common/app/enforce_app_install_option.py +40 -0
  33. appium/options/android/common/app/intent_action_option.py +40 -0
  34. appium/options/android/common/app/intent_category_option.py +40 -0
  35. appium/options/android/common/app/intent_flags_option.py +40 -0
  36. appium/options/android/common/app/optional_intent_arguments_option.py +40 -0
  37. appium/options/android/common/app/remote_apps_cache_limit_option.py +42 -0
  38. appium/options/android/common/app/uninstall_other_packages_option.py +39 -0
  39. appium/options/android/common/avd/__init__.py +0 -0
  40. appium/options/android/common/avd/avd_args_option.py +38 -0
  41. appium/options/android/common/avd/avd_env_option.py +38 -0
  42. appium/options/android/common/avd/avd_launch_timeout_option.py +41 -0
  43. appium/options/android/common/avd/avd_option.py +41 -0
  44. appium/options/android/common/avd/avd_ready_timeout_option.py +41 -0
  45. appium/options/android/common/avd/gps_enabled_option.py +39 -0
  46. appium/options/android/common/avd/network_speed_option.py +41 -0
  47. appium/options/android/common/context/__init__.py +0 -0
  48. appium/options/android/common/context/auto_webview_timeout_option.py +41 -0
  49. appium/options/android/common/context/chrome_logging_prefs_option.py +41 -0
  50. appium/options/android/common/context/chrome_options_option.py +40 -0
  51. appium/options/android/common/context/chromedriver_args_option.py +41 -0
  52. appium/options/android/common/context/chromedriver_chrome_mapping_file_option.py +43 -0
  53. appium/options/android/common/context/chromedriver_disable_build_check_option.py +41 -0
  54. appium/options/android/common/context/chromedriver_executable_dir_option.py +43 -0
  55. appium/options/android/common/context/chromedriver_executable_option.py +38 -0
  56. appium/options/android/common/context/chromedriver_port_option.py +39 -0
  57. appium/options/android/common/context/chromedriver_ports_option.py +39 -0
  58. appium/options/android/common/context/chromedriver_use_system_executable_option.py +40 -0
  59. appium/options/android/common/context/ensure_webviews_have_pages_option.py +40 -0
  60. appium/options/android/common/context/extract_chrome_android_package_from_context_name_option.py +40 -0
  61. appium/options/android/common/context/native_web_screenshot_option.py +40 -0
  62. appium/options/android/common/context/recreate_chrome_driver_sessions_option.py +41 -0
  63. appium/options/android/common/context/show_chromedriver_log_option.py +39 -0
  64. appium/options/android/common/context/webview_devtools_port_option.py +40 -0
  65. appium/options/android/common/localization/__init__.py +0 -0
  66. appium/options/android/common/localization/locale_script_option.py +40 -0
  67. appium/options/android/common/locking/__init__.py +0 -0
  68. appium/options/android/common/locking/skip_unlock_option.py +42 -0
  69. appium/options/android/common/locking/unlock_key_option.py +40 -0
  70. appium/options/android/common/locking/unlock_strategy_option.py +40 -0
  71. appium/options/android/common/locking/unlock_success_timeout_option.py +43 -0
  72. appium/options/android/common/locking/unlock_type_option.py +40 -0
  73. appium/options/android/common/mjpeg/__init__.py +0 -0
  74. appium/options/android/common/mjpeg/mjpeg_screenshot_url_option.py +40 -0
  75. appium/options/android/common/other/__init__.py +0 -0
  76. appium/options/android/common/other/disable_suppress_accessibility_service_option.py +40 -0
  77. appium/options/android/common/other/user_profile_option.py +42 -0
  78. appium/options/android/common/signing/__init__.py +0 -0
  79. appium/options/android/common/signing/key_alias_option.py +40 -0
  80. appium/options/android/common/signing/key_password_option.py +40 -0
  81. appium/options/android/common/signing/keystore_password_option.py +40 -0
  82. appium/options/android/common/signing/keystore_path_option.py +40 -0
  83. appium/options/android/common/signing/no_sign_option.py +42 -0
  84. appium/options/android/common/signing/use_keystore_option.py +42 -0
  85. appium/options/android/espresso/__init__.py +0 -0
  86. appium/options/android/espresso/activity_options_option.py +41 -0
  87. appium/options/android/espresso/app_locale_option.py +44 -0
  88. appium/options/android/espresso/base.py +221 -0
  89. appium/options/android/espresso/espresso_build_config_option.py +46 -0
  90. appium/options/android/espresso/espresso_server_launch_timeout_option.py +43 -0
  91. appium/options/android/espresso/force_espresso_rebuild_option.py +41 -0
  92. appium/options/android/espresso/intent_options_option.py +41 -0
  93. appium/options/android/espresso/show_gradle_log_option.py +39 -0
  94. appium/options/android/uiautomator2/__init__.py +0 -0
  95. appium/options/android/uiautomator2/base.py +221 -0
  96. appium/options/android/uiautomator2/disable_window_animation_option.py +40 -0
  97. appium/options/android/uiautomator2/mjpeg_server_port_option.py +41 -0
  98. appium/options/android/uiautomator2/skip_device_initialization_option.py +40 -0
  99. appium/options/android/uiautomator2/skip_server_installation_option.py +44 -0
  100. appium/options/android/uiautomator2/uiautomator2_server_install_timeout_option.py +44 -0
  101. appium/options/android/uiautomator2/uiautomator2_server_launch_timeout_option.py +44 -0
  102. appium/options/android/uiautomator2/uiautomator2_server_read_timeout_option.py +46 -0
  103. appium/options/common/__init__.py +1 -0
  104. appium/options/common/app_option.py +41 -0
  105. appium/options/common/auto_web_view_option.py +40 -0
  106. appium/options/common/automation_name_option.py +38 -0
  107. appium/options/common/base.py +125 -0
  108. appium/options/common/browser_name_option.py +38 -0
  109. appium/options/common/bundle_id_option.py +38 -0
  110. appium/options/common/clear_system_files_option.py +38 -0
  111. appium/options/common/device_name_option.py +38 -0
  112. appium/options/common/enable_performance_logging_option.py +38 -0
  113. appium/options/common/event_timings_option.py +40 -0
  114. appium/options/common/full_reset_option.py +38 -0
  115. appium/options/common/is_headless_option.py +39 -0
  116. appium/options/common/language_option.py +38 -0
  117. appium/options/common/locale_option.py +38 -0
  118. appium/options/common/new_command_timeout_option.py +41 -0
  119. appium/options/common/no_reset_option.py +38 -0
  120. appium/options/common/orientation_option.py +40 -0
  121. appium/options/common/other_apps_option.py +39 -0
  122. appium/options/common/platform_version_option.py +40 -0
  123. appium/options/common/postrun_option.py +39 -0
  124. appium/options/common/prerun_option.py +40 -0
  125. appium/options/common/print_page_source_on_find_failure_option.py +40 -0
  126. appium/options/common/skip_log_capture_option.py +38 -0
  127. appium/options/common/supports_capabilities.py +26 -0
  128. appium/options/common/system_host_option.py +38 -0
  129. appium/options/common/system_port_option.py +38 -0
  130. appium/options/common/udid_option.py +38 -0
  131. appium/options/flutter_integration/__init__.py +15 -0
  132. appium/options/flutter_integration/base.py +39 -0
  133. appium/options/flutter_integration/flutter_element_wait_timeout_option.py +50 -0
  134. appium/options/flutter_integration/flutter_enable_mock_camera_option.py +44 -0
  135. appium/options/flutter_integration/flutter_server_launch_timeout_option.py +51 -0
  136. appium/options/flutter_integration/flutter_system_port_option.py +45 -0
  137. appium/options/gecko/__init__.py +1 -0
  138. appium/options/gecko/android_storage_option.py +39 -0
  139. appium/options/gecko/base.py +51 -0
  140. appium/options/gecko/firefox_options_option.py +38 -0
  141. appium/options/gecko/marionette_port_option.py +43 -0
  142. appium/options/gecko/verbosity_option.py +40 -0
  143. appium/options/ios/__init__.py +2 -0
  144. appium/options/ios/safari/__init__.py +0 -0
  145. appium/options/ios/safari/automatic_inspection_option.py +41 -0
  146. appium/options/ios/safari/automatic_profiling_option.py +41 -0
  147. appium/options/ios/safari/base.py +51 -0
  148. appium/options/ios/safari/device_name_option.py +43 -0
  149. appium/options/ios/safari/device_type_option.py +41 -0
  150. appium/options/ios/safari/device_udid_option.py +43 -0
  151. appium/options/ios/safari/platform_build_version_option.py +41 -0
  152. appium/options/ios/safari/platform_version_option.py +41 -0
  153. appium/options/ios/safari/use_simulator_option.py +41 -0
  154. appium/options/ios/safari/webkit_webrtc_option.py +52 -0
  155. appium/options/ios/xcuitest/__init__.py +0 -0
  156. appium/options/ios/xcuitest/app/__init__.py +0 -0
  157. appium/options/ios/xcuitest/app/app_install_strategy_option.py +46 -0
  158. appium/options/ios/xcuitest/app/app_push_timeout_option.py +42 -0
  159. appium/options/ios/xcuitest/app/localizable_strings_dir_option.py +39 -0
  160. appium/options/ios/xcuitest/base.py +223 -0
  161. appium/options/ios/xcuitest/general/__init__.py +0 -0
  162. appium/options/ios/xcuitest/general/include_device_caps_to_session_info_option.py +41 -0
  163. appium/options/ios/xcuitest/general/reset_location_service_option.py +39 -0
  164. appium/options/ios/xcuitest/other/__init__.py +0 -0
  165. appium/options/ios/xcuitest/other/command_timeouts_option.py +57 -0
  166. appium/options/ios/xcuitest/other/launch_with_idb_option.py +42 -0
  167. appium/options/ios/xcuitest/other/show_ios_log_option.py +39 -0
  168. appium/options/ios/xcuitest/other/use_json_source_option.py +39 -0
  169. appium/options/ios/xcuitest/simulator/__init__.py +0 -0
  170. appium/options/ios/xcuitest/simulator/calendar_access_authorized_option.py +41 -0
  171. appium/options/ios/xcuitest/simulator/calendar_format_option.py +38 -0
  172. appium/options/ios/xcuitest/simulator/connect_hardware_keyboard_option.py +43 -0
  173. appium/options/ios/xcuitest/simulator/custom_ssl_cert_option.py +39 -0
  174. appium/options/ios/xcuitest/simulator/enforce_fresh_simulator_creation_option.py +39 -0
  175. appium/options/ios/xcuitest/simulator/force_simulator_software_keyboard_presence_option.py +45 -0
  176. appium/options/ios/xcuitest/simulator/ios_simulator_logs_predicate_option.py +38 -0
  177. appium/options/ios/xcuitest/simulator/keep_key_chains_option.py +39 -0
  178. appium/options/ios/xcuitest/simulator/keychains_exclude_patterns_option.py +44 -0
  179. appium/options/ios/xcuitest/simulator/permissions_option.py +50 -0
  180. appium/options/ios/xcuitest/simulator/reduce_motion_option.py +40 -0
  181. appium/options/ios/xcuitest/simulator/reset_on_session_start_only_option.py +41 -0
  182. appium/options/ios/xcuitest/simulator/scale_factor_option.py +44 -0
  183. appium/options/ios/xcuitest/simulator/shutdown_other_simulators_option.py +44 -0
  184. appium/options/ios/xcuitest/simulator/simulator_devices_set_path_option.py +41 -0
  185. appium/options/ios/xcuitest/simulator/simulator_pasteboard_automatic_sync_option.py +42 -0
  186. appium/options/ios/xcuitest/simulator/simulator_startup_timeout_option.py +46 -0
  187. appium/options/ios/xcuitest/simulator/simulator_trace_pointer_option.py +41 -0
  188. appium/options/ios/xcuitest/simulator/simulator_window_center_option.py +41 -0
  189. appium/options/ios/xcuitest/wda/__init__.py +0 -0
  190. appium/options/ios/xcuitest/wda/allow_provisioning_device_regitration_option.py +40 -0
  191. appium/options/ios/xcuitest/wda/auto_accept_alerts_option.py +39 -0
  192. appium/options/ios/xcuitest/wda/auto_disimiss_alerts_option.py +39 -0
  193. appium/options/ios/xcuitest/wda/derived_data_path_option.py +41 -0
  194. appium/options/ios/xcuitest/wda/disable_automatic_screenshots_option.py +40 -0
  195. appium/options/ios/xcuitest/wda/force_app_launch_option.py +42 -0
  196. appium/options/ios/xcuitest/wda/keychain_password_option.py +39 -0
  197. appium/options/ios/xcuitest/wda/keychain_path_option.py +39 -0
  198. appium/options/ios/xcuitest/wda/max_typing_frequency_option.py +40 -0
  199. appium/options/ios/xcuitest/wda/mjpeg_server_port_option.py +42 -0
  200. appium/options/ios/xcuitest/wda/process_arguments_option.py +42 -0
  201. appium/options/ios/xcuitest/wda/result_bundle_path_option.py +42 -0
  202. appium/options/ios/xcuitest/wda/screenshot_quality_option.py +42 -0
  203. appium/options/ios/xcuitest/wda/should_terminate_app_option.py +42 -0
  204. appium/options/ios/xcuitest/wda/should_use_singleton_test_manager_option.py +39 -0
  205. appium/options/ios/xcuitest/wda/show_xcode_log_option.py +40 -0
  206. appium/options/ios/xcuitest/wda/simple_is_visible_check_option.py +42 -0
  207. appium/options/ios/xcuitest/wda/updated_wda_bundle_id_option.py +39 -0
  208. appium/options/ios/xcuitest/wda/use_native_caching_strategy_option.py +41 -0
  209. appium/options/ios/xcuitest/wda/use_new_wda_option.py +51 -0
  210. appium/options/ios/xcuitest/wda/use_prebuilt_wda_option.py +39 -0
  211. appium/options/ios/xcuitest/wda/use_simple_build_test_option.py +40 -0
  212. appium/options/ios/xcuitest/wda/use_xctestrun_file_option.py +49 -0
  213. appium/options/ios/xcuitest/wda/wait_for_idle_timeout_option.py +45 -0
  214. appium/options/ios/xcuitest/wda/wait_for_quiescence_option.py +42 -0
  215. appium/options/ios/xcuitest/wda/wda_base_url_option.py +41 -0
  216. appium/options/ios/xcuitest/wda/wda_connection_timeout_option.py +43 -0
  217. appium/options/ios/xcuitest/wda/wda_eventloop_idle_delay_option.py +46 -0
  218. appium/options/ios/xcuitest/wda/wda_launch_timeout_option.py +41 -0
  219. appium/options/ios/xcuitest/wda/wda_local_port_option.py +41 -0
  220. appium/options/ios/xcuitest/wda/wda_startup_retries_option.py +39 -0
  221. appium/options/ios/xcuitest/wda/wda_startup_retry_interval_option.py +43 -0
  222. appium/options/ios/xcuitest/wda/web_driver_agent_url_option.py +39 -0
  223. appium/options/ios/xcuitest/wda/xcode_org_id_option.py +39 -0
  224. appium/options/ios/xcuitest/wda/xcode_signing_id_option.py +39 -0
  225. appium/options/ios/xcuitest/webview/__init__.py +0 -0
  226. appium/options/ios/xcuitest/webview/absolute_web_locations_option.py +42 -0
  227. appium/options/ios/xcuitest/webview/additional_webview_bundle_ids_option.py +40 -0
  228. appium/options/ios/xcuitest/webview/enable_async_execute_from_https_option.py +39 -0
  229. appium/options/ios/xcuitest/webview/full_context_list_option.py +42 -0
  230. appium/options/ios/xcuitest/webview/include_safari_in_webviews_option.py +41 -0
  231. appium/options/ios/xcuitest/webview/native_web_tap_option.py +40 -0
  232. appium/options/ios/xcuitest/webview/safari_garbage_collect_option.py +39 -0
  233. appium/options/ios/xcuitest/webview/safari_ignore_fraud_warning_option.py +39 -0
  234. appium/options/ios/xcuitest/webview/safari_ignore_web_hostnames_option.py +42 -0
  235. appium/options/ios/xcuitest/webview/safari_initial_url_option.py +38 -0
  236. appium/options/ios/xcuitest/webview/safari_log_all_communication_hex_dump_option.py +43 -0
  237. appium/options/ios/xcuitest/webview/safari_log_all_communication_option.py +40 -0
  238. appium/options/ios/xcuitest/webview/safari_open_links_in_background_option.py +39 -0
  239. appium/options/ios/xcuitest/webview/safari_socket_chunk_size_option.py +41 -0
  240. appium/options/ios/xcuitest/webview/safari_web_inspector_max_frame_length_option.py +41 -0
  241. appium/options/ios/xcuitest/webview/webkit_response_timeout_option.py +43 -0
  242. appium/options/ios/xcuitest/webview/webview_connect_retries_option.py +40 -0
  243. appium/options/ios/xcuitest/webview/webview_connect_timeout_option.py +43 -0
  244. appium/options/mac/__init__.py +1 -0
  245. appium/options/mac/mac2/__init__.py +0 -0
  246. appium/options/mac/mac2/app_path_option.py +39 -0
  247. appium/options/mac/mac2/arguments_option.py +39 -0
  248. appium/options/mac/mac2/base.py +113 -0
  249. appium/options/mac/mac2/bootstrap_root_option.py +41 -0
  250. appium/options/mac/mac2/environment_option.py +41 -0
  251. appium/options/mac/mac2/server_startup_timeout_option.py +44 -0
  252. appium/options/mac/mac2/show_server_logs_option.py +39 -0
  253. appium/options/mac/mac2/skip_app_kill_option.py +40 -0
  254. appium/options/mac/mac2/web_driver_agent_mac_url_option.py +39 -0
  255. appium/options/windows/__init__.py +1 -0
  256. appium/options/windows/windows/__init__.py +0 -0
  257. appium/options/windows/windows/app_arguments_option.py +40 -0
  258. appium/options/windows/windows/app_top_level_window_option.py +40 -0
  259. appium/options/windows/windows/app_working_dir_option.py +40 -0
  260. appium/options/windows/windows/base.py +97 -0
  261. appium/options/windows/windows/create_session_timeout_option.py +45 -0
  262. appium/options/windows/windows/expreimental_web_driver_option.py +39 -0
  263. appium/options/windows/windows/wait_for_app_launch_option.py +43 -0
  264. appium/protocols/__init__.py +13 -0
  265. appium/protocols/webdriver/__init__.py +13 -0
  266. appium/protocols/webdriver/can_execute_commands.py +23 -0
  267. appium/protocols/webdriver/can_execute_scripts.py +27 -0
  268. appium/protocols/webdriver/can_find_elements.py +32 -0
  269. appium/protocols/webdriver/can_remember_extension_presence.py +23 -0
  270. appium/py.typed +0 -0
  271. appium/version.py +22 -0
  272. appium/webdriver/__init__.py +20 -0
  273. appium/webdriver/appium_connection.py +65 -0
  274. appium/webdriver/appium_service.py +330 -0
  275. appium/webdriver/applicationstate.py +21 -0
  276. appium/webdriver/client_config.py +38 -0
  277. appium/webdriver/clipboard_content_type.py +19 -0
  278. appium/webdriver/command_method.py +27 -0
  279. appium/webdriver/common/__init__.py +17 -0
  280. appium/webdriver/common/appiumby.py +54 -0
  281. appium/webdriver/connectiontype.py +42 -0
  282. appium/webdriver/errorhandler.py +125 -0
  283. appium/webdriver/extensions/__init__.py +13 -0
  284. appium/webdriver/extensions/action_helpers.py +188 -0
  285. appium/webdriver/extensions/android/__init__.py +0 -0
  286. appium/webdriver/extensions/android/activities.py +65 -0
  287. appium/webdriver/extensions/android/common.py +59 -0
  288. appium/webdriver/extensions/android/display.py +48 -0
  289. appium/webdriver/extensions/android/gsm.py +147 -0
  290. appium/webdriver/extensions/android/nativekey.py +1119 -0
  291. appium/webdriver/extensions/android/network.py +175 -0
  292. appium/webdriver/extensions/android/performance.py +85 -0
  293. appium/webdriver/extensions/android/power.py +80 -0
  294. appium/webdriver/extensions/android/sms.py +50 -0
  295. appium/webdriver/extensions/android/system_bars.py +58 -0
  296. appium/webdriver/extensions/applications.py +274 -0
  297. appium/webdriver/extensions/clipboard.py +107 -0
  298. appium/webdriver/extensions/context.py +63 -0
  299. appium/webdriver/extensions/device_time.py +75 -0
  300. appium/webdriver/extensions/execute_driver.py +60 -0
  301. appium/webdriver/extensions/execute_mobile_command.py +62 -0
  302. appium/webdriver/extensions/flutter_integration/__init__.py +13 -0
  303. appium/webdriver/extensions/flutter_integration/flutter_commands.py +296 -0
  304. appium/webdriver/extensions/flutter_integration/flutter_finder.py +55 -0
  305. appium/webdriver/extensions/flutter_integration/scroll_directions.py +6 -0
  306. appium/webdriver/extensions/hw_actions.py +149 -0
  307. appium/webdriver/extensions/images_comparison.py +132 -0
  308. appium/webdriver/extensions/keyboard.py +168 -0
  309. appium/webdriver/extensions/location.py +98 -0
  310. appium/webdriver/extensions/log_event.py +68 -0
  311. appium/webdriver/extensions/logs.py +53 -0
  312. appium/webdriver/extensions/remote_fs.py +110 -0
  313. appium/webdriver/extensions/screen_record.py +207 -0
  314. appium/webdriver/extensions/session.py +41 -0
  315. appium/webdriver/extensions/settings.py +49 -0
  316. appium/webdriver/locator_converter.py +29 -0
  317. appium/webdriver/mobilecommand.py +104 -0
  318. appium/webdriver/switch_to.py +35 -0
  319. appium/webdriver/webdriver.py +495 -0
  320. appium/webdriver/webelement.py +130 -0
  321. appium_python_client-5.2.0.dist-info/METADATA +573 -0
  322. appium_python_client-5.2.0.dist-info/RECORD +324 -0
  323. appium_python_client-5.2.0.dist-info/WHEEL +4 -0
  324. appium_python_client-5.2.0.dist-info/licenses/LICENSE +201 -0
@@ -0,0 +1,168 @@
1
+ #!/usr/bin/env python
2
+
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from typing import Dict, Optional
16
+
17
+ from selenium.common.exceptions import UnknownMethodException
18
+ from typing_extensions import Self
19
+
20
+ from appium.protocols.webdriver.can_execute_commands import CanExecuteCommands
21
+ from appium.protocols.webdriver.can_execute_scripts import CanExecuteScripts
22
+ from appium.protocols.webdriver.can_remember_extension_presence import CanRememberExtensionPresence
23
+
24
+ from ..mobilecommand import MobileCommand as Command
25
+
26
+
27
+ class Keyboard(CanExecuteCommands, CanExecuteScripts, CanRememberExtensionPresence):
28
+ def hide_keyboard(self, key_name: Optional[str] = None, key: Optional[str] = None, strategy: Optional[str] = None) -> Self:
29
+ """Hides the software keyboard on the device.
30
+
31
+ In iOS, use `key_name` to press
32
+ a particular key, or `strategy`. In Android, no parameters are used.
33
+
34
+ Args:
35
+ key_name: key to press
36
+ key:
37
+ strategy: strategy for closing the keyboard (e.g., `tapOutside`)
38
+
39
+ Returns:
40
+ Union['WebDriver', 'Keyboard']: Self instance
41
+ """
42
+ ext_name = 'mobile: hideKeyboard'
43
+ try:
44
+ self.assert_extension_exists(ext_name).execute_script(
45
+ ext_name, {**({'keys': [key or key_name]} if key or key_name else {})}
46
+ )
47
+ except UnknownMethodException:
48
+ # TODO: Remove the fallback
49
+ data: Dict[str, Optional[str]] = {}
50
+ if key_name is not None:
51
+ data['keyName'] = key_name
52
+ elif key is not None:
53
+ data['key'] = key
54
+ elif strategy is None:
55
+ strategy = 'tapOutside'
56
+ data['strategy'] = strategy
57
+ self.mark_extension_absence(ext_name).execute(Command.HIDE_KEYBOARD, data)
58
+ return self
59
+
60
+ def is_keyboard_shown(self) -> bool:
61
+ """Attempts to detect whether a software keyboard is present
62
+
63
+ Returns:
64
+ `True` if keyboard is shown
65
+ """
66
+ ext_name = 'mobile: isKeyboardShown'
67
+ try:
68
+ return self.assert_extension_exists(ext_name).execute_script(ext_name)
69
+ except UnknownMethodException:
70
+ return self.mark_extension_absence(ext_name).execute(Command.IS_KEYBOARD_SHOWN)['value']
71
+
72
+ def keyevent(self, keycode: int, metastate: Optional[int] = None) -> Self:
73
+ """Sends a keycode to the device.
74
+
75
+ Android only.
76
+ Possible keycodes can be found in http://developer.android.com/reference/android/view/KeyEvent.html.
77
+
78
+ Args:
79
+ keycode: the keycode to be sent to the device
80
+ metastate: meta information about the keycode being sent
81
+
82
+ Returns:
83
+ Union['WebDriver', 'Keyboard']: Self instance
84
+ """
85
+ return self.press_keycode(keycode=keycode, metastate=metastate)
86
+
87
+ def press_keycode(self, keycode: int, metastate: Optional[int] = None, flags: Optional[int] = None) -> Self:
88
+ """Sends a keycode to the device.
89
+
90
+ Android only. Possible keycodes can be found
91
+ in http://developer.android.com/reference/android/view/KeyEvent.html.
92
+
93
+ Args:
94
+ keycode: the keycode to be sent to the device
95
+ metastate: meta information about the keycode being sent
96
+ flags: the set of key event flags
97
+
98
+ Returns:
99
+ Union['WebDriver', 'Keyboard']: Self instance
100
+ """
101
+ ext_name = 'mobile: pressKey'
102
+ args = {'keycode': keycode}
103
+ if metastate is not None:
104
+ args['metastate'] = metastate
105
+ if flags is not None:
106
+ args['flags'] = flags
107
+ try:
108
+ self.assert_extension_exists(ext_name).execute_script(ext_name, args)
109
+ except UnknownMethodException:
110
+ # TODO: Remove the fallback
111
+ self.mark_extension_absence(ext_name).execute(Command.PRESS_KEYCODE, args)
112
+ return self
113
+
114
+ def long_press_keycode(self, keycode: int, metastate: Optional[int] = None, flags: Optional[int] = None) -> Self:
115
+ """Sends a long press of keycode to the device.
116
+
117
+ Android only. Possible keycodes can be found in
118
+ http://developer.android.com/reference/android/view/KeyEvent.html.
119
+
120
+ Args:
121
+ keycode: the keycode to be sent to the device
122
+ metastate: meta information about the keycode being sent
123
+ flags: the set of key event flags
124
+
125
+ Returns:
126
+ Union['WebDriver', 'Keyboard']: Self instance
127
+ """
128
+ ext_name = 'mobile: pressKey'
129
+ args = {'keycode': keycode}
130
+ if metastate is not None:
131
+ args['metastate'] = metastate
132
+ if flags is not None:
133
+ args['flags'] = flags
134
+ try:
135
+ self.assert_extension_exists(ext_name).execute_script(
136
+ ext_name,
137
+ {
138
+ **args,
139
+ 'isLongPress': True,
140
+ },
141
+ )
142
+ except UnknownMethodException:
143
+ # TODO: Remove the fallback
144
+ self.mark_extension_absence(ext_name).execute(Command.LONG_PRESS_KEYCODE, args)
145
+ return self
146
+
147
+ def _add_commands(self) -> None:
148
+ self.command_executor.add_command(
149
+ Command.HIDE_KEYBOARD,
150
+ 'POST',
151
+ '/session/$sessionId/appium/device/hide_keyboard',
152
+ )
153
+ self.command_executor.add_command(
154
+ Command.IS_KEYBOARD_SHOWN,
155
+ 'GET',
156
+ '/session/$sessionId/appium/device/is_keyboard_shown',
157
+ )
158
+ self.command_executor.add_command(Command.KEY_EVENT, 'POST', '/session/$sessionId/appium/device/keyevent')
159
+ self.command_executor.add_command(
160
+ Command.PRESS_KEYCODE,
161
+ 'POST',
162
+ '/session/$sessionId/appium/device/press_keycode',
163
+ )
164
+ self.command_executor.add_command(
165
+ Command.LONG_PRESS_KEYCODE,
166
+ 'POST',
167
+ '/session/$sessionId/appium/device/long_press_keycode',
168
+ )
@@ -0,0 +1,98 @@
1
+ #!/usr/bin/env python
2
+
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from typing import Dict, Union
16
+
17
+ from selenium.common.exceptions import UnknownMethodException
18
+ from typing_extensions import Self
19
+
20
+ from appium.protocols.webdriver.can_execute_commands import CanExecuteCommands
21
+ from appium.protocols.webdriver.can_execute_scripts import CanExecuteScripts
22
+
23
+ from ..mobilecommand import MobileCommand as Command
24
+
25
+
26
+ class Location(CanExecuteCommands, CanExecuteScripts):
27
+ def toggle_location_services(self) -> Self:
28
+ """Toggle the location services on the device.
29
+ This API only reliably since Android 12 (API level 31)
30
+
31
+ Android only.
32
+
33
+ Returns:
34
+ Union['WebDriver', 'Location']: Self instance
35
+ """
36
+ try:
37
+ self.execute_script('mobile: toggleGps')
38
+ except UnknownMethodException:
39
+ # TODO: Remove the fallback
40
+ self.execute(Command.TOGGLE_LOCATION_SERVICES)
41
+ return self
42
+
43
+ def set_location(
44
+ self,
45
+ latitude: Union[float, str],
46
+ longitude: Union[float, str],
47
+ altitude: Union[float, str, None] = None,
48
+ speed: Union[float, str, None] = None,
49
+ satellites: Union[float, str, None] = None,
50
+ ) -> Self:
51
+ """Set the location of the device
52
+
53
+ Args:
54
+ latitude: String or numeric value between -90.0 and 90.00
55
+ longitude: String or numeric value between -180.0 and 180.0
56
+ altitude: String or numeric value (Android real device only)
57
+ speed: String or numeric value larger than 0.0 (Android real devices only)
58
+ satellites: String or numeric value of active GPS satellites in range 1..12. (Android emulators only)
59
+
60
+ Returns:
61
+ Union['WebDriver', 'Location']: Self instance
62
+ """
63
+ data = {
64
+ 'location': {
65
+ 'latitude': latitude,
66
+ 'longitude': longitude,
67
+ }
68
+ }
69
+ if altitude is not None:
70
+ data['location']['altitude'] = altitude
71
+ if speed is not None:
72
+ data['location']['speed'] = speed
73
+ if satellites is not None:
74
+ data['location']['satellites'] = satellites
75
+ self.execute(Command.SET_LOCATION, data)
76
+ return self
77
+
78
+ @property
79
+ def location(self) -> Dict[str, float]:
80
+ """Retrieves the current location
81
+
82
+ Returns:
83
+ A dictionary whose keys are
84
+ - latitude (float)
85
+ - longitude (float)
86
+ - altitude (float)
87
+ """
88
+ return self.execute(Command.GET_LOCATION)['value']
89
+
90
+ def _add_commands(self) -> None:
91
+ """Add location endpoints. They are not int w3c spec."""
92
+ self.command_executor.add_command(
93
+ Command.TOGGLE_LOCATION_SERVICES,
94
+ 'POST',
95
+ '/session/$sessionId/appium/device/toggle_location_services',
96
+ )
97
+ self.command_executor.add_command(Command.GET_LOCATION, 'GET', '/session/$sessionId/location')
98
+ self.command_executor.add_command(Command.SET_LOCATION, 'POST', '/session/$sessionId/location')
@@ -0,0 +1,68 @@
1
+ #!/usr/bin/env python
2
+
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from typing import Dict, List, Union
16
+
17
+ from typing_extensions import Self
18
+
19
+ from appium.protocols.webdriver.can_execute_commands import CanExecuteCommands
20
+
21
+ from ..mobilecommand import MobileCommand as Command
22
+
23
+
24
+ class LogEvent(CanExecuteCommands):
25
+ def get_events(self, type: Union[List[str], None] = None) -> Dict[str, Union[str, int]]:
26
+ """Retrieves events information from the current session
27
+ (Since Appium 1.16.0)
28
+
29
+ Args:
30
+ type: The event type to filter with
31
+
32
+ Usage:
33
+ | events = driver.get_events()
34
+ | events = driver.get_events(['appium:funEvent'])
35
+
36
+ Returns:
37
+ `dict`: A dictionary of events timing information containing the following entries
38
+ | commands: (`list` of `dict`) List of dictionaries containing the following entries
39
+ | cmd: The command name that has been sent to the appium server
40
+ | startTime: Received time
41
+ | endTime: Response time
42
+ """
43
+ data = {}
44
+ if type is not None:
45
+ data['type'] = type
46
+ return self.execute(Command.GET_EVENTS, data)['value']
47
+
48
+ def log_event(self, vendor: str, event: str) -> Self:
49
+ """Log a custom event on the Appium server.
50
+ (Since Appium 1.16.0)
51
+
52
+ Args:
53
+ vendor: The vendor to log
54
+ event: The event to log
55
+
56
+ Usage:
57
+ driver.log_event('appium', 'funEvent')
58
+
59
+ Returns:
60
+ Union['WebDriver', 'LogEvent']: Self instance
61
+ """
62
+ data = {'vendor': vendor, 'event': event}
63
+ self.execute(Command.LOG_EVENT, data)
64
+ return self
65
+
66
+ def _add_commands(self) -> None:
67
+ self.command_executor.add_command(Command.GET_EVENTS, 'POST', '/session/$sessionId/appium/events')
68
+ self.command_executor.add_command(Command.LOG_EVENT, 'POST', '/session/$sessionId/appium/log_event')
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/env python
2
+
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from typing import Any, Dict, List
16
+
17
+ from appium.protocols.webdriver.can_execute_commands import CanExecuteCommands
18
+
19
+ from ..mobilecommand import MobileCommand as Command
20
+
21
+
22
+ class Logs(CanExecuteCommands):
23
+ @property
24
+ def log_types(self) -> List[str]:
25
+ """Gets a list of the available log types. This only works with w3c
26
+ compliant browsers.
27
+
28
+ Example:
29
+ .. code-block:: python
30
+
31
+ driver.log_types
32
+ """
33
+ return self.execute(Command.GET_AVAILABLE_LOG_TYPES)['value']
34
+
35
+ def get_log(self, log_type: str) -> List[Dict[str, Any]]:
36
+ """Gets the log for a given log type.
37
+
38
+ Args:
39
+ log_type: Type of log that which will be returned
40
+
41
+ Example:
42
+ .. code-block:: python
43
+
44
+ driver.get_log('browser')
45
+ driver.get_log('driver')
46
+ driver.get_log('client')
47
+ driver.get_log('server')
48
+ """
49
+ return self.execute(Command.GET_LOG, {'type': log_type})['value']
50
+
51
+ def _add_commands(self) -> None:
52
+ self.command_executor.add_command(Command.GET_LOG, 'POST', '/session/$sessionId/se/log')
53
+ self.command_executor.add_command(Command.GET_AVAILABLE_LOG_TYPES, 'GET', '/session/$sessionId/se/log/types')
@@ -0,0 +1,110 @@
1
+ #!/usr/bin/env python
2
+
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ import base64
16
+ from typing import Optional
17
+
18
+ from selenium.common.exceptions import InvalidArgumentException, UnknownMethodException
19
+ from typing_extensions import Self
20
+
21
+ from appium.protocols.webdriver.can_execute_commands import CanExecuteCommands
22
+ from appium.protocols.webdriver.can_execute_scripts import CanExecuteScripts
23
+ from appium.protocols.webdriver.can_remember_extension_presence import CanRememberExtensionPresence
24
+
25
+ from ..mobilecommand import MobileCommand as Command
26
+
27
+
28
+ class RemoteFS(CanExecuteCommands, CanExecuteScripts, CanRememberExtensionPresence):
29
+ def pull_file(self, path: str) -> str:
30
+ """Retrieves the file at `path`.
31
+
32
+ Args:
33
+ path: the path to the file on the device
34
+
35
+ Returns:
36
+ The file's contents encoded as Base64.
37
+ """
38
+ ext_name = 'mobile: pullFile'
39
+ try:
40
+ return self.assert_extension_exists(ext_name).execute_script(ext_name, {'remotePath': path})
41
+ except UnknownMethodException:
42
+ # TODO: Remove the fallback
43
+ return self.mark_extension_absence(ext_name).execute(Command.PULL_FILE, {'path': path})['value']
44
+
45
+ def pull_folder(self, path: str) -> str:
46
+ """Retrieves a folder at `path`.
47
+
48
+ Args:
49
+ path: the path to the folder on the device
50
+
51
+ Returns:
52
+ The folder's contents zipped and encoded as Base64.
53
+ """
54
+ ext_name = 'mobile: pullFolder'
55
+ try:
56
+ return self.assert_extension_exists(ext_name).execute_script(ext_name, {'remotePath': path})
57
+ except UnknownMethodException:
58
+ # TODO: Remove the fallback
59
+ return self.mark_extension_absence(ext_name).execute(Command.PULL_FOLDER, {'path': path})['value']
60
+
61
+ def push_file(self, destination_path: str, base64data: Optional[str] = None, source_path: Optional[str] = None) -> Self:
62
+ """Puts the data from the file at `source_path`, encoded as Base64, in the file specified as `path`.
63
+
64
+ Specify either `base64data` or `source_path`, if both specified default to `source_path`
65
+
66
+ Args:
67
+ destination_path: the location on the device/simulator where the local file contents should be saved
68
+ base64data: file contents, encoded as Base64, to be written
69
+ to the file on the device/simulator
70
+ source_path: local file path for the file to be loaded on device
71
+
72
+ Returns:
73
+ Union['WebDriver', 'RemoteFS']: Self instance
74
+ """
75
+ if source_path is None and base64data is None:
76
+ raise InvalidArgumentException('Must either pass base64 data or a local file path')
77
+
78
+ if source_path is not None:
79
+ try:
80
+ with open(source_path, 'rb') as f:
81
+ file_data = f.read()
82
+ except IOError as e:
83
+ message = f'source_path "{source_path}" could not be found. Are you sure the file exists?'
84
+ raise InvalidArgumentException(message) from e
85
+ base64data = base64.b64encode(file_data).decode('utf-8')
86
+
87
+ ext_name = 'mobile: pushFile'
88
+ try:
89
+ self.assert_extension_exists(ext_name).execute_script(
90
+ ext_name,
91
+ {
92
+ 'remotePath': destination_path,
93
+ 'payload': base64data,
94
+ },
95
+ )
96
+ except UnknownMethodException:
97
+ # TODO: Remove the fallback
98
+ self.mark_extension_absence(ext_name).execute(
99
+ Command.PUSH_FILE,
100
+ {
101
+ 'path': destination_path,
102
+ 'data': base64data,
103
+ },
104
+ )
105
+ return self
106
+
107
+ def _add_commands(self) -> None:
108
+ self.command_executor.add_command(Command.PULL_FILE, 'POST', '/session/$sessionId/appium/device/pull_file')
109
+ self.command_executor.add_command(Command.PULL_FOLDER, 'POST', '/session/$sessionId/appium/device/pull_folder')
110
+ self.command_executor.add_command(Command.PUSH_FILE, 'POST', '/session/$sessionId/appium/device/push_file')