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.
- appium/__init__.py +17 -0
- appium/common/__init__.py +17 -0
- appium/common/exceptions.py +26 -0
- appium/common/helper.py +42 -0
- appium/common/logger.py +28 -0
- appium/options/__init__.py +0 -0
- appium/options/android/__init__.py +2 -0
- appium/options/android/common/__init__.py +0 -0
- appium/options/android/common/adb/__init__.py +0 -0
- appium/options/android/common/adb/adb_exec_timeout_option.py +41 -0
- appium/options/android/common/adb/adb_port_option.py +38 -0
- appium/options/android/common/adb/allow_delay_adb_option.py +39 -0
- appium/options/android/common/adb/build_tools_version_option.py +42 -0
- appium/options/android/common/adb/clear_device_logs_on_start_option.py +40 -0
- appium/options/android/common/adb/ignore_hidden_api_policy_error_option.py +40 -0
- appium/options/android/common/adb/logcat_filter_specs_option.py +42 -0
- appium/options/android/common/adb/logcat_format_option.py +39 -0
- appium/options/android/common/adb/mock_location_app_option.py +42 -0
- appium/options/android/common/adb/remote_adb_host_option.py +39 -0
- appium/options/android/common/adb/skip_logcat_capture_option.py +40 -0
- appium/options/android/common/adb/suppress_kill_server_option.py +39 -0
- appium/options/android/common/app/__init__.py +0 -0
- appium/options/android/common/app/allow_test_packages_option.py +40 -0
- appium/options/android/common/app/android_install_timeout_option.py +43 -0
- appium/options/android/common/app/app_activity_option.py +39 -0
- appium/options/android/common/app/app_package_option.py +39 -0
- appium/options/android/common/app/app_wait_activity_option.py +40 -0
- appium/options/android/common/app/app_wait_duration_option.py +41 -0
- appium/options/android/common/app/app_wait_for_launch_option.py +41 -0
- appium/options/android/common/app/app_wait_package_option.py +40 -0
- appium/options/android/common/app/auto_grant_premissions_option.py +40 -0
- appium/options/android/common/app/enforce_app_install_option.py +40 -0
- appium/options/android/common/app/intent_action_option.py +40 -0
- appium/options/android/common/app/intent_category_option.py +40 -0
- appium/options/android/common/app/intent_flags_option.py +40 -0
- appium/options/android/common/app/optional_intent_arguments_option.py +40 -0
- appium/options/android/common/app/remote_apps_cache_limit_option.py +42 -0
- appium/options/android/common/app/uninstall_other_packages_option.py +39 -0
- appium/options/android/common/avd/__init__.py +0 -0
- appium/options/android/common/avd/avd_args_option.py +38 -0
- appium/options/android/common/avd/avd_env_option.py +38 -0
- appium/options/android/common/avd/avd_launch_timeout_option.py +41 -0
- appium/options/android/common/avd/avd_option.py +41 -0
- appium/options/android/common/avd/avd_ready_timeout_option.py +41 -0
- appium/options/android/common/avd/gps_enabled_option.py +39 -0
- appium/options/android/common/avd/network_speed_option.py +41 -0
- appium/options/android/common/context/__init__.py +0 -0
- appium/options/android/common/context/auto_webview_timeout_option.py +41 -0
- appium/options/android/common/context/chrome_logging_prefs_option.py +41 -0
- appium/options/android/common/context/chrome_options_option.py +40 -0
- appium/options/android/common/context/chromedriver_args_option.py +41 -0
- appium/options/android/common/context/chromedriver_chrome_mapping_file_option.py +43 -0
- appium/options/android/common/context/chromedriver_disable_build_check_option.py +41 -0
- appium/options/android/common/context/chromedriver_executable_dir_option.py +43 -0
- appium/options/android/common/context/chromedriver_executable_option.py +38 -0
- appium/options/android/common/context/chromedriver_port_option.py +39 -0
- appium/options/android/common/context/chromedriver_ports_option.py +39 -0
- appium/options/android/common/context/chromedriver_use_system_executable_option.py +40 -0
- appium/options/android/common/context/ensure_webviews_have_pages_option.py +40 -0
- appium/options/android/common/context/extract_chrome_android_package_from_context_name_option.py +40 -0
- appium/options/android/common/context/native_web_screenshot_option.py +40 -0
- appium/options/android/common/context/recreate_chrome_driver_sessions_option.py +41 -0
- appium/options/android/common/context/show_chromedriver_log_option.py +39 -0
- appium/options/android/common/context/webview_devtools_port_option.py +40 -0
- appium/options/android/common/localization/__init__.py +0 -0
- appium/options/android/common/localization/locale_script_option.py +40 -0
- appium/options/android/common/locking/__init__.py +0 -0
- appium/options/android/common/locking/skip_unlock_option.py +42 -0
- appium/options/android/common/locking/unlock_key_option.py +40 -0
- appium/options/android/common/locking/unlock_strategy_option.py +40 -0
- appium/options/android/common/locking/unlock_success_timeout_option.py +43 -0
- appium/options/android/common/locking/unlock_type_option.py +40 -0
- appium/options/android/common/mjpeg/__init__.py +0 -0
- appium/options/android/common/mjpeg/mjpeg_screenshot_url_option.py +40 -0
- appium/options/android/common/other/__init__.py +0 -0
- appium/options/android/common/other/disable_suppress_accessibility_service_option.py +40 -0
- appium/options/android/common/other/user_profile_option.py +42 -0
- appium/options/android/common/signing/__init__.py +0 -0
- appium/options/android/common/signing/key_alias_option.py +40 -0
- appium/options/android/common/signing/key_password_option.py +40 -0
- appium/options/android/common/signing/keystore_password_option.py +40 -0
- appium/options/android/common/signing/keystore_path_option.py +40 -0
- appium/options/android/common/signing/no_sign_option.py +42 -0
- appium/options/android/common/signing/use_keystore_option.py +42 -0
- appium/options/android/espresso/__init__.py +0 -0
- appium/options/android/espresso/activity_options_option.py +41 -0
- appium/options/android/espresso/app_locale_option.py +44 -0
- appium/options/android/espresso/base.py +221 -0
- appium/options/android/espresso/espresso_build_config_option.py +46 -0
- appium/options/android/espresso/espresso_server_launch_timeout_option.py +43 -0
- appium/options/android/espresso/force_espresso_rebuild_option.py +41 -0
- appium/options/android/espresso/intent_options_option.py +41 -0
- appium/options/android/espresso/show_gradle_log_option.py +39 -0
- appium/options/android/uiautomator2/__init__.py +0 -0
- appium/options/android/uiautomator2/base.py +221 -0
- appium/options/android/uiautomator2/disable_window_animation_option.py +40 -0
- appium/options/android/uiautomator2/mjpeg_server_port_option.py +41 -0
- appium/options/android/uiautomator2/skip_device_initialization_option.py +40 -0
- appium/options/android/uiautomator2/skip_server_installation_option.py +44 -0
- appium/options/android/uiautomator2/uiautomator2_server_install_timeout_option.py +44 -0
- appium/options/android/uiautomator2/uiautomator2_server_launch_timeout_option.py +44 -0
- appium/options/android/uiautomator2/uiautomator2_server_read_timeout_option.py +46 -0
- appium/options/common/__init__.py +1 -0
- appium/options/common/app_option.py +41 -0
- appium/options/common/auto_web_view_option.py +40 -0
- appium/options/common/automation_name_option.py +38 -0
- appium/options/common/base.py +125 -0
- appium/options/common/browser_name_option.py +38 -0
- appium/options/common/bundle_id_option.py +38 -0
- appium/options/common/clear_system_files_option.py +38 -0
- appium/options/common/device_name_option.py +38 -0
- appium/options/common/enable_performance_logging_option.py +38 -0
- appium/options/common/event_timings_option.py +40 -0
- appium/options/common/full_reset_option.py +38 -0
- appium/options/common/is_headless_option.py +39 -0
- appium/options/common/language_option.py +38 -0
- appium/options/common/locale_option.py +38 -0
- appium/options/common/new_command_timeout_option.py +41 -0
- appium/options/common/no_reset_option.py +38 -0
- appium/options/common/orientation_option.py +40 -0
- appium/options/common/other_apps_option.py +39 -0
- appium/options/common/platform_version_option.py +40 -0
- appium/options/common/postrun_option.py +39 -0
- appium/options/common/prerun_option.py +40 -0
- appium/options/common/print_page_source_on_find_failure_option.py +40 -0
- appium/options/common/skip_log_capture_option.py +38 -0
- appium/options/common/supports_capabilities.py +26 -0
- appium/options/common/system_host_option.py +38 -0
- appium/options/common/system_port_option.py +38 -0
- appium/options/common/udid_option.py +38 -0
- appium/options/flutter_integration/__init__.py +15 -0
- appium/options/flutter_integration/base.py +39 -0
- appium/options/flutter_integration/flutter_element_wait_timeout_option.py +50 -0
- appium/options/flutter_integration/flutter_enable_mock_camera_option.py +44 -0
- appium/options/flutter_integration/flutter_server_launch_timeout_option.py +51 -0
- appium/options/flutter_integration/flutter_system_port_option.py +45 -0
- appium/options/gecko/__init__.py +1 -0
- appium/options/gecko/android_storage_option.py +39 -0
- appium/options/gecko/base.py +51 -0
- appium/options/gecko/firefox_options_option.py +38 -0
- appium/options/gecko/marionette_port_option.py +43 -0
- appium/options/gecko/verbosity_option.py +40 -0
- appium/options/ios/__init__.py +2 -0
- appium/options/ios/safari/__init__.py +0 -0
- appium/options/ios/safari/automatic_inspection_option.py +41 -0
- appium/options/ios/safari/automatic_profiling_option.py +41 -0
- appium/options/ios/safari/base.py +51 -0
- appium/options/ios/safari/device_name_option.py +43 -0
- appium/options/ios/safari/device_type_option.py +41 -0
- appium/options/ios/safari/device_udid_option.py +43 -0
- appium/options/ios/safari/platform_build_version_option.py +41 -0
- appium/options/ios/safari/platform_version_option.py +41 -0
- appium/options/ios/safari/use_simulator_option.py +41 -0
- appium/options/ios/safari/webkit_webrtc_option.py +52 -0
- appium/options/ios/xcuitest/__init__.py +0 -0
- appium/options/ios/xcuitest/app/__init__.py +0 -0
- appium/options/ios/xcuitest/app/app_install_strategy_option.py +46 -0
- appium/options/ios/xcuitest/app/app_push_timeout_option.py +42 -0
- appium/options/ios/xcuitest/app/localizable_strings_dir_option.py +39 -0
- appium/options/ios/xcuitest/base.py +223 -0
- appium/options/ios/xcuitest/general/__init__.py +0 -0
- appium/options/ios/xcuitest/general/include_device_caps_to_session_info_option.py +41 -0
- appium/options/ios/xcuitest/general/reset_location_service_option.py +39 -0
- appium/options/ios/xcuitest/other/__init__.py +0 -0
- appium/options/ios/xcuitest/other/command_timeouts_option.py +57 -0
- appium/options/ios/xcuitest/other/launch_with_idb_option.py +42 -0
- appium/options/ios/xcuitest/other/show_ios_log_option.py +39 -0
- appium/options/ios/xcuitest/other/use_json_source_option.py +39 -0
- appium/options/ios/xcuitest/simulator/__init__.py +0 -0
- appium/options/ios/xcuitest/simulator/calendar_access_authorized_option.py +41 -0
- appium/options/ios/xcuitest/simulator/calendar_format_option.py +38 -0
- appium/options/ios/xcuitest/simulator/connect_hardware_keyboard_option.py +43 -0
- appium/options/ios/xcuitest/simulator/custom_ssl_cert_option.py +39 -0
- appium/options/ios/xcuitest/simulator/enforce_fresh_simulator_creation_option.py +39 -0
- appium/options/ios/xcuitest/simulator/force_simulator_software_keyboard_presence_option.py +45 -0
- appium/options/ios/xcuitest/simulator/ios_simulator_logs_predicate_option.py +38 -0
- appium/options/ios/xcuitest/simulator/keep_key_chains_option.py +39 -0
- appium/options/ios/xcuitest/simulator/keychains_exclude_patterns_option.py +44 -0
- appium/options/ios/xcuitest/simulator/permissions_option.py +50 -0
- appium/options/ios/xcuitest/simulator/reduce_motion_option.py +40 -0
- appium/options/ios/xcuitest/simulator/reset_on_session_start_only_option.py +41 -0
- appium/options/ios/xcuitest/simulator/scale_factor_option.py +44 -0
- appium/options/ios/xcuitest/simulator/shutdown_other_simulators_option.py +44 -0
- appium/options/ios/xcuitest/simulator/simulator_devices_set_path_option.py +41 -0
- appium/options/ios/xcuitest/simulator/simulator_pasteboard_automatic_sync_option.py +42 -0
- appium/options/ios/xcuitest/simulator/simulator_startup_timeout_option.py +46 -0
- appium/options/ios/xcuitest/simulator/simulator_trace_pointer_option.py +41 -0
- appium/options/ios/xcuitest/simulator/simulator_window_center_option.py +41 -0
- appium/options/ios/xcuitest/wda/__init__.py +0 -0
- appium/options/ios/xcuitest/wda/allow_provisioning_device_regitration_option.py +40 -0
- appium/options/ios/xcuitest/wda/auto_accept_alerts_option.py +39 -0
- appium/options/ios/xcuitest/wda/auto_disimiss_alerts_option.py +39 -0
- appium/options/ios/xcuitest/wda/derived_data_path_option.py +41 -0
- appium/options/ios/xcuitest/wda/disable_automatic_screenshots_option.py +40 -0
- appium/options/ios/xcuitest/wda/force_app_launch_option.py +42 -0
- appium/options/ios/xcuitest/wda/keychain_password_option.py +39 -0
- appium/options/ios/xcuitest/wda/keychain_path_option.py +39 -0
- appium/options/ios/xcuitest/wda/max_typing_frequency_option.py +40 -0
- appium/options/ios/xcuitest/wda/mjpeg_server_port_option.py +42 -0
- appium/options/ios/xcuitest/wda/process_arguments_option.py +42 -0
- appium/options/ios/xcuitest/wda/result_bundle_path_option.py +42 -0
- appium/options/ios/xcuitest/wda/screenshot_quality_option.py +42 -0
- appium/options/ios/xcuitest/wda/should_terminate_app_option.py +42 -0
- appium/options/ios/xcuitest/wda/should_use_singleton_test_manager_option.py +39 -0
- appium/options/ios/xcuitest/wda/show_xcode_log_option.py +40 -0
- appium/options/ios/xcuitest/wda/simple_is_visible_check_option.py +42 -0
- appium/options/ios/xcuitest/wda/updated_wda_bundle_id_option.py +39 -0
- appium/options/ios/xcuitest/wda/use_native_caching_strategy_option.py +41 -0
- appium/options/ios/xcuitest/wda/use_new_wda_option.py +51 -0
- appium/options/ios/xcuitest/wda/use_prebuilt_wda_option.py +39 -0
- appium/options/ios/xcuitest/wda/use_simple_build_test_option.py +40 -0
- appium/options/ios/xcuitest/wda/use_xctestrun_file_option.py +49 -0
- appium/options/ios/xcuitest/wda/wait_for_idle_timeout_option.py +45 -0
- appium/options/ios/xcuitest/wda/wait_for_quiescence_option.py +42 -0
- appium/options/ios/xcuitest/wda/wda_base_url_option.py +41 -0
- appium/options/ios/xcuitest/wda/wda_connection_timeout_option.py +43 -0
- appium/options/ios/xcuitest/wda/wda_eventloop_idle_delay_option.py +46 -0
- appium/options/ios/xcuitest/wda/wda_launch_timeout_option.py +41 -0
- appium/options/ios/xcuitest/wda/wda_local_port_option.py +41 -0
- appium/options/ios/xcuitest/wda/wda_startup_retries_option.py +39 -0
- appium/options/ios/xcuitest/wda/wda_startup_retry_interval_option.py +43 -0
- appium/options/ios/xcuitest/wda/web_driver_agent_url_option.py +39 -0
- appium/options/ios/xcuitest/wda/xcode_org_id_option.py +39 -0
- appium/options/ios/xcuitest/wda/xcode_signing_id_option.py +39 -0
- appium/options/ios/xcuitest/webview/__init__.py +0 -0
- appium/options/ios/xcuitest/webview/absolute_web_locations_option.py +42 -0
- appium/options/ios/xcuitest/webview/additional_webview_bundle_ids_option.py +40 -0
- appium/options/ios/xcuitest/webview/enable_async_execute_from_https_option.py +39 -0
- appium/options/ios/xcuitest/webview/full_context_list_option.py +42 -0
- appium/options/ios/xcuitest/webview/include_safari_in_webviews_option.py +41 -0
- appium/options/ios/xcuitest/webview/native_web_tap_option.py +40 -0
- appium/options/ios/xcuitest/webview/safari_garbage_collect_option.py +39 -0
- appium/options/ios/xcuitest/webview/safari_ignore_fraud_warning_option.py +39 -0
- appium/options/ios/xcuitest/webview/safari_ignore_web_hostnames_option.py +42 -0
- appium/options/ios/xcuitest/webview/safari_initial_url_option.py +38 -0
- appium/options/ios/xcuitest/webview/safari_log_all_communication_hex_dump_option.py +43 -0
- appium/options/ios/xcuitest/webview/safari_log_all_communication_option.py +40 -0
- appium/options/ios/xcuitest/webview/safari_open_links_in_background_option.py +39 -0
- appium/options/ios/xcuitest/webview/safari_socket_chunk_size_option.py +41 -0
- appium/options/ios/xcuitest/webview/safari_web_inspector_max_frame_length_option.py +41 -0
- appium/options/ios/xcuitest/webview/webkit_response_timeout_option.py +43 -0
- appium/options/ios/xcuitest/webview/webview_connect_retries_option.py +40 -0
- appium/options/ios/xcuitest/webview/webview_connect_timeout_option.py +43 -0
- appium/options/mac/__init__.py +1 -0
- appium/options/mac/mac2/__init__.py +0 -0
- appium/options/mac/mac2/app_path_option.py +39 -0
- appium/options/mac/mac2/arguments_option.py +39 -0
- appium/options/mac/mac2/base.py +113 -0
- appium/options/mac/mac2/bootstrap_root_option.py +41 -0
- appium/options/mac/mac2/environment_option.py +41 -0
- appium/options/mac/mac2/server_startup_timeout_option.py +44 -0
- appium/options/mac/mac2/show_server_logs_option.py +39 -0
- appium/options/mac/mac2/skip_app_kill_option.py +40 -0
- appium/options/mac/mac2/web_driver_agent_mac_url_option.py +39 -0
- appium/options/windows/__init__.py +1 -0
- appium/options/windows/windows/__init__.py +0 -0
- appium/options/windows/windows/app_arguments_option.py +40 -0
- appium/options/windows/windows/app_top_level_window_option.py +40 -0
- appium/options/windows/windows/app_working_dir_option.py +40 -0
- appium/options/windows/windows/base.py +97 -0
- appium/options/windows/windows/create_session_timeout_option.py +45 -0
- appium/options/windows/windows/expreimental_web_driver_option.py +39 -0
- appium/options/windows/windows/wait_for_app_launch_option.py +43 -0
- appium/protocols/__init__.py +13 -0
- appium/protocols/webdriver/__init__.py +13 -0
- appium/protocols/webdriver/can_execute_commands.py +23 -0
- appium/protocols/webdriver/can_execute_scripts.py +27 -0
- appium/protocols/webdriver/can_find_elements.py +32 -0
- appium/protocols/webdriver/can_remember_extension_presence.py +23 -0
- appium/py.typed +0 -0
- appium/version.py +22 -0
- appium/webdriver/__init__.py +20 -0
- appium/webdriver/appium_connection.py +65 -0
- appium/webdriver/appium_service.py +330 -0
- appium/webdriver/applicationstate.py +21 -0
- appium/webdriver/client_config.py +38 -0
- appium/webdriver/clipboard_content_type.py +19 -0
- appium/webdriver/command_method.py +27 -0
- appium/webdriver/common/__init__.py +17 -0
- appium/webdriver/common/appiumby.py +54 -0
- appium/webdriver/connectiontype.py +42 -0
- appium/webdriver/errorhandler.py +125 -0
- appium/webdriver/extensions/__init__.py +13 -0
- appium/webdriver/extensions/action_helpers.py +188 -0
- appium/webdriver/extensions/android/__init__.py +0 -0
- appium/webdriver/extensions/android/activities.py +65 -0
- appium/webdriver/extensions/android/common.py +59 -0
- appium/webdriver/extensions/android/display.py +48 -0
- appium/webdriver/extensions/android/gsm.py +147 -0
- appium/webdriver/extensions/android/nativekey.py +1119 -0
- appium/webdriver/extensions/android/network.py +175 -0
- appium/webdriver/extensions/android/performance.py +85 -0
- appium/webdriver/extensions/android/power.py +80 -0
- appium/webdriver/extensions/android/sms.py +50 -0
- appium/webdriver/extensions/android/system_bars.py +58 -0
- appium/webdriver/extensions/applications.py +274 -0
- appium/webdriver/extensions/clipboard.py +107 -0
- appium/webdriver/extensions/context.py +63 -0
- appium/webdriver/extensions/device_time.py +75 -0
- appium/webdriver/extensions/execute_driver.py +60 -0
- appium/webdriver/extensions/execute_mobile_command.py +62 -0
- appium/webdriver/extensions/flutter_integration/__init__.py +13 -0
- appium/webdriver/extensions/flutter_integration/flutter_commands.py +296 -0
- appium/webdriver/extensions/flutter_integration/flutter_finder.py +55 -0
- appium/webdriver/extensions/flutter_integration/scroll_directions.py +6 -0
- appium/webdriver/extensions/hw_actions.py +149 -0
- appium/webdriver/extensions/images_comparison.py +132 -0
- appium/webdriver/extensions/keyboard.py +168 -0
- appium/webdriver/extensions/location.py +98 -0
- appium/webdriver/extensions/log_event.py +68 -0
- appium/webdriver/extensions/logs.py +53 -0
- appium/webdriver/extensions/remote_fs.py +110 -0
- appium/webdriver/extensions/screen_record.py +207 -0
- appium/webdriver/extensions/session.py +41 -0
- appium/webdriver/extensions/settings.py +49 -0
- appium/webdriver/locator_converter.py +29 -0
- appium/webdriver/mobilecommand.py +104 -0
- appium/webdriver/switch_to.py +35 -0
- appium/webdriver/webdriver.py +495 -0
- appium/webdriver/webelement.py +130 -0
- appium_python_client-5.2.0.dist-info/METADATA +573 -0
- appium_python_client-5.2.0.dist-info/RECORD +324 -0
- appium_python_client-5.2.0.dist-info/WHEEL +4 -0
- 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')
|