appium_lib_core 4.1.0 → 8.0.2
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +316 -270
- data/README.md +65 -15
- data/Rakefile +5 -22
- data/appium_lib_core.gemspec +6 -9
- data/bin/console +0 -4
- data/lib/appium_lib_core/android/device/auth_finger_print.rb +4 -1
- data/lib/appium_lib_core/android/device/network.rb +10 -0
- data/lib/appium_lib_core/android/device/performance.rb +3 -0
- data/lib/appium_lib_core/android/device/screen.rb +2 -0
- data/lib/appium_lib_core/android/device.rb +80 -17
- data/lib/appium_lib_core/common/base/bridge.rb +309 -93
- data/lib/appium_lib_core/common/base/capabilities.rb +8 -9
- data/lib/appium_lib_core/common/{command/mjsonwp.rb → base/device_ime.rb} +33 -12
- data/lib/appium_lib_core/common/base/driver.rb +258 -331
- data/lib/appium_lib_core/common/base/driver_settings.rb +51 -0
- data/lib/appium_lib_core/common/base/has_location.rb +80 -0
- data/lib/appium_lib_core/common/base/has_network_connection.rb +56 -0
- data/lib/appium_lib_core/common/base/http_default.rb +15 -38
- data/lib/appium_lib_core/{ios/uiautomation/bridge.rb → common/base/remote_status.rb} +9 -8
- data/lib/appium_lib_core/common/base/rotable.rb +62 -0
- data/lib/appium_lib_core/common/base/screenshot.rb +8 -8
- data/lib/appium_lib_core/common/base/search_context.rb +13 -17
- data/lib/appium_lib_core/common/base.rb +1 -5
- data/lib/appium_lib_core/common/command.rb +244 -4
- data/lib/appium_lib_core/common/device/app_management.rb +2 -26
- data/lib/appium_lib_core/common/device/context.rb +1 -5
- data/lib/appium_lib_core/common/device/image_comparison.rb +12 -4
- data/lib/appium_lib_core/common/device/keyevent.rb +4 -4
- data/lib/appium_lib_core/common/device/{touch_actions.rb → orientation.rb} +6 -10
- data/lib/appium_lib_core/common/error.rb +4 -5
- data/lib/appium_lib_core/common/log.rb +5 -4
- data/lib/appium_lib_core/common/wait.rb +38 -6
- data/lib/appium_lib_core/device.rb +3 -9
- data/lib/appium_lib_core/driver.rb +182 -148
- data/lib/appium_lib_core/{patch.rb → element.rb} +62 -25
- data/lib/appium_lib_core/ios/xcuitest/device.rb +2 -0
- data/lib/appium_lib_core/{common/base/command.rb → mac2/bridge.rb} +9 -8
- data/lib/appium_lib_core/mac2/device/screen.rb +48 -0
- data/lib/appium_lib_core/mac2/device.rb +92 -0
- data/lib/appium_lib_core/{ios.rb → mac2.rb} +2 -5
- data/lib/appium_lib_core/support/event_firing_bridge.rb +57 -0
- data/lib/appium_lib_core/version.rb +2 -2
- data/lib/appium_lib_core.rb +21 -10
- metadata +28 -94
- data/.github/ISSUE_TEMPLATE/issue-report.md +0 -29
- data/.github/contributing.md +0 -26
- data/.github/issue_template.md +0 -20
- data/.github/workflows/unittest.yml +0 -68
- data/.gitignore +0 -18
- data/.rubocop.yml +0 -58
- data/azure-pipelines.yml +0 -15
- data/ci-jobs/functional/android_setup.yml +0 -3
- data/ci-jobs/functional/ios_setup.yml +0 -7
- data/ci-jobs/functional/publish_test_result.yml +0 -18
- data/ci-jobs/functional/run_appium.yml +0 -25
- data/ci-jobs/functional/start-emulator.sh +0 -26
- data/ci-jobs/functional_test.yml +0 -298
- data/docs/mobile_command.md +0 -34
- data/lib/appium_lib_core/common/base/bridge/mjsonwp.rb +0 -81
- data/lib/appium_lib_core/common/base/bridge/w3c.rb +0 -252
- data/lib/appium_lib_core/common/command/common.rb +0 -110
- data/lib/appium_lib_core/common/command/w3c.rb +0 -56
- data/lib/appium_lib_core/common/device/value.rb +0 -52
- data/lib/appium_lib_core/common/touch_action/multi_touch.rb +0 -56
- data/lib/appium_lib_core/common/touch_action/touch_actions.rb +0 -203
- data/lib/appium_lib_core/ios/uiautomation/device.rb +0 -44
- data/lib/appium_lib_core/ios/uiautomation/patch.rb +0 -34
- data/release_notes.md +0 -816
- data/script/commands.rb +0 -200
| @@ -12,7 +12,247 @@ | |
| 12 12 | 
             
            # See the License for the specific language governing permissions and
         | 
| 13 13 | 
             
            # limitations under the License.
         | 
| 14 14 |  | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 15 | 
            +
            module Appium
         | 
| 16 | 
            +
              module Core
         | 
| 17 | 
            +
                # ref: https://github.com/appium/appium-base-driver/blob/master/lib/mjsonwp/routes.js
         | 
| 18 | 
            +
                module Commands
         | 
| 19 | 
            +
                  # Some commands differ for each driver.
         | 
| 20 | 
            +
                  COMMAND = {
         | 
| 21 | 
            +
                    ###
         | 
| 22 | 
            +
                    # W3C
         | 
| 23 | 
            +
                    ###
         | 
| 24 | 
            +
                    status: [:get, 'status'],
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                    #
         | 
| 27 | 
            +
                    # session handling
         | 
| 28 | 
            +
                    #
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                    new_session: [:post, 'session'],
         | 
| 31 | 
            +
                    delete_session: [:delete, 'session/:session_id'],
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                    #
         | 
| 34 | 
            +
                    # basic driver
         | 
| 35 | 
            +
                    #
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                    get: [:post, 'session/:session_id/url'],
         | 
| 38 | 
            +
                    get_current_url: [:get, 'session/:session_id/url'],
         | 
| 39 | 
            +
                    back: [:post, 'session/:session_id/back'],
         | 
| 40 | 
            +
                    forward: [:post, 'session/:session_id/forward'],
         | 
| 41 | 
            +
                    refresh: [:post, 'session/:session_id/refresh'],
         | 
| 42 | 
            +
                    get_title: [:get, 'session/:session_id/title'],
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                    #
         | 
| 45 | 
            +
                    # window and Frame handling
         | 
| 46 | 
            +
                    #
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                    get_window_handle: [:get, 'session/:session_id/window'],
         | 
| 49 | 
            +
                    new_window: [:post, 'session/:session_id/window/new'],
         | 
| 50 | 
            +
                    close_window: [:delete, 'session/:session_id/window'],
         | 
| 51 | 
            +
                    switch_to_window: [:post, 'session/:session_id/window'],
         | 
| 52 | 
            +
                    get_window_handles: [:get, 'session/:session_id/window/handles'],
         | 
| 53 | 
            +
                    fullscreen_window: [:post, 'session/:session_id/window/fullscreen'],
         | 
| 54 | 
            +
                    minimize_window: [:post, 'session/:session_id/window/minimize'],
         | 
| 55 | 
            +
                    maximize_window: [:post, 'session/:session_id/window/maximize'],
         | 
| 56 | 
            +
                    set_window_size: [:post, 'session/:session_id/window/size'],
         | 
| 57 | 
            +
                    get_window_size: [:get, 'session/:session_id/window/size'],
         | 
| 58 | 
            +
                    set_window_position: [:post, 'session/:session_id/window/position'],
         | 
| 59 | 
            +
                    get_window_position: [:get, 'session/:session_id/window/position'],
         | 
| 60 | 
            +
                    set_window_rect: [:post, 'session/:session_id/window/rect'],
         | 
| 61 | 
            +
                    get_window_rect: [:get, 'session/:session_id/window/rect'],
         | 
| 62 | 
            +
                    switch_to_frame: [:post, 'session/:session_id/frame'],
         | 
| 63 | 
            +
                    switch_to_parent_frame: [:post, 'session/:session_id/frame/parent'],
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                    #
         | 
| 66 | 
            +
                    # element
         | 
| 67 | 
            +
                    #
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                    find_element: [:post, 'session/:session_id/element'],
         | 
| 70 | 
            +
                    find_elements: [:post, 'session/:session_id/elements'],
         | 
| 71 | 
            +
                    find_child_element: [:post, 'session/:session_id/element/:id/element'],
         | 
| 72 | 
            +
                    find_child_elements: [:post, 'session/:session_id/element/:id/elements'],
         | 
| 73 | 
            +
                    find_shadow_child_element: [:post, 'session/:session_id/shadow/:id/element'],
         | 
| 74 | 
            +
                    find_shadow_child_elements: [:post, 'session/:session_id/shadow/:id/elements'],
         | 
| 75 | 
            +
                    get_active_element: [:get, 'session/:session_id/element/active'],
         | 
| 76 | 
            +
                    is_element_selected: [:get, 'session/:session_id/element/:id/selected'],
         | 
| 77 | 
            +
                    get_element_attribute: [:get, 'session/:session_id/element/:id/attribute/:name'],
         | 
| 78 | 
            +
                    get_element_property: [:get, 'session/:session_id/element/:id/property/:name'],
         | 
| 79 | 
            +
                    get_element_css_value: [:get, 'session/:session_id/element/:id/css/:property_name'],
         | 
| 80 | 
            +
                    get_element_aria_role: [:get, 'session/:session_id/element/:id/computedrole'],
         | 
| 81 | 
            +
                    get_element_aria_label: [:get, 'session/:session_id/element/:id/computedlabel'],
         | 
| 82 | 
            +
                    get_element_text: [:get, 'session/:session_id/element/:id/text'],
         | 
| 83 | 
            +
                    get_element_tag_name: [:get, 'session/:session_id/element/:id/name'],
         | 
| 84 | 
            +
                    get_element_rect: [:get, 'session/:session_id/element/:id/rect'],
         | 
| 85 | 
            +
                    is_element_enabled: [:get, 'session/:session_id/element/:id/enabled'],
         | 
| 86 | 
            +
             | 
| 87 | 
            +
                    #
         | 
| 88 | 
            +
                    # document handling
         | 
| 89 | 
            +
                    #
         | 
| 90 | 
            +
             | 
| 91 | 
            +
                    get_page_source: [:get, 'session/:session_id/source'],
         | 
| 92 | 
            +
                    execute_script: [:post, 'session/:session_id/execute/sync'],
         | 
| 93 | 
            +
                    execute_async_script: [:post, 'session/:session_id/execute/async'],
         | 
| 94 | 
            +
             | 
| 95 | 
            +
                    #
         | 
| 96 | 
            +
                    # cookies
         | 
| 97 | 
            +
                    #
         | 
| 98 | 
            +
             | 
| 99 | 
            +
                    get_all_cookies: [:get, 'session/:session_id/cookie'],
         | 
| 100 | 
            +
                    get_cookie: [:get, 'session/:session_id/cookie/:name'],
         | 
| 101 | 
            +
                    add_cookie: [:post, 'session/:session_id/cookie'],
         | 
| 102 | 
            +
                    delete_cookie: [:delete, 'session/:session_id/cookie/:name'],
         | 
| 103 | 
            +
                    delete_all_cookies: [:delete, 'session/:session_id/cookie'],
         | 
| 104 | 
            +
             | 
| 105 | 
            +
                    #
         | 
| 106 | 
            +
                    # timeouts
         | 
| 107 | 
            +
                    #
         | 
| 108 | 
            +
             | 
| 109 | 
            +
                    set_timeout: [:post, 'session/:session_id/timeouts'],
         | 
| 110 | 
            +
             | 
| 111 | 
            +
                    #
         | 
| 112 | 
            +
                    # actions
         | 
| 113 | 
            +
                    #
         | 
| 114 | 
            +
             | 
| 115 | 
            +
                    actions: [:post, 'session/:session_id/actions'],
         | 
| 116 | 
            +
                    release_actions: [:delete, 'session/:session_id/actions'],
         | 
| 117 | 
            +
                    print_page: [:post, 'session/:session_id/print'],
         | 
| 118 | 
            +
             | 
| 119 | 
            +
                    #
         | 
| 120 | 
            +
                    # Element Operations
         | 
| 121 | 
            +
                    #
         | 
| 122 | 
            +
             | 
| 123 | 
            +
                    element_click: [:post, 'session/:session_id/element/:id/click'],
         | 
| 124 | 
            +
                    element_tap: [:post, 'session/:session_id/element/:id/tap'],
         | 
| 125 | 
            +
                    element_clear: [:post, 'session/:session_id/element/:id/clear'],
         | 
| 126 | 
            +
                    element_send_keys: [:post, 'session/:session_id/element/:id/value'],
         | 
| 127 | 
            +
             | 
| 128 | 
            +
                    #
         | 
| 129 | 
            +
                    # alerts
         | 
| 130 | 
            +
                    #
         | 
| 131 | 
            +
             | 
| 132 | 
            +
                    dismiss_alert: [:post, 'session/:session_id/alert/dismiss'],
         | 
| 133 | 
            +
                    accept_alert: [:post, 'session/:session_id/alert/accept'],
         | 
| 134 | 
            +
                    get_alert_text: [:get, 'session/:session_id/alert/text'],
         | 
| 135 | 
            +
                    send_alert_text: [:post, 'session/:session_id/alert/text'],
         | 
| 136 | 
            +
             | 
| 137 | 
            +
                    #
         | 
| 138 | 
            +
                    # screenshot
         | 
| 139 | 
            +
                    #
         | 
| 140 | 
            +
             | 
| 141 | 
            +
                    take_screenshot: [:get, 'session/:session_id/screenshot'],
         | 
| 142 | 
            +
                    take_element_screenshot: [:get, 'session/:session_id/element/:id/screenshot'],
         | 
| 143 | 
            +
             | 
| 144 | 
            +
                    #
         | 
| 145 | 
            +
                    # server extensions
         | 
| 146 | 
            +
                    #
         | 
| 147 | 
            +
             | 
| 148 | 
            +
                    upload_file: [:post, 'session/:session_id/se/file'],
         | 
| 149 | 
            +
             | 
| 150 | 
            +
                    ###
         | 
| 151 | 
            +
                    # Used by Appium, but no in W3C
         | 
| 152 | 
            +
                    ###
         | 
| 153 | 
            +
             | 
| 154 | 
            +
                    # ::Appium::Core::Base::Commands::OSS has the following commands and Appium also use them.
         | 
| 155 | 
            +
                    # Delegated to ::Appium::Core::Base::Commands::OSS commands
         | 
| 156 | 
            +
                    is_element_displayed: [:get, 'session/:session_id/element/:id/displayed'], # hint: https://w3c.github.io/webdriver/#element-displayedness
         | 
| 157 | 
            +
             | 
| 158 | 
            +
                    get_timeouts: [:get, 'session/:session_id/timeouts'], # https://w3c.github.io/webdriver/#get-timeouts
         | 
| 159 | 
            +
             | 
| 160 | 
            +
                    ### rotatable
         | 
| 161 | 
            +
                    get_screen_orientation: [:get, 'session/:session_id/orientation'],
         | 
| 162 | 
            +
                    set_screen_orientation: [:post, 'session/:session_id/orientation'],
         | 
| 163 | 
            +
             | 
| 164 | 
            +
                    get_location: [:get, 'session/:session_id/location'],
         | 
| 165 | 
            +
                    set_location: [:post, 'session/:session_id/location'],
         | 
| 166 | 
            +
             | 
| 167 | 
            +
                    ### For IME
         | 
| 168 | 
            +
                    ime_get_available_engines: [:get, 'session/:session_id/ime/available_engines'],
         | 
| 169 | 
            +
                    ime_get_active_engine: [:get, 'session/:session_id/ime/active_engine'],
         | 
| 170 | 
            +
                    ime_is_activated: [:get, 'session/:session_id/ime/activated'],
         | 
| 171 | 
            +
                    ime_deactivate: [:post, 'session/:session_id/ime/deactivate'],
         | 
| 172 | 
            +
                    ime_activate_engine: [:post, 'session/:session_id/ime/activate'],
         | 
| 173 | 
            +
             | 
| 174 | 
            +
                    ### Logs
         | 
| 175 | 
            +
                    get_available_log_types: [:get, 'session/:session_id/log/types'],
         | 
| 176 | 
            +
                    get_log: [:post, 'session/:session_id/log'],
         | 
| 177 | 
            +
             | 
| 178 | 
            +
                    ###
         | 
| 179 | 
            +
                    # Appium own
         | 
| 180 | 
            +
                    ###
         | 
| 181 | 
            +
             | 
| 182 | 
            +
                    # common
         | 
| 183 | 
            +
                    available_contexts: [:get, 'session/:session_id/contexts'],
         | 
| 184 | 
            +
                    set_context: [:post, 'session/:session_id/context'],
         | 
| 185 | 
            +
                    current_context: [:get, 'session/:session_id/context'],
         | 
| 186 | 
            +
             | 
| 187 | 
            +
                    background_app: [:post, 'session/:session_id/appium/app/background'],
         | 
| 188 | 
            +
                    app_strings: [:post, 'session/:session_id/appium/app/strings'],
         | 
| 189 | 
            +
             | 
| 190 | 
            +
                    device_locked?: [:post, 'session/:session_id/appium/device/is_locked'],
         | 
| 191 | 
            +
                    unlock: [:post, 'session/:session_id/appium/device/unlock'],
         | 
| 192 | 
            +
                    lock: [:post, 'session/:session_id/appium/device/lock'],
         | 
| 193 | 
            +
                    device_time: [:get, 'session/:session_id/appium/device/system_time'],
         | 
| 194 | 
            +
                    install_app: [:post, 'session/:session_id/appium/device/install_app'],
         | 
| 195 | 
            +
                    remove_app: [:post, 'session/:session_id/appium/device/remove_app'],
         | 
| 196 | 
            +
                    app_installed?: [:post, 'session/:session_id/appium/device/app_installed'],
         | 
| 197 | 
            +
                    activate_app: [:post, 'session/:session_id/appium/device/activate_app'],
         | 
| 198 | 
            +
                    terminate_app: [:post, 'session/:session_id/appium/device/terminate_app'],
         | 
| 199 | 
            +
                    app_state: [:post, 'session/:session_id/appium/device/app_state'],
         | 
| 200 | 
            +
                    shake: [:post, 'session/:session_id/appium/device/shake'],
         | 
| 201 | 
            +
                    hide_keyboard: [:post, 'session/:session_id/appium/device/hide_keyboard'],
         | 
| 202 | 
            +
                    press_keycode: [:post, 'session/:session_id/appium/device/press_keycode'],
         | 
| 203 | 
            +
                    long_press_keycode: [:post, 'session/:session_id/appium/device/long_press_keycode'],
         | 
| 204 | 
            +
                    push_file: [:post, 'session/:session_id/appium/device/push_file'],
         | 
| 205 | 
            +
                    pull_file: [:post, 'session/:session_id/appium/device/pull_file'],
         | 
| 206 | 
            +
                    pull_folder: [:post, 'session/:session_id/appium/device/pull_folder'],
         | 
| 207 | 
            +
                    get_clipboard: [:post, 'session/:session_id/appium/device/get_clipboard'],
         | 
| 208 | 
            +
                    set_clipboard: [:post, 'session/:session_id/appium/device/set_clipboard'],
         | 
| 209 | 
            +
                    finger_print: [:post, 'session/:session_id/appium/device/finger_print'],
         | 
| 210 | 
            +
                    get_settings: [:get, 'session/:session_id/appium/settings'],
         | 
| 211 | 
            +
                    update_settings: [:post, 'session/:session_id/appium/settings'],
         | 
| 212 | 
            +
                    stop_recording_screen: [:post, 'session/:session_id/appium/stop_recording_screen'],
         | 
| 213 | 
            +
                    start_recording_screen: [:post, 'session/:session_id/appium/start_recording_screen'],
         | 
| 214 | 
            +
                    compare_images: [:post, 'session/:session_id/appium/compare_images'],
         | 
| 215 | 
            +
                    is_keyboard_shown: [:get, 'session/:session_id/appium/device/is_keyboard_shown'],
         | 
| 216 | 
            +
                    execute_driver: [:post, 'session/:session_id/appium/execute_driver'],
         | 
| 217 | 
            +
                    post_log_event: [:post, 'session/:session_id/appium/log_event'],
         | 
| 218 | 
            +
                    get_log_events: [:post, 'session/:session_id/appium/events']
         | 
| 219 | 
            +
                  }.freeze
         | 
| 220 | 
            +
             | 
| 221 | 
            +
                  COMMAND_ANDROID = {
         | 
| 222 | 
            +
                    open_notifications: [:post, 'session/:session_id/appium/device/open_notifications'],
         | 
| 223 | 
            +
                    toggle_airplane_mode: [:post, 'session/:session_id/appium/device/toggle_airplane_mode'],
         | 
| 224 | 
            +
                    start_activity: [:post, 'session/:session_id/appium/device/start_activity'],
         | 
| 225 | 
            +
                    current_activity: [:get, 'session/:session_id/appium/device/current_activity'],
         | 
| 226 | 
            +
                    current_package: [:get, 'session/:session_id/appium/device/current_package'],
         | 
| 227 | 
            +
                    get_system_bars: [:get, 'session/:session_id/appium/device/system_bars'],
         | 
| 228 | 
            +
                    get_display_density: [:get, 'session/:session_id/appium/device/display_density'],
         | 
| 229 | 
            +
                    toggle_wifi: [:post, 'session/:session_id/appium/device/toggle_wifi'],
         | 
| 230 | 
            +
                    toggle_data: [:post, 'session/:session_id/appium/device/toggle_data'],
         | 
| 231 | 
            +
                    toggle_location_services: [:post, 'session/:session_id/appium/device/toggle_location_services'],
         | 
| 232 | 
            +
                    get_performance_data_types: [:post, 'session/:session_id/appium/performanceData/types'],
         | 
| 233 | 
            +
                    get_performance_data: [:post, 'session/:session_id/appium/getPerformanceData'],
         | 
| 234 | 
            +
                    get_network_connection: [:get, 'session/:session_id/network_connection'], # defined also in OSS
         | 
| 235 | 
            +
                    set_network_connection: [:post, 'session/:session_id/network_connection'], # defined also in OSS
         | 
| 236 | 
            +
             | 
| 237 | 
            +
                    # only emulator
         | 
| 238 | 
            +
                    send_sms: [:post, 'session/:session_id/appium/device/send_sms'],
         | 
| 239 | 
            +
                    gsm_call: [:post, 'session/:session_id/appium/device/gsm_call'],
         | 
| 240 | 
            +
                    gsm_signal: [:post, 'session/:session_id/appium/device/gsm_signal'],
         | 
| 241 | 
            +
                    gsm_voice: [:post, 'session/:session_id/appium/device/gsm_voice'],
         | 
| 242 | 
            +
                    set_network_speed: [:post, 'session/:session_id/appium/device/network_speed'],
         | 
| 243 | 
            +
                    set_power_capacity: [:post, 'session/:session_id/appium/device/power_capacity'],
         | 
| 244 | 
            +
                    set_power_ac: [:post, 'session/:session_id/appium/device/power_ac'],
         | 
| 245 | 
            +
             | 
| 246 | 
            +
                    # For chromium: https://chromium.googlesource.com/chromium/src/+/master/chrome/test/chromedriver/server/http_handler.cc
         | 
| 247 | 
            +
                    chrome_send_command: [:post, 'session/:session_id/goog/cdp/execute']
         | 
| 248 | 
            +
                  }.freeze
         | 
| 249 | 
            +
             | 
| 250 | 
            +
                  COMMAND_IOS = {
         | 
| 251 | 
            +
                    touch_id: [:post, 'session/:session_id/appium/simulator/touch_id'],
         | 
| 252 | 
            +
                    toggle_touch_id_enrollment: [:post, 'session/:session_id/appium/simulator/toggle_touch_id_enrollment']
         | 
| 253 | 
            +
                  }.freeze
         | 
| 254 | 
            +
             | 
| 255 | 
            +
                  COMMANDS = {}.merge(COMMAND).merge(COMMAND_ANDROID).merge(COMMAND_IOS).freeze
         | 
| 256 | 
            +
                end # module Commands
         | 
| 257 | 
            +
              end # module Core
         | 
| 258 | 
            +
            end # module Appium
         | 
| @@ -17,18 +17,6 @@ module Appium | |
| 17 17 | 
             
                class Base
         | 
| 18 18 | 
             
                  module Device
         | 
| 19 19 | 
             
                    module AppManagement
         | 
| 20 | 
            -
                      def launch_app
         | 
| 21 | 
            -
                        execute :launch_app
         | 
| 22 | 
            -
                      end
         | 
| 23 | 
            -
             | 
| 24 | 
            -
                      def close_app
         | 
| 25 | 
            -
                        execute :close_app
         | 
| 26 | 
            -
                      end
         | 
| 27 | 
            -
             | 
| 28 | 
            -
                      def reset
         | 
| 29 | 
            -
                        execute :reset
         | 
| 30 | 
            -
                      end
         | 
| 31 | 
            -
             | 
| 32 20 | 
             
                      def app_strings(language = nil)
         | 
| 33 21 | 
             
                        opts = language ? { language: language } : {}
         | 
| 34 22 | 
             
                        execute :app_strings, {}, opts
         | 
| @@ -39,21 +27,9 @@ module Appium | |
| 39 27 | 
             
                        raise NotImplementedError
         | 
| 40 28 | 
             
                      end
         | 
| 41 29 |  | 
| 42 | 
            -
                      def install_app(path,
         | 
| 43 | 
            -
                                      replace: nil,
         | 
| 44 | 
            -
                                      timeout: nil,
         | 
| 45 | 
            -
                                      allow_test_packages: nil,
         | 
| 46 | 
            -
                                      use_sdcard: nil,
         | 
| 47 | 
            -
                                      grant_permissions: nil)
         | 
| 30 | 
            +
                      def install_app(path, options = {})
         | 
| 48 31 | 
             
                        args = { appPath: path }
         | 
| 49 | 
            -
             | 
| 50 | 
            -
                        args[:options] = {} if options?(replace, timeout, allow_test_packages, use_sdcard, grant_permissions)
         | 
| 51 | 
            -
             | 
| 52 | 
            -
                        args[:options][:replace] = replace unless replace.nil?
         | 
| 53 | 
            -
                        args[:options][:timeout] = timeout unless timeout.nil?
         | 
| 54 | 
            -
                        args[:options][:allowTestPackages] = allow_test_packages unless allow_test_packages.nil?
         | 
| 55 | 
            -
                        args[:options][:useSdcard] = use_sdcard unless use_sdcard.nil?
         | 
| 56 | 
            -
                        args[:options][:grantPermissions] = grant_permissions unless grant_permissions.nil?
         | 
| 32 | 
            +
                        args[:options] = options unless options.empty?
         | 
| 57 33 |  | 
| 58 34 | 
             
                        execute :install_app, {}, args
         | 
| 59 35 | 
             
                      end
         | 
| @@ -29,10 +29,6 @@ module Appium | |
| 29 29 | 
             
                        end
         | 
| 30 30 | 
             
                      end
         | 
| 31 31 |  | 
| 32 | 
            -
                      def switch_to_default_context
         | 
| 33 | 
            -
                        set_context nil
         | 
| 34 | 
            -
                      end
         | 
| 35 | 
            -
             | 
| 36 32 | 
             
                      def current_context
         | 
| 37 33 | 
             
                        execute :current_context
         | 
| 38 34 | 
             
                      end
         | 
| @@ -42,7 +38,7 @@ module Appium | |
| 42 38 | 
             
                        execute(:available_contexts, {}) || []
         | 
| 43 39 | 
             
                      end
         | 
| 44 40 |  | 
| 45 | 
            -
                      def set_context(context =  | 
| 41 | 
            +
                      def set_context(context = nil)
         | 
| 46 42 | 
             
                        execute :set_context, {}, name: context
         | 
| 47 43 | 
             
                      end
         | 
| 48 44 | 
             
                    end # module ImeActions
         | 
| @@ -47,7 +47,7 @@ module Appium | |
| 47 47 | 
             
                      #                               not available in the default OpenCV installation and have to be enabled manually
         | 
| 48 48 | 
             
                      #                               before library compilation. The default detector name is 'ORB'.
         | 
| 49 49 | 
             
                      # @param [String] match_func The name of the matching function. The default one is 'BruteForce'.
         | 
| 50 | 
            -
                      # @param [String] good_matches_factor The maximum count of "good" matches (e. g. with minimal distances).
         | 
| 50 | 
            +
                      # @param [String, nil] good_matches_factor The maximum count of "good" matches (e. g. with minimal distances).
         | 
| 51 51 | 
             
                      #                                     The default one is nil.
         | 
| 52 52 | 
             
                      # @param [Bool] visualize Makes the endpoint to return an image, which contains the visualized result of
         | 
| 53 53 | 
             
                      #                         the corresponding picture matching operation. This option is disabled by default.
         | 
| @@ -94,7 +94,12 @@ module Appium | |
| 94 94 | 
             
                      #                                are supported.
         | 
| 95 95 | 
             
                      # @param [Bool] visualize Makes the endpoint to return an image, which contains the visualized result of
         | 
| 96 96 | 
             
                      #                         the corresponding picture matching operation. This option is disabled by default.
         | 
| 97 | 
            -
                      # @param [Float] threshold [0.5] At what normalized threshold to reject
         | 
| 97 | 
            +
                      # @param [Float, nil] threshold [0.5] At what normalized threshold to reject
         | 
| 98 | 
            +
                      # @param [bool, nil] multiple Whether to enable the support of multiple image occurrences @since Appium 1.21.0.
         | 
| 99 | 
            +
                      # @param [integer, nil] match_neighbour_threshold The pixel distance between matches we consider to be part of
         | 
| 100 | 
            +
                      #                                                 the same template match @since Appium 1.21.0.
         | 
| 101 | 
            +
                      #                                                 This option is only considered if multiple matches mode is enabled.
         | 
| 102 | 
            +
                      #                                                 10 pixels by default.
         | 
| 98 103 | 
             
                      #
         | 
| 99 104 | 
             
                      # @example
         | 
| 100 105 | 
             
                      #     @driver.find_image_occurrence full_image: "image data 1", partial_image: "image data 2"
         | 
| @@ -102,12 +107,15 @@ module Appium | |
| 102 107 | 
             
                      #     visual = @@driver.find_image_occurrence full_image: image1, partial_image: image2, visualize: true
         | 
| 103 108 | 
             
                      #     File.write 'find_result_visual.png', Base64.decode64(visual['visualization']) # if the image is PNG
         | 
| 104 109 | 
             
                      #
         | 
| 105 | 
            -
                      def find_image_occurrence(full_image:, partial_image:, visualize: false, threshold: nil | 
| 110 | 
            +
                      def find_image_occurrence(full_image:, partial_image:, visualize: false, threshold: nil,
         | 
| 111 | 
            +
                                                multiple: nil, match_neighbour_threshold: nil)
         | 
| 106 112 | 
             
                        raise "visualize should be #{MATCH_TEMPLATE[:visualize]}" unless MATCH_TEMPLATE[:visualize].member?(visualize)
         | 
| 107 113 |  | 
| 108 114 | 
             
                        options = {}
         | 
| 109 115 | 
             
                        options[:visualize] = visualize
         | 
| 110 116 | 
             
                        options[:threshold] = threshold unless threshold.nil?
         | 
| 117 | 
            +
                        options[:multiple] = multiple unless multiple.nil?
         | 
| 118 | 
            +
                        options[:matchNeighbourThreshold] = match_neighbour_threshold unless match_neighbour_threshold.nil?
         | 
| 111 119 |  | 
| 112 120 | 
             
                        compare_images(mode: :matchTemplate, first_image: full_image, second_image: partial_image, options: options)
         | 
| 113 121 | 
             
                      end
         | 
| @@ -144,7 +152,7 @@ module Appium | |
| 144 152 | 
             
                      #                      +:matchFeatures is by default.
         | 
| 145 153 | 
             
                      # @param [String] first_image An image data. All image formats, that OpenCV library itself accepts, are supported.
         | 
| 146 154 | 
             
                      # @param [String] second_image An image data. All image formats, that OpenCV library itself accepts, are supported.
         | 
| 147 | 
            -
                      # @param [Hash] options The content of this dictionary depends on the actual +mode+ value.
         | 
| 155 | 
            +
                      # @param [Hash, nil] options The content of this dictionary depends on the actual +mode+ value.
         | 
| 148 156 | 
             
                      #                       See the documentation on +appium-support+ module for more details.
         | 
| 149 157 | 
             
                      # @return [Hash] The content of the resulting dictionary depends on the actual +mode+ and +options+ values.
         | 
| 150 158 | 
             
                      #                 See the documentation on +appium-support+ module for more details.
         | 
| @@ -25,8 +25,8 @@ module Appium | |
| 25 25 | 
             
                      end
         | 
| 26 26 |  | 
| 27 27 | 
             
                      def press_keycode(key, metastate: [], flags: [])
         | 
| 28 | 
            -
                        raise ArgumentError, 'flags should be Array' unless flags.is_a? Array
         | 
| 29 | 
            -
                        raise ArgumentError, 'metastates should be Array' unless metastate.is_a? Array
         | 
| 28 | 
            +
                        raise ::Appium::Core::Error::ArgumentError, 'flags should be Array' unless flags.is_a? Array
         | 
| 29 | 
            +
                        raise ::Appium::Core::Error::ArgumentError, 'metastates should be Array' unless metastate.is_a? Array
         | 
| 30 30 |  | 
| 31 31 | 
             
                        args             = { keycode: key }
         | 
| 32 32 | 
             
                        args[:metastate] = metastate.reduce(0) { |acc, meta| acc | meta } unless metastate.empty?
         | 
| @@ -36,8 +36,8 @@ module Appium | |
| 36 36 | 
             
                      end
         | 
| 37 37 |  | 
| 38 38 | 
             
                      def long_press_keycode(key, metastate: [], flags: [])
         | 
| 39 | 
            -
                        raise ArgumentError, 'flags should be Array' unless flags.is_a? Array
         | 
| 40 | 
            -
                        raise ArgumentError, 'metastates should be Array' unless metastate.is_a? Array
         | 
| 39 | 
            +
                        raise ::Appium::Core::Error::ArgumentError, 'flags should be Array' unless flags.is_a? Array
         | 
| 40 | 
            +
                        raise ::Appium::Core::Error::ArgumentError, 'metastates should be Array' unless metastate.is_a? Array
         | 
| 41 41 |  | 
| 42 42 | 
             
                        args             = { keycode: key }
         | 
| 43 43 | 
             
                        args[:metastate] = metastate.reduce(0) { |acc, meta| acc | meta } unless metastate.empty?
         | 
| @@ -12,23 +12,19 @@ | |
| 12 12 | 
             
            # See the License for the specific language governing permissions and
         | 
| 13 13 | 
             
            # limitations under the License.
         | 
| 14 14 |  | 
| 15 | 
            -
            require_relative '../touch_action/touch_actions'
         | 
| 16 | 
            -
            require_relative '../touch_action/multi_touch'
         | 
| 17 | 
            -
             | 
| 18 15 | 
             
            module Appium
         | 
| 19 16 | 
             
              module Core
         | 
| 20 17 | 
             
                class Base
         | 
| 21 18 | 
             
                  module Device
         | 
| 22 | 
            -
                    module  | 
| 23 | 
            -
                      def  | 
| 24 | 
            -
                         | 
| 25 | 
            -
                        execute :touch_actions, {}, actions
         | 
| 19 | 
            +
                    module Orientation
         | 
| 20 | 
            +
                      def screen_orientation=(orientation)
         | 
| 21 | 
            +
                        execute :set_screen_orientation, {}, { orientation: orientation }
         | 
| 26 22 | 
             
                      end
         | 
| 27 23 |  | 
| 28 | 
            -
                      def  | 
| 29 | 
            -
                        execute : | 
| 24 | 
            +
                      def screen_orientation
         | 
| 25 | 
            +
                        execute :get_screen_orientation
         | 
| 30 26 | 
             
                      end
         | 
| 31 | 
            -
                    end # module  | 
| 27 | 
            +
                    end # module Orientation
         | 
| 32 28 | 
             
                  end # module Device
         | 
| 33 29 | 
             
                end # class Base
         | 
| 34 30 | 
             
              end # module Core
         | 
| @@ -17,18 +17,17 @@ module Appium | |
| 17 17 | 
             
                module Error
         | 
| 18 18 | 
             
                  class CoreError < StandardError; end
         | 
| 19 19 |  | 
| 20 | 
            -
                  # Capability related errors
         | 
| 21 | 
            -
                  class NoCapabilityError < CoreError; end
         | 
| 22 | 
            -
                  class CapabilityStructureError < CoreError; end
         | 
| 23 | 
            -
             | 
| 24 20 | 
             
                  # Appium related errors
         | 
| 25 21 | 
             
                  class NotSupportedAppiumServer < CoreError; end
         | 
| 26 22 | 
             
                  class NoSuchElementError < CoreError; end
         | 
| 27 23 |  | 
| 28 24 | 
             
                  class UnsupportedOperationError < CoreError; end
         | 
| 29 25 |  | 
| 30 | 
            -
                  # Server side  | 
| 26 | 
            +
                  # Server side errors
         | 
| 31 27 | 
             
                  class ServerError < CoreError; end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                  # ruby_lib_core library specific errors
         | 
| 30 | 
            +
                  class ArgumentError < CoreError; end
         | 
| 32 31 | 
             
                end
         | 
| 33 32 | 
             
              end
         | 
| 34 33 | 
             
            end
         | 
| @@ -44,8 +44,7 @@ module Appium | |
| 44 44 |  | 
| 45 45 | 
             
                  # @since Appium 1.16.0
         | 
| 46 46 | 
             
                  #
         | 
| 47 | 
            -
                  # Logs a custom event. The event is available via {::Appium::Core::Events#get} | 
| 48 | 
            -
                  # <code>@driver.session_capabilities['events']</code> with <code>eventTimings</code> capabilities.
         | 
| 47 | 
            +
                  # Logs a custom event. The event is available via {::Appium::Core::Events#get}.
         | 
| 49 48 | 
             
                  #
         | 
| 50 49 | 
             
                  # @param [String] vendor The vendor prefix for the event
         | 
| 51 50 | 
             
                  # @param [String] event The name of event
         | 
| @@ -54,7 +53,6 @@ module Appium | |
| 54 53 | 
             
                  # @example
         | 
| 55 54 | 
             
                  #
         | 
| 56 55 | 
             
                  #   @driver.logs.event vendor: 'appium', event: 'funEvent'
         | 
| 57 | 
            -
                  #   @driver.session_capabilities['events'] #=> {...., 'appium:funEvent' => 1572957315}
         | 
| 58 56 | 
             
                  #
         | 
| 59 57 | 
             
                  #   @driver.logs.event = { vendor: 'appium', event: 'anotherEvent' }
         | 
| 60 58 | 
             
                  #   @driver.logs.events #=> {...., 'appium:funEvent' => [1572957315, 1572960305],
         | 
| @@ -65,7 +63,10 @@ module Appium | |
| 65 63 | 
             
                  end
         | 
| 66 64 |  | 
| 67 65 | 
             
                  def event=(log_event)
         | 
| 68 | 
            -
                     | 
| 66 | 
            +
                    unless log_event.is_a?(Hash)
         | 
| 67 | 
            +
                      raise ::Appium::Core::Error::ArgumentError,
         | 
| 68 | 
            +
                            'log_event should be Hash like { vendor: "appium", event: "funEvent"}'
         | 
| 69 | 
            +
                    end
         | 
| 69 70 |  | 
| 70 71 | 
             
                    event vendor: log_event[:vendor], event: log_event[:event]
         | 
| 71 72 | 
             
                  end
         | 
| @@ -38,6 +38,8 @@ module Appium | |
| 38 38 | 
             
                    #
         | 
| 39 39 | 
             
                    #     result = Appium::Core::Wait.until { @driver.find_element(:id, 'something') }
         | 
| 40 40 | 
             
                    #
         | 
| 41 | 
            +
                    #     result = Appium::Core::Wait.until(timeout: 30, message: 'timeout') { @driver.find_element(:id, 'something') }
         | 
| 42 | 
            +
                    #
         | 
| 41 43 | 
             
                    #     result = Appium::Core::Wait.until(object: 'some object') { |object|
         | 
| 42 44 | 
             
                    #        @driver.find_element(:id, object)
         | 
| 43 45 | 
             
                    #     }
         | 
| @@ -82,6 +84,8 @@ module Appium | |
| 82 84 | 
             
                    #
         | 
| 83 85 | 
             
                    #     Appium::Core::Wait.until_true { @driver.find_element(:id, 'something') }
         | 
| 84 86 | 
             
                    #
         | 
| 87 | 
            +
                    #     Appium::Core::Wait.until_true(timeout: 30) { @driver.find_element(:id, 'something') }
         | 
| 88 | 
            +
                    #
         | 
| 85 89 | 
             
                    #     Appium::Core::Wait.until_true(object: 'some object') { |object|
         | 
| 86 90 | 
             
                    #        @driver.find_element(:id, object)
         | 
| 87 91 | 
             
                    #     }
         | 
| @@ -133,17 +137,31 @@ module Appium | |
| 133 137 | 
             
                  # @param [String] message Exception message if timed out.
         | 
| 134 138 | 
             
                  # @param [Array, Exception] ignored Exceptions to ignore while polling (default: Exception)
         | 
| 135 139 | 
             
                  #
         | 
| 136 | 
            -
                  # @example
         | 
| 140 | 
            +
                  # @example With core instance
         | 
| 137 141 | 
             
                  #
         | 
| 138 142 | 
             
                  #   @core.wait_true { @driver.find_element :accessibility_id, 'something' }
         | 
| 143 | 
            +
                  #   @core.wait_true(timeout: 30, interval: 2) { @driver.find_element :accessibility_id, 'something' }
         | 
| 144 | 
            +
                  #
         | 
| 145 | 
            +
                  #   @core.wait_until_true { @driver.find_element :accessibility_id, 'something' }
         | 
| 146 | 
            +
                  #   @core.wait_until_true(timeout: 30, interval: 2) { @driver.find_element :accessibility_id, 'something' }
         | 
| 147 | 
            +
                  #
         | 
| 148 | 
            +
                  # @example With driver instance
         | 
| 149 | 
            +
                  #
         | 
| 150 | 
            +
                  #   @driver.wait_true { |d| d.find_element :accessibility_id, 'something' }
         | 
| 151 | 
            +
                  #   @driver.wait_true(timeout: 30, interval: 2) { |d| driver.find_element :accessibility_id, 'something' }
         | 
| 139 152 | 
             
                  #
         | 
| 140 | 
            -
                   | 
| 153 | 
            +
                  #   @driver.wait_until_true { |d| d.find_element :accessibility_id, 'something' }
         | 
| 154 | 
            +
                  #   @driver.wait_until_true(timeout: 30, interval: 2) { |d| driver.find_element :accessibility_id, 'something' }
         | 
| 155 | 
            +
                  #
         | 
| 156 | 
            +
                  def wait_until_true(timeout: nil, interval: nil, message: nil, ignored: nil, &block)
         | 
| 141 157 | 
             
                    Wait.until_true(timeout: timeout || @wait_timeout,
         | 
| 142 158 | 
             
                                    interval: interval || @wait_interval,
         | 
| 143 159 | 
             
                                    message: message,
         | 
| 144 160 | 
             
                                    ignored: ignored,
         | 
| 145 | 
            -
                                    object: self | 
| 161 | 
            +
                                    object: self,
         | 
| 162 | 
            +
                                    &block)
         | 
| 146 163 | 
             
                  end
         | 
| 164 | 
            +
                  alias wait_true wait_until_true
         | 
| 147 165 |  | 
| 148 166 | 
             
                  # Check every interval seconds to see if yield doesn't raise an exception.
         | 
| 149 167 | 
             
                  # Give up after timeout seconds.
         | 
| @@ -155,17 +173,31 @@ module Appium | |
| 155 173 | 
             
                  # @param [String] message Exception message if timed out.
         | 
| 156 174 | 
             
                  # @param [Array, Exception] ignored Exceptions to ignore while polling (default: Exception)
         | 
| 157 175 | 
             
                  #
         | 
| 158 | 
            -
                  # @example
         | 
| 176 | 
            +
                  # @example With core instance
         | 
| 159 177 | 
             
                  #
         | 
| 160 178 | 
             
                  #   @core.wait { @driver.find_element :accessibility_id, 'something' }
         | 
| 179 | 
            +
                  #   @core.wait(timeout: 30, interval: 2) { @driver.find_element :accessibility_id, 'something' }
         | 
| 180 | 
            +
                  #
         | 
| 181 | 
            +
                  #   @core.wait_until { @driver.find_element :accessibility_id, 'something' }
         | 
| 182 | 
            +
                  #   @core.wait_until(timeout: 30, interval: 2) { @driver.find_element :accessibility_id, 'something' }
         | 
| 183 | 
            +
                  #
         | 
| 184 | 
            +
                  # @example With driver instance
         | 
| 185 | 
            +
                  #
         | 
| 186 | 
            +
                  #   @driver.wait { @driver.find_element :accessibility_id, 'something' }
         | 
| 187 | 
            +
                  #   @driver.wait(timeout: 30, interval: 2) { @driver.find_element :accessibility_id, 'something' }
         | 
| 188 | 
            +
                  #
         | 
| 189 | 
            +
                  #   @driver.wait_until { |d| d.find_element :accessibility_id, 'something' }
         | 
| 190 | 
            +
                  #   @driver.wait_until(timeout: 30, interval: 2) { |d| d.find_element :accessibility_id, 'something' }
         | 
| 161 191 | 
             
                  #
         | 
| 162 | 
            -
                  def  | 
| 192 | 
            +
                  def wait_until(timeout: nil, interval: nil, message: nil, ignored: nil, &block)
         | 
| 163 193 | 
             
                    Wait.until(timeout: timeout || @wait_timeout,
         | 
| 164 194 | 
             
                               interval: interval || @wait_interval,
         | 
| 165 195 | 
             
                               message: message,
         | 
| 166 196 | 
             
                               ignored: ignored,
         | 
| 167 | 
            -
                               object: self | 
| 197 | 
            +
                               object: self,
         | 
| 198 | 
            +
                               &block)
         | 
| 168 199 | 
             
                  end
         | 
| 200 | 
            +
                  alias wait wait_until
         | 
| 169 201 | 
             
                end
         | 
| 170 202 | 
             
              end # module Core
         | 
| 171 203 | 
             
            end # module Appium
         | 
| @@ -29,17 +29,15 @@ module Appium | |
| 29 29 | 
             
                        :hide_keyboard, :is_keyboard_shown,
         | 
| 30 30 | 
             
                        :ime_activate, :ime_available_engines, :ime_active_engine, :ime_activated, :ime_deactivate,
         | 
| 31 31 | 
             
                        :get_settings, :update_settings,
         | 
| 32 | 
            -
                        :within_context, : | 
| 33 | 
            -
                        :set_immediate_value, :replace_value,
         | 
| 32 | 
            +
                        :within_context, :current_context, :available_contexts, :set_context,
         | 
| 34 33 | 
             
                        :push_file, :pull_file, :pull_folder,
         | 
| 35 34 | 
             
                        :keyevent, :press_keycode, :long_press_keycode,
         | 
| 36 35 | 
             
                        :match_images_features, :find_image_occurrence, :get_images_similarity, :compare_images,
         | 
| 37 | 
            -
                        : | 
| 36 | 
            +
                        :app_strings, :background_app,
         | 
| 38 37 | 
             
                        :install_app, :remove_app, :app_installed?, :activate_app, :terminate_app,
         | 
| 39 38 | 
             
                        :app_state,
         | 
| 40 39 | 
             
                        :stop_recording_screen, :stop_and_save_recording_screen,
         | 
| 41 40 | 
             
                        :shake, :device_time,
         | 
| 42 | 
            -
                        :touch_actions, :multi_touch,
         | 
| 43 41 | 
             
                        :execute_driver, :execute_cdp
         | 
| 44 42 | 
             
                      ].each(&method(:delegate_from_appium_driver))
         | 
| 45 43 | 
             
                    end
         | 
| @@ -79,11 +77,7 @@ module Appium | |
| 79 77 | 
             
                    end
         | 
| 80 78 |  | 
| 81 79 | 
             
                    def create_bridge_command(method, &block)
         | 
| 82 | 
            -
                      ::Appium::Core::Base::Bridge | 
| 83 | 
            -
                        undef_method method if method_defined? method
         | 
| 84 | 
            -
                        block_given? ? class_eval(&block) : define_method(method) { execute method }
         | 
| 85 | 
            -
                      end
         | 
| 86 | 
            -
                      ::Appium::Core::Base::Bridge::W3C.class_eval do
         | 
| 80 | 
            +
                      ::Appium::Core::Base::Bridge.class_eval do
         | 
| 87 81 | 
             
                        undef_method method if method_defined? method
         | 
| 88 82 | 
             
                        block_given? ? class_eval(&block) : define_method(method) { execute method }
         | 
| 89 83 | 
             
                      end
         |