• APP自动化测试-11.webview技术原理


    APP自动化测试-11.webview技术原理



    前言

    根据日志,简单记录webview运行的机制


    脚本:

    from time import sleep
    
    import pytest
    from appium import webdriver
    from appium.webdriver.common.appiumby import AppiumBy
    from selenium.webdriver.common.by import By
    
    
    class TestHybrid:
    
        def setup(self):
            desired_caps = {
                "platformName": "android",
                "appium:deviceName": "b1f37e8e",
                "appium:appPackage": "io.appium.android.apis",
                "appium:appActivity": ".ApiDemos",
                "chromedriverExecutableDir": "/Users/gaozeyu/tools/chromedriverdir",
                "chromedriverChromeMappingFile": "/Users/gaozeyu/PycharmProjects/test_appium/testcase/mapping.json"
            }
    
            self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
    
            # 设置隐式等待
            self.driver.implicitly_wait(10)
    
        def teardown(self):
            self.driver.quit()
    
        def test_hybrid(self):
            sleep(3)
            self.driver.find_element(AppiumBy.ACCESSIBILITY_ID, 'Views').click()
            webview = "WebView"
            self.driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, f'new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().text("{webview}").instance(0));').click()
    
            print(self.driver.contexts)
            # 切换上下文,由原生切换至webview
            self.driver.switch_to.context(self.driver.contexts[-1])
            self.driver.find_element(By.XPATH, '//*[@id="i_am_a_textbox"]').send_keys("this is a test message")
    
            # 窗口切换
            print(self.driver.window_handles)
            self.driver.find_element(By.XPATH, '//*[@id="i am a link"]').click()
            print(self.driver.window_handles)
    
            sleep(3)
    
            if __name__ == 'main':
                pytest.main()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    一、获取webview

    第一次调用webview脚本代码:

    print(self.driver.contexts)
    
    • 1

    日志文件分析:

    2022-08-11 09:03:28:560 [HTTP] --> GET /wd/hub/session/d2d0b17c-fb8b-4422-93e3-a65e327eefdb/contexts
    2022-08-11 09:03:28:560 [HTTP] {}
    2022-08-11 09:03:28:561 [W3C (d2d0b17c)] Calling AppiumDriver.getContexts() with args: ["d2d0b17c-fb8b-4422-93e3-a65e327eefdb"]
    2022-08-11 09:03:28:561 [AndroidDriver] Getting a list of available webviews
    2022-08-11 09:03:28:565 [ADB] Running '/Users/gaozeyu/Library/Android/sdk/platform-tools/adb -P 5037 -s b1f37e8e shell cat /proc/net/unix'
    2022-08-11 09:03:28:630 [AndroidDriver] Parsed 1 active devtools socket: ["@webview_devtools_remote_12270"]
    2022-08-11 09:03:28:631 [AndroidDriver] Collecting CDP data of 1 webview
    2022-08-11 09:03:28:631 [AndroidDriver] Forwarding remote port webview_devtools_remote_12270 to a local port in range 10900..11000
    2022-08-11 09:03:28:631 [AndroidDriver] You could use the 'webviewDevtoolsPort' capability to customize the starting port number
    2022-08-11 09:03:28:636 [ADB] Running '/Users/test/Library/Android/sdk/platform-tools/adb -P 5037 -s b1f37e8e forward tcp:10900 localabstract:webview_devtools_remote_12270'
    2022-08-11 09:03:28:672 [ADB] Removing forwarded port socket connection: 10900 
    2022-08-11 09:03:28:673 [ADB] Running '/Users/test/Library/Android/sdk/platform-tools/adb -P 5037 -s b1f37e8e forward --remove tcp:10900'
    2022-08-11 09:03:28:693 [AndroidDriver] CDP data collection completed
    2022-08-11 09:03:28:693 [AndroidDriver] WEBVIEW_12270 mapped to pid 12270
    2022-08-11 09:03:28:693 [AndroidDriver] Getting process name for webview 'WEBVIEW_12270'
    2022-08-11 09:03:28:693 [ADB] Running '/Users/test/Library/Android/sdk/platform-tools/adb -P 5037 -s b1f37e8e shell ps -A'
    2022-08-11 09:03:28:821 [AndroidDriver] Got process name: 'io.appium.android.apis'
    2022-08-11 09:03:28:822 [AndroidDriver] Found 1 webview: ["WEBVIEW_io.appium.android.apis"]
    2022-08-11 09:03:28:822 [AndroidDriver] Available contexts: ["NATIVE_APP","WEBVIEW_io.appium.android.apis"]
    2022-08-11 09:03:28:823 [W3C (d2d0b17c)] Responding to client with driver.getContexts() result: ["NATIVE_APP","WEBVIEW_io.appium.android.apis"]
    2022-08-11 09:03:28:823 [HTTP] <-- GET /wd/hub/session/d2d0b17c-fb8b-4422-93e3-a65e327eefdb/contexts 200 263 ms - 57
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
      1. appium server 接收到获取contexts的请求
    [HTTP] --> GET /wd/hub/session/d2d0b17c-fb8b-4422-93e3-a65e327eefdb/contexts
    
    • 1
      1. 调用AppiumDriver.getContexts()方法,获取contexts,此时获取到1个可用的webview的list
    [W3C (d2d0b17c)] Calling AppiumDriver.getContexts() with args: ["d2d0b17c-fb8b-4422-93e3-a65e327eefdb"]
    [AndroidDriver] Getting a list of available webviews
    
    • 1
    • 2
      1. adb命令查看手机端的监听
    adb -P 5037 -s b1f37e8e shell cat /proc/net/unix'
    
    • 1
      1. 获取webview所有的socket
    adb shell cat /proc/net/unix | grep webview
    
    • 1
      1. 根据获取的webview的socket,查询进程
    # pid为进程号
    adb shell ps | grep pid
    
    • 1
    • 2
      1. 获取进程名称和webview,返回给客户端
    [AndroidDriver] Got process name: 'io.appium.android.apis'
    [AndroidDriver] Found 1 webview: ["WEBVIEW_io.appium.android.apis"]
    [AndroidDriver] Available contexts: ["NATIVE_APP","WEBVIEW_io.appium.android.apis"]
    [W3C (d2d0b17c)] Responding to client with driver.getContexts() result: ["NATIVE_APP","WEBVIEW_io.appium.android.apis"]
    [HTTP] <-- GET /wd/hub/session/d2d0b17c-fb8b-4422-93e3-a65e327eefdb/contexts 200 329 ms - 57
    
    • 1
    • 2
    • 3
    • 4
    • 5

    二、根据webview启动chromedriver

    第二次调用webview脚本代码:

    self.driver.switch_to.context(self.driver.contexts[-1])
    
    • 1

    日志分析:

    2022-08-11 09:03:28:825 [HTTP] --> POST /wd/hub/session/d2d0b17c-fb8b-4422-93e3-a65e327eefdb/context
    2022-08-11 09:03:28:825 [HTTP] {"name":"WEBVIEW_io.appium.android.apis"}
    2022-08-11 09:03:28:826 [W3C (d2d0b17c)] Calling AppiumDriver.setContext() with args: ["WEBVIEW_io.appium.android.apis","d2d0b17c-fb8b-4422-93e3-a65e327eefdb"]
    2022-08-11 09:03:28:826 [AndroidDriver] Getting a list of available webviews
    2022-08-11 09:03:28:827 [ADB] Running '/Users/test/Library/Android/sdk/platform-tools/adb -P 5037 -s b1f37e8e shell cat /proc/net/unix'
    2022-08-11 09:03:28:898 [AndroidDriver] Parsed 1 active devtools socket: ["@webview_devtools_remote_12270"]
    2022-08-11 09:03:28:899 [AndroidDriver] Collecting CDP data of 1 webview
    2022-08-11 09:03:28:899 [AndroidDriver] Forwarding remote port webview_devtools_remote_12270 to a local port in range 10900..11000
    2022-08-11 09:03:28:899 [AndroidDriver] You could use the 'webviewDevtoolsPort' capability to customize the starting port number
    2022-08-11 09:03:28:900 [ADB] Running '/Users/test/Library/Android/sdk/platform-tools/adb -P 5037 -s b1f37e8e forward tcp:10900 localabstract:webview_devtools_remote_12270'
    2022-08-11 09:03:28:926 [ADB] Removing forwarded port socket connection: 10900 
    2022-08-11 09:03:28:927 [ADB] Running '/Users/test/Library/Android/sdk/platform-tools/adb -P 5037 -s b1f37e8e forward --remove tcp:10900'
    2022-08-11 09:03:28:945 [AndroidDriver] CDP data collection completed
    2022-08-11 09:03:28:946 [AndroidDriver] WEBVIEW_12270 mapped to pid 12270
    2022-08-11 09:03:28:946 [AndroidDriver] Getting process name for webview 'WEBVIEW_12270'
    2022-08-11 09:03:28:946 [ADB] Running '/Users/test/Library/Android/sdk/platform-tools/adb -P 5037 -s b1f37e8e shell ps -A'
    2022-08-11 09:03:29:061 [AndroidDriver] Got process name: 'io.appium.android.apis'
    2022-08-11 09:03:29:062 [AndroidDriver] Found 1 webview: ["WEBVIEW_io.appium.android.apis"]
    2022-08-11 09:03:29:062 [AndroidDriver] Available contexts: ["NATIVE_APP","WEBVIEW_io.appium.android.apis"]
    2022-08-11 09:03:29:062 [AndroidDriver] Connecting to chrome-backed webview context 'WEBVIEW_io.appium.android.apis'
    2022-08-11 09:03:29:064 [AndroidDriver] A port was not given, using random free port: 8000
    2022-08-11 09:03:29:064 [AndroidDriver] Passing web view details to the Chromedriver constructor: {
    2022-08-11 09:03:29:064 [AndroidDriver]   "info": {
    2022-08-11 09:03:29:064 [AndroidDriver]     "Android-Package": "io.appium.android.apis",
    2022-08-11 09:03:29:064 [AndroidDriver]     "Browser": "Chrome/92.0.4515.131",
    2022-08-11 09:03:29:064 [AndroidDriver]     "Protocol-Version": "1.3",
    2022-08-11 09:03:29:064 [AndroidDriver]     "User-Agent": "Mozilla/5.0 (Linux; Android 11; Redmi K30 5G Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/92.0.4515.131 Mobile Safari/537.36",
    2022-08-11 09:03:29:064 [AndroidDriver]     "V8-Version": "9.2.230.22",
    2022-08-11 09:03:29:064 [AndroidDriver]     "WebKit-Version": "537.36 (@6b8d6c56ce21e38a72f7c4becb5abc1fa5134f29)",
    2022-08-11 09:03:29:064 [AndroidDriver]     "webSocketDebuggerUrl": "ws://127.0.0.1:10900/devtools/browser"
    2022-08-11 09:03:29:065 [AndroidDriver]   },
    2022-08-11 09:03:29:065 [AndroidDriver]   "process": {
    2022-08-11 09:03:29:065 [AndroidDriver]     "name": "io.appium.android.apis",
    2022-08-11 09:03:29:065 [AndroidDriver]     "id": "12270"
    2022-08-11 09:03:29:065 [AndroidDriver]   }
    2022-08-11 09:03:29:065 [AndroidDriver] }
    2022-08-11 09:03:29:065 [AndroidDriver] Automated Chromedriver download is disabled. Use 'chromedriver_autodownload' server feature to enable it
    2022-08-11 09:03:29:066 [AndroidDriver] Precalculated Chromedriver capabilities: {
    2022-08-11 09:03:29:066 [AndroidDriver]   "androidPackage": "io.appium.android.apis",
    2022-08-11 09:03:29:066 [AndroidDriver]   "androidUseRunningApp": true,
    2022-08-11 09:03:29:066 [AndroidDriver]   "androidProcess": "io.appium.android.apis",
    2022-08-11 09:03:29:067 [AndroidDriver]   "androidDeviceSerial": "b1f37e8e"
    2022-08-11 09:03:29:067 [AndroidDriver] }
    2022-08-11 09:03:29:067 [AndroidDriver] Before starting chromedriver, androidPackage is 'io.appium.android.apis'
    2022-08-11 09:03:29:067 [Chromedriver] Changed state to 'starting'
    2022-08-11 09:03:29:067 [Chromedriver] Attempting to use Chromedriver->Chrome mapping from '/Users/test/PycharmProjects/test_appium/testcase/mapping.json'
    2022-08-11 09:03:29:069 [Chromedriver] The most recent known Chrome version: 104.0.5112
    2022-08-11 09:03:29:072 [Chromedriver] Found 131 executables in '/Users/test/tools/chromedriverdir'
    Chromedriver binary. Make sure it returns a valid version string in response to '--version/]' command line argument. spawn Unknown system error -86
    2022-08-11 09:03:29:666 [Chromedriver] Cannot retrieve version number from 'mapping.json' Chromedriver binary. Make sure it returns a valid version string in response to '--version' command line argument. spawn /Users/gaozeyu/tools/chromedriverdir/mapping.json EACCES
    2022-08-11 09:03:29:684 [Chromedriver] The following Chromedriver executables were found:
    2022-08-11 09:03:29:689 [Chromedriver]     '/Users/test/tools/chromedriverdir/chromedriver-93-0-4577-63' (version '93.0.4577.63', minimum Chrome version '93.0.4577')
    2022-08-11 09:03:29:689 [Chromedriver]     '/Users/test/tools/chromedriverdir/chromedriver-93-0-4577-15' (version '93.0.4577.15', minimum Chrome version '93.0.4577')
    2022-08-11 09:03:29:689 [Chromedriver]     '/Users/test/tools/chromedriverdir/chromedriver-92-0-4515-107' (version '92.0.4515.107', minimum Chrome version '92.0.4515')
    2022-08-11 09:03:29:689 [Chromedriver]     '/Users/test/tools/chromedriverdir/chromedriver-92-0-4515-43' (version '92.0.4515.43', minimum Chrome version '92.0.4515')
    2022-08-11 09:03:29:695 [Chromedriver] Browser version in the supplied details: Chrome/92.0.4515.131
    2022-08-11 09:03:29:695 [Chromedriver] Found Chrome bundle 'undefined' version '92.0.4515'
    2022-08-11 09:03:29:696 [Chromedriver] Found 2 executables capable of automating Chrome '92.0.4515'.
    2022-08-11 09:03:29:696 [Chromedriver] Choosing the most recent, '/Users/test/tools/chromedriverdir/chromedriver-92-0-4515-107'.
    2022-08-11 09:03:29:696 [Chromedriver] If a specific version is required, specify it with the `chromedriverExecutable`desired capability.
    2022-08-11 09:03:29:697 [Chromedriver] Set chromedriver binary as: /Users/gaozeyu/tools/chromedriverdir/chromedriver-92-0-4515-107
    2022-08-11 09:03:29:697 [Chromedriver] Killing any old chromedrivers, running: pkill -15 -f "/Users/test/tools/chromedriverdir/chromedriver-92-0-4515-107.*--port=8000"
    2022-08-11 09:03:29:735 [Chromedriver] No old chromedrivers seem to exist
    2022-08-11 09:03:29:735 [Chromedriver] Cleaning this device\'s adb forwarded port socket connections: b1f37e8e
    2022-08-11 09:03:29:735 [ADB] List forwarding ports
    2022-08-11 09:03:29:735 [ADB] Running '/Users/test/Library/Android/sdk/platform-tools/adb -P 5037 -s b1f37e8e forward --list'
    2022-08-11 09:03:29:752 [Chromedriver] Spawning chromedriver with: /Users/test/tools/chromedriverdir/chromedriver-92-0-4515-107 --url-base=wd/hub --port=8000 --adb-port=5037 --verbose
    2022-08-11 09:03:29:764 [Chromedriver] Chromedriver version: '92.0.4515.107'
    2022-08-11 09:03:29:765 [WD Proxy] Matched '/status' to command name 'getStatus'
    2022-08-11 09:03:29:766 [WD Proxy] Proxying [GET /status] to [GET http://127.0.0.1:8000/wd/hub/status] with no body
    2022-08-11 09:03:29:773 [WD Proxy] Got response with status 200: {"value":{"build":{"version":"92.0.4515.107 (87a818b10553a07434ea9e2b6dccf3cbe7895134-refs/branch-heads/4515@{#1634})"},"message":"ChromeDriver ready for new sessions.","os":{"arch":"x86_64","name":"Mac OS X","version":"12.3.1"},"ready":true}}
    2022-08-11 09:03:29:773 [Chromedriver] Starting W3C Chromedriver session with capabilities: {
    2022-08-11 09:03:29:773 [Chromedriver]   "capabilities": {
    2022-08-11 09:03:29:773 [Chromedriver]     "alwaysMatch": {
    2022-08-11 09:03:29:773 [Chromedriver]       "goog:chromeOptions": {
    2022-08-11 09:03:29:773 [Chromedriver]         "androidPackage": "io.appium.android.apis",
    2022-08-11 09:03:29:773 [Chromedriver]         "androidUseRunningApp": true,
    2022-08-11 09:03:29:773 [Chromedriver]         "androidProcess": "io.appium.android.apis",
    2022-08-11 09:03:29:773 [Chromedriver]         "androidDeviceSerial": "b1f37e8e"
    2022-08-11 09:03:29:773 [Chromedriver]       },
    2022-08-11 09:03:29:773 [Chromedriver]       "goog:loggingPrefs": {
    2022-08-11 09:03:29:774 [Chromedriver]         "browser": "ALL"
    2022-08-11 09:03:29:774 [Chromedriver]       }
    2022-08-11 09:03:29:774 [Chromedriver]     }
    2022-08-11 09:03:29:774 [Chromedriver]   }
    2022-08-11 09:03:29:774 [Chromedriver] }
    2022-08-11 09:03:29:774 [WD Proxy] Matched '/session' to command name 'createSession'
    2022-08-11 09:03:29:774 [WD Proxy] Proxying [POST /session] to [POST http://127.0.0.1:8000/wd/hub/session] with body: {"capabilities":{"alwaysMatch":{"goog:chromeOptions":{"androidPackage":"io.appium.android.apis","androidUseRunningApp":true,"androidProcess":"io.appium.android.apis","androidDeviceSerial":"b1f37e8e"},"goog:loggingPrefs":{"browser":"ALL"}}}}
    2022-08-11 09:03:30:043 [Chromedriver] Webview version: 'Chrome/92.0.4515.131'
    2022-08-11 09:03:30:102 [WD Proxy] Got response with status 200: {"value":{"capabilities":{"acceptInsecureCerts":false,"browserName":"chrome","browserVersion":"92.0.4515.131","chrome":{"chromedriverVersion":"92.0.4515.107 (87a818b10553a07434ea9e2b6dccf3cbe7895134-refs/branch-heads/4515@{#1634})"},"goog:chromeOptions":{"debuggerAddress":"localhost:61565"},"pageLoadStrategy":"normal","platformName":"android","proxy":{},"setWindowRect":false,"strictFileInteractability":false,"timeouts":{"implicit":0,"pageLoad":300000,"script":30000},"unhandledPromptBehavior":"dismiss and notify","webauthn:extension:credBlob":false,"webauthn:extension:largeBlob":false,"webauthn:virtualAuthenticators":false},"sessionId":"a650da032b9d8e2475052559bee24982"}}
    2022-08-11 09:03:30:103 [WD Proxy] Determined the downstream protocol as 'W3C'
    2022-08-11 09:03:30:103 [Chromedriver] Changed state to 'online'
    2022-08-11 09:03:30:103 [W3C (d2d0b17c)] Responding to client with driver.setContext() result: null
    2022-08-11 09:03:30:104 [HTTP] <-- POST /wd/hub/session/d2d0b17c-fb8b-4422-93e3-a65e327eefdb/context 200 1278 ms - 14
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
      1. 根据获取到的webview进程和进程ID,把参数传给chromedriver的构造器
    2022-08-11 09:03:28:946 [AndroidDriver] WEBVIEW_12270 mapped to pid 12270
    2022-08-11 09:03:28:946 [AndroidDriver] Getting process name for webview 'WEBVIEW_12270'
    2022-08-11 09:03:28:946 [ADB] Running '/Users/test/Library/Android/sdk/platform-tools/adb -P 5037 -s b1f37e8e shell ps -A'
    2022-08-11 09:03:29:061 [AndroidDriver] Got process name: 'io.appium.android.apis'
    2022-08-11 09:03:29:062 [AndroidDriver] Found 1 webview: ["WEBVIEW_io.appium.android.apis"]
    2022-08-11 09:03:29:062 [AndroidDriver] Available contexts: ["NATIVE_APP","WEBVIEW_io.appium.android.apis"]
    2022-08-11 09:03:29:062 [AndroidDriver] Connecting to chrome-backed webview context 'WEBVIEW_io.appium.android.apis'
    2022-08-11 09:03:29:064 [AndroidDriver] A port was not given, using random free port: 8000
    2022-08-11 09:03:29:064 [AndroidDriver] Passing web view details to the Chromedriver constructor: {
    2022-08-11 09:03:29:064 [AndroidDriver]   "info": {
    2022-08-11 09:03:29:064 [AndroidDriver]     "Android-Package": "io.appium.android.apis",
    2022-08-11 09:03:29:064 [AndroidDriver]     "Browser": "Chrome/92.0.4515.131",
    2022-08-11 09:03:29:064 [AndroidDriver]     "Protocol-Version": "1.3",
    2022-08-11 09:03:29:064 [AndroidDriver]     "User-Agent": "Mozilla/5.0 (Linux; Android 11; Redmi K30 5G Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/92.0.4515.131 Mobile Safari/537.36",
    2022-08-11 09:03:29:064 [AndroidDriver]     "V8-Version": "9.2.230.22",
    2022-08-11 09:03:29:064 [AndroidDriver]     "WebKit-Version": "537.36 (@6b8d6c56ce21e38a72f7c4becb5abc1fa5134f29)",
    2022-08-11 09:03:29:064 [AndroidDriver]     "webSocketDebuggerUrl": "ws://127.0.0.1:10900/devtools/browser"
    2022-08-11 09:03:29:065 [AndroidDriver]   },
    2022-08-11 09:03:29:065 [AndroidDriver]   "process": {
    2022-08-11 09:03:29:065 [AndroidDriver]     "name": "io.appium.android.apis",
    2022-08-11 09:03:29:065 [AndroidDriver]     "id": "12270"
    2022-08-11 09:03:29:065 [AndroidDriver]   }
    2022-08-11 09:03:29:065 [AndroidDriver] }
    2022-08-11 09:03:29:065 [AndroidDriver] Automated Chromedriver download is disabled. Use 'chromedriver_autodownload' server feature to enable it
    2022-08-11 09:03:29:066 [AndroidDriver] Precalculated Chromedriver capabilities: {
    2022-08-11 09:03:29:066 [AndroidDriver]   "androidPackage": "io.appium.android.apis",
    2022-08-11 09:03:29:066 [AndroidDriver]   "androidUseRunningApp": true,
    2022-08-11 09:03:29:066 [AndroidDriver]   "androidProcess": "io.appium.android.apis",
    2022-08-11 09:03:29:067 [AndroidDriver]   "androidDeviceSerial": "b1f37e8e"
    2022-08-11 09:03:29:067 [AndroidDriver] }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
      1. 根据chromedriverChromeMappingFile定义的mapping文件,在chromedriverExecutableDir定义的目录中查找对应app中chromedriver版本
    2022-08-11 09:03:29:067 [Chromedriver] Changed state to 'starting'
    2022-08-11 09:03:29:067 [Chromedriver] Attempting to use Chromedriver->Chrome mapping from '/Users/test/PycharmProjects/test_appium/testcase/mapping.json'
    2022-08-11 09:03:29:069 [Chromedriver] The most recent known Chrome version: 104.0.5112
    2022-08-11 09:03:29:072 [Chromedriver] Found 131 executables in '/Users/test/tools/chromedriverdir'
    Chromedriver binary. Make sure it returns a valid version string in response to '--version/]' command line argument. spawn Unknown system error -86
    2022-08-11 09:03:29:666 [Chromedriver] Cannot retrieve version number from 'mapping.json' Chromedriver binary. Make sure it returns a valid version string in response to '--version' command line argument. spawn /Users/gaozeyu/tools/chromedriverdir/mapping.json EACCES
    2022-08-11 09:03:29:684 [Chromedriver] The following Chromedriver executables were found:
    2022-08-11 09:03:29:689 [Chromedriver]     '/Users/test/tools/chromedriverdir/chromedriver-93-0-4577-63' (version '93.0.4577.63', minimum Chrome version '93.0.4577')
    2022-08-11 09:03:29:689 [Chromedriver]     '/Users/test/tools/chromedriverdir/chromedriver-93-0-4577-15' (version '93.0.4577.15', minimum Chrome version '93.0.4577')
    2022-08-11 09:03:29:689 [Chromedriver]     '/Users/test/tools/chromedriverdir/chromedriver-92-0-4515-107' (version '92.0.4515.107', minimum Chrome version '92.0.4515')
    2022-08-11 09:03:29:689 [Chromedriver]     '/Users/test/tools/chromedriverdir/chromedriver-92-0-4515-43' (version '92.0.4515.43', minimum Chrome version '92.0.4515')
    2022-08-11 09:03:29:695 [Chromedriver] Browser version in the supplied details: Chrome/92.0.4515.131
    2022-08-11 09:03:29:695 [Chromedriver] Found Chrome bundle 'undefined' version '92.0.4515'
    2022-08-11 09:03:29:696 [Chromedriver] Found 2 executables capable of automating Chrome '92.0.4515'.
    2022-08-11 09:03:29:696 [Chromedriver] Choosing the most recent, '/Users/test/tools/chromedriverdir/chromedriver-92-0-4515-107'.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
      1. 匹配版本完成后,先kill掉对应版本的chromedriver进程,然后以默认8000端口,启动chromedriver
    2022-08-11 09:03:29:697 [Chromedriver] Killing any old chromedrivers, running: pkill -15 -f "/Users/test/tools/chromedriverdir/chromedriver-92-0-4515-107.*--port=8000"
    2022-08-11 09:03:29:735 [Chromedriver] No old chromedrivers seem to exist
    2022-08-11 09:03:29:735 [Chromedriver] Cleaning this device\'s adb forwarded port socket connections: b1f37e8e
    2022-08-11 09:03:29:735 [ADB] List forwarding ports
    2022-08-11 09:03:29:735 [ADB] Running '/Users/test/Library/Android/sdk/platform-tools/adb -P 5037 -s b1f37e8e forward --list'
    2022-08-11 09:03:29:752 [Chromedriver] Spawning chromedriver with: /Users/test/tools/chromedriverdir/chromedriver-92-0-4515-107 --url-base=wd/hub --port=8000 --adb-port=5037 --verbose
    2022-08-11 09:03:29:764 [Chromedriver] Chromedriver version: '92.0.4515.107'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
      1. 本地的get Status和启动的8000/status进行映射,获取状态
    2022-08-11 09:03:29:765 [WD Proxy] Matched '/status' to command name 'getStatus'
    2022-08-11 09:03:29:766 [WD Proxy] Proxying [GET /status] to [GET http://127.0.0.1:8000/wd/hub/status] with no body
    2022-08-11 09:03:29:773 [WD Proxy] Got response with status 200: {"value":{"build":{"version":"92.0.4515.107 (87a818b10553a07434ea9e2b6dccf3cbe7895134-refs/branch-heads/4515@{#1634})"},"message":"ChromeDriver ready for new sessions.","os":{"arch":"x86_64","name":"Mac OS X","version":"12.3.1"},"ready":true}}
    
    • 1
    • 2
    • 3
      1. 本地的createSession与/session进行映射,根据capabilities参数创建session,,返回sessionId
    2022-08-12 08:05:05:762 [Chromedriver] Starting W3C Chromedriver session with capabilities: {
    2022-08-12 08:05:05:762 [Chromedriver]   "capabilities": {
    2022-08-12 08:05:05:762 [Chromedriver]     "alwaysMatch": {
    2022-08-12 08:05:05:762 [Chromedriver]       "goog:chromeOptions": {
    2022-08-12 08:05:05:762 [Chromedriver]         "androidPackage": "io.appium.android.apis",
    2022-08-12 08:05:05:762 [Chromedriver]         "androidUseRunningApp": true,
    2022-08-12 08:05:05:762 [Chromedriver]         "androidProcess": "io.appium.android.apis",
    2022-08-12 08:05:05:762 [Chromedriver]         "androidDeviceSerial": "b1f37e8e"
    2022-08-12 08:05:05:763 [Chromedriver]       },
    2022-08-12 08:05:05:763 [Chromedriver]       "goog:loggingPrefs": {
    2022-08-12 08:05:05:763 [Chromedriver]         "browser": "ALL"
    2022-08-12 08:05:05:763 [Chromedriver]       }
    2022-08-12 08:05:05:763 [Chromedriver]     }
    2022-08-12 08:05:05:763 [Chromedriver]   }
    2022-08-12 08:05:05:763 [Chromedriver] }
    2022-08-12 08:05:05:763 [WD Proxy] Matched '/session' to command name 'createSession'
    2022-08-12 08:05:05:763 [WD Proxy] Proxying [POST /session] to [POST http://127.0.0.1:8000/wd/hub/session] with body: {"capabilities":{"alwaysMatch":{"goog:chromeOptions":{"androidPackage":"io.appium.android.apis","androidUseRunningApp":true,"androidProcess":"io.appium.android.apis","androidDeviceSerial":"b1f37e8e"},"goog:loggingPrefs":{"browser":"ALL"}}}}
    2022-08-12 08:05:06:031 [Chromedriver] Webview version: 'Chrome/92.0.4515.131'
    2022-08-12 08:05:06:101 [WD Proxy] Got response with status 200: {"value":{"capabilities":{"acceptInsecureCerts":false,"browserName":"chrome","browserVersion":"92.0.4515.131","chrome":{"chromedriverVersion":"92.0.4515.107 (87a818b10553a07434ea9e2b6dccf3cbe7895134-refs/branch-heads/4515@{#1634})"},"goog:chromeOptions":{"debuggerAddress":"localhost:59524"},"pageLoadStrategy":"normal","platformName":"android","proxy":{},"setWindowRect":false,"strictFileInteractability":false,"timeouts":{"implicit":0,"pageLoad":300000,"script":30000},"unhandledPromptBehavior":"dismiss and notify","webauthn:extension:credBlob":false,"webauthn:extension:largeBlob":false,"webauthn:virtualAuthenticators":false},"sessionId":"02fc7705e267e9cc53a63f8500b68c7e"}
    2022-08-12 08:05:06:102 [WD Proxy] Determined the downstream protocol as 'W3C'
    2022-08-12 08:05:06:102 [Chromedriver] Changed state to 'online'
    2022-08-12 08:05:06:102 [WD Proxy] Determined the downstream protocol as 'W3C'
    2022-08-12 08:05:06:102 [Chromedriver] Changed state to 'online'
    2022-08-12 08:05:06:102 [W3C (f90fdb4c)] Responding to client with driver.setContext() result: null
    2022-08-12 08:05:06:103 [HTTP] <-- POST /wd/hub/session/f90fdb4c-ffed-4ba3-8b38-b9e2c986f357/context 200 1543 ms - 14
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
      1. 后续日志为元素定位,与web端一致

    总结

    appium操作webview基本就是接受客户端的请求,然后appium-server把请求转发给chrome-driver,进行操作,底层还是selenium

  • 相关阅读:
    【redis】字符串
    vue.js中使用三元运算符设置动态样式
    H3CNE-构建中小企业网络全套培训PPT汇总【V7版本】
    ​主机安全是什么以及​主机安全的功能和价值分析
    线程的基本操作
    Python:腾讯云-轻量应用服务器-实现自动快照
    英诺森 “供应链智能数据平台”荣获“科技进步奖”
    Ubuntu系统配置DDNS-GO【笔记】
    Gof23设计模式之策略模式
    docker 安装 nginx 镜像 保姆级别教程
  • 原文地址:https://blog.csdn.net/weixin_42517691/article/details/126289328