WebView在Appium Inspector中被视为本机视图,无法切换到WebView查找元素

WebView在Appium Inspector中被视为本机视图,无法切换到WebView查找元素,appium,wkwebview,appium-ios,Appium,Wkwebview,Appium Ios,我正在测试一个混合iOS移动应用程序。前两个屏幕是本机屏幕,然后是注册流,即WebView,注册后应用程序返回本机 我的问题是,对于WebView屏幕,Appium Inspector向我显示它,就好像它是一个本机屏幕一样。它为我提供了类似于本机元素的xpath标识符(但在实际测试中识别速度非常慢) 此外,我似乎无法像与web元素一样与Appium中的那些屏幕进行交互。当我试图使用web元素的id识别它们时,Appium说css选择器不是有效的定位策略。我曾尝试添加一行代码,如果它找到一个web

我正在测试一个混合iOS移动应用程序。前两个屏幕是本机屏幕,然后是注册流,即WebView,注册后应用程序返回本机

我的问题是,对于WebView屏幕,Appium Inspector向我显示它,就好像它是一个本机屏幕一样。它为我提供了类似于本机元素的xpath标识符(但在实际测试中识别速度非常慢)

此外,我似乎无法像与web元素一样与Appium中的那些屏幕进行交互。当我试图使用web元素的id识别它们时,Appium说css选择器不是有效的定位策略。我曾尝试添加一行代码,如果它找到一个webview,就会切换到webview,但坦率地说,我在appium日志中没有看到任何迹象表明它确实尝试了这一点(尽管它也没有显示错误)

我不明白这里发生了什么,我想知道

我正在使用Appium 1.13.0和1.14.0,在模拟器(12.2)上运行iOS应用程序。我使用的是从中派生的代码库

Appium Inspector中的元素如下所示:

<XCUIElementTypeTextField type="XCUIElementTypeTextField" value="Username" label="" enabled="true" visible="true" x="40" y="224" width="294" height="60"/>
但在浏览器中,元素如下所示:

//XCUIElementTypeOther[@name="Login from mobile"]/XCUIElementTypeOther[4]/XCUIElementTypeTextField
<input id="username" name="username" placeholder="Username" type="text">
config.capabilities = [
    {
        // The defaults you need to have in your config
        // browserName: 'safari',
        platformName: 'iOS',
        maxInstances: 1,
        // For W3C the appium capabilities need to have an extension prefix
        // This is `appium:` for all Appium Capabilities which can be found here
        // http://appium.io/docs/en/writing-running-appium/caps/
        'appium:deviceName': 'iPhone X',
        'appium:platformVersion': '12.2',
        'appium:orientation': 'PORTRAIT',
        // `automationName` will be manatory, see
        // https://github.com/appium/appium/releases/tag/v1.13.0
        'appium:app': join(process.cwd(), './apps/AiView.app.zip'),
        'appium:automationName': 'XCUITest',
        'appium:newCommandTimeout': 240,
        'autoAcceptAlerts': true,
        'appium:noReset': false
    },
];
ParticipantLanguageScreen.setLanguageButton.click();
// That line is native code
driver.switchContext(this.getCurrentContexts()[1]);
ActivateLoginScreen.usernameInput.setValue(SC_USERNAME);
// That line should be a webview, but Appium is treating it as a native view
我实际测试的一个片段如下所示:

//XCUIElementTypeOther[@name="Login from mobile"]/XCUIElementTypeOther[4]/XCUIElementTypeTextField
<input id="username" name="username" placeholder="Username" type="text">
config.capabilities = [
    {
        // The defaults you need to have in your config
        // browserName: 'safari',
        platformName: 'iOS',
        maxInstances: 1,
        // For W3C the appium capabilities need to have an extension prefix
        // This is `appium:` for all Appium Capabilities which can be found here
        // http://appium.io/docs/en/writing-running-appium/caps/
        'appium:deviceName': 'iPhone X',
        'appium:platformVersion': '12.2',
        'appium:orientation': 'PORTRAIT',
        // `automationName` will be manatory, see
        // https://github.com/appium/appium/releases/tag/v1.13.0
        'appium:app': join(process.cwd(), './apps/AiView.app.zip'),
        'appium:automationName': 'XCUITest',
        'appium:newCommandTimeout': 240,
        'autoAcceptAlerts': true,
        'appium:noReset': false
    },
];
ParticipantLanguageScreen.setLanguageButton.click();
// That line is native code
driver.switchContext(this.getCurrentContexts()[1]);
ActivateLoginScreen.usernameInput.setValue(SC_USERNAME);
// That line should be a webview, but Appium is treating it as a native view
此定位器工作:

SC_USERNAME_INPUT: '//XCUIElementTypeOther[@name="Login from mobile"]/XCUIElementTypeOther[4]/XCUIElementTypeTextField'
但这一条没有:

SC_USERNAME_INPUT: '#username'
以下是appium日志的一部分:

[HTTP] --> POST /wd/hub/session/30491fcf-e3c4-41bf-bad0-bbf1cc71d2f9/element
[HTTP] {"using":"accessibility id","value":"SET PARTICIPANT LANGUAGE"}
[W3C (30491fcf)] Calling AppiumDriver.findElement() with args: ["accessibility id","SET PARTICIPANT LANGUAGE","30491fcf-e3c4-41bf-bad0-bbf1cc71d2f9"]
[XCUITest] Executing command 'findElement'
[BaseDriver] Valid locator strategies for this request: xpath, id, name, class name, -ios predicate string, -ios class chain, accessibility id
[BaseDriver] Waiting up to 0 ms for condition
[WD Proxy] Matched '/element' to command name 'findElement'
[WD Proxy] Proxying [POST /element] to [POST http://localhost:8100/session/1E3BE1C7-5210-49E5-B405-FEE9393DEEB8/element] with body: {"using":"accessibility id","value":"SET PARTICIPANT LANGUAGE"}
[WD Proxy] Got response with status 200: {"value":{"ELEMENT":"C2030000-0000-0000-CE45-000000000000"},"sessionId":"1E3BE1C7-5210-49E5-B405-FEE9393DEEB8","status":0}
[W3C (30491fcf)] Responding to client with driver.findElement() result: {"element-6066-11e4-a52e-4f735466cecf":"C2030000-0000-0000-CE45-000000000000","ELEMENT":"C2030000-0000-0000-CE45-000000000000"}
[HTTP] <-- POST /wd/hub/session/30491fcf-e3c4-41bf-bad0-bbf1cc71d2f9/element 200 104 ms - 137

[HTTP] 
[HTTP] --> POST /wd/hub/session/30491fcf-e3c4-41bf-bad0-bbf1cc71d2f9/element/C2030000-0000-0000-CE45-000000000000/click
[HTTP] {}
[W3C (30491fcf)] Driver proxy active, passing request on via HTTP proxy
[XCUITest] Executing command 'proxyReqRes'
[WD Proxy] Matched '/wd/hub/session/30491fcf-e3c4-41bf-bad0-bbf1cc71d2f9/element/C2030000-0000-0000-CE45-000000000000/click' to command name 'click'
[WD Proxy] Proxying [POST /wd/hub/session/30491fcf-e3c4-41bf-bad0-bbf1cc71d2f9/element/C2030000-0000-0000-CE45-000000000000/click] to [POST http://localhost:8100/session/1E3BE1C7-5210-49E5-B405-FEE9393DEEB8/element/C2030000-0000-0000-CE45-000000000000/click] with body: {}
[WD Proxy] Got response with status 200: {"status":0,"id":"C2030000-0000-0000-CE45-000000000000","value":"","sessionId":"1E3BE1C7-5210-49E5-B405-FEE9393DEEB8"}
[WD Proxy] Replacing sessionId 1E3BE1C7-5210-49E5-B405-FEE9393DEEB8 with 30491fcf-e3c4-41bf-bad0-bbf1cc71d2f9
[HTTP] <-- POST /wd/hub/session/30491fcf-e3c4-41bf-bad0-bbf1cc71d2f9/element/C2030000-0000-0000-CE45-000000000000/click 200 391 ms - 118
[HTTP] --> POST /wd/hub/session/30491fcf-e3c4-41bf-bad0-bbf1cc71d2f9/element
[HTTP] {"using":"css selector","value":"#username"}
[W3C (30491fcf)] Calling AppiumDriver.findElement() with args: ["css selector","#username","30491fcf-e3c4-41bf-bad0-bbf1cc71d2f9"]
[XCUITest] Executing command 'findElement'
[BaseDriver] Valid locator strategies for this request: xpath, id, name, class name, -ios predicate string, -ios class chain, accessibility id
[W3C (30491fcf)] Encountered internal error running command: InvalidSelectorError: Locator Strategy 'css selector' is not supported for this session
[W3C (30491fcf)]     at XCUITestDriver.validateLocatorStrategy (/Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/appium-base-driver/lib/basedriver/driver.js:366:13)
[W3C (30491fcf)]     at XCUITestDriver.validateLocatorStrategy (/Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/appium-xcuitest-driver/lib/driver.js:991:11)
[W3C (30491fcf)]     at XCUITestDriver.validateLocatorStrategy [as findElOrElsWithProcessing] (/Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/appium-base-driver/lib/basedriver/commands/find.js:31:8)
[W3C (30491fcf)]     at XCUITestDriver.findElOrElsWithProcessing [as findElement] (/Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/appium-base-driver/lib/basedriver/commands/find.js:53:21)
[W3C (30491fcf)]     at curCommandCancellable._bluebird.default.resolve.then (/Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/appium-base-driver/lib/basedriver/driver.js:305:66)
[W3C (30491fcf)]     at tryCatcher (/Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/bluebird/js/release/util.js:16:23)
[W3C (30491fcf)]     at Promise._settlePromiseFromHandler (/Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/bluebird/js/release/promise.js:517:31)
[W3C (30491fcf)]     at Promise._settlePromise (/Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/bluebird/js/release/promise.js:574:18)
[W3C (30491fcf)]     at Promise._settlePromiseCtx (/Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/bluebird/js/release/promise.js:611:10)
[W3C (30491fcf)]     at _drainQueueStep (/Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/bluebird/js/release/async.js:142:12)
[W3C (30491fcf)]     at _drainQueue (/Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/bluebird/js/release/async.js:131:9)
[W3C (30491fcf)]     at Async._drainQueues (/Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/bluebird/js/release/async.js:147:5)
[W3C (30491fcf)]     at Immediate.Async.drainQueues (/Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/bluebird/js/release/async.js:17:14)
[W3C (30491fcf)]     at runCallback (timers.js:696:18)
[W3C (30491fcf)]     at tryOnImmediate (timers.js:667:5)
[W3C (30491fcf)]     at processImmediate (timers.js:649:5)
[HTTP] <-- POST /wd/hub/session/30491fcf-e3c4-41bf-bad0-bbf1cc71d2f9/element 400 96 ms - 2501
[HTTP]->POST/wd/hub/session/30491fcf-e3c4-41bf-bad0-bbf1cc71d2f9/element
[HTTP]{“使用”:“辅助功能id”,“值”:“设置参与者语言”}
[W3C(30491fcf)]调用AppiumDriver.findElement(),参数为:[“辅助功能id”,“设置参与者语言”,“30491fcf-e3c4-41bf-bad0-bbf1cc71d2f9”]
[XCUITest]正在执行命令“findElement”
[BaseDriver]此请求的有效定位器策略:xpath、id、名称、类名、-ios谓词字符串、-ios类链、可访问性id
[BaseDriver]等待最长为0毫秒的条件
[WD Proxy]将“/element”与命令名“findElement”匹配
[WD代理]代理[POST/元素]到[POST]http://localhost:8100/session/1E3BE1C7-5210-49E5-B405-FEE9393DEEB8/element],正文:{“使用”:“辅助功能id”,“值”:“设置参与者语言”}
[WD Proxy]获得状态为200的响应:{“value”:{“ELEMENT”:“C2030000-0000-0000-CE45-000000000000”},“sessionId”:“1E3BE1C7-5210-49E5-B405-FEE9393DEEB8”,“状态”:0}
[W3C(30491fcf)]使用driver.findElement()结果响应客户端:{“element-6066-11e4-a52e-4f735466cecf:“C2030000-0000-0000-CE45-000000000000000000”,“element:“C2030000-0000-0000-CE45-000000000000000000”}
[HTTP]POST/wd/hub/session/30491fcf-e3c4-41bf-bad0-bbf1cc71d2f9/element/C2030000-0000-0000-CE45-000000000000/点击
[HTTP]{}
[W3C(30491fcf)]驱动程序代理处于活动状态,通过HTTP代理传递请求
[XCUITest]正在执行命令“proxyReqRes”
[WD代理]匹配'/WD/hub/session/30491fcf-e3c4-41bf-bad0-bbf1cc71d2f9/element/C2030000-0000-0000-CE45-000000000000/单击“到命令名”单击“单击”
[WD代理]代理[POST/WD/hub/session/30491fcf-e3c4-41bf-bad0-bbf1cc71d2f9/element/C2030000-0000-0000-CE45-000000000000/点击]到[POST]http://localhost:8100/session/1E3BE1C7-5210-49E5-B405-FEE9393DEEB8/element/C2030000-0000-0000-CE45-000000000000/点击]正文:{}
[WD Proxy]获得状态为200的响应:{“status”:0,id:“C2030000-0000-0000-CE45-000000000000”,“value:”,“sessionId:“1E3BE1C7-5210-49E5-B405-FEE9393DEEB8”}
[WD代理]将会话ID 1E3BE1C7-5210-49E5-B405-FEE9393DEEB8替换为30491CFF-e3c4-41bf-bad0-bbf1cc71d2f9
[HTTP]POST/wd/hub/session/30491fcf-e3c4-41bf-bad0-bbf1cc71d2f9/element
[HTTP]{“使用”:“css选择器”,“值”:“#用户名”}
[W3C(30491fcf)]使用参数调用AppiumDriver.findElement()[“css选择器”、“用户名”、“30491fcf-e3c4-41bf-bad0-bbf1cc71d2f9”]
[XCUITest]正在执行命令“findElement”
[BaseDriver]此请求的有效定位器策略:xpath、id、名称、类名、-ios谓词字符串、-ios类链、可访问性id
[W3C(30491fcf)]在运行命令时遇到内部错误:InvalidSelector错误:此会话不支持定位器策略“css选择器”
[W3C(30491fcf)]位于xuitestdriver.validateLocatorStrategy(/Applications/Appium.app/Contents/Resources/app/node_modules/Appium/node_modules/Appium base driver/lib/basedriver/driver.js:366:13)
[W3C(30491fcf)]位于xuitestdriver.validateLocatorStrategy(/Applications/Appium.app/Contents/Resources/app/node_modules/Appium/node_modules/Appium xuitest driver/lib/driver.js:991:11)
[W3C(30491fcf)]位于XUITestDriver.validateLocatorStrategy[作为FindRelswithProcessing](/Applications/Appium.app/Contents/Resources/app/node_modules/Appium base driver/lib/basedriver/commands/find.js:31:8)
[W3C(30491fcf)]位于XUITestDriver.FindRelswithProcessing[作为findElement](/Applications/Appium.app/Contents/Resources/app/node_modules/Appium/node_modules/Appium base driver/lib/basedriver/commands/find.js:53:21)
[W3C(30491fcf)]curcommandCancelable.\u bluebird.default.resolve.then(/Applications/Appium.app/Contents/Resources/app/node\u modules/Appium/node\u modules/Appium base driver/lib/basedriver/driver.js:305:66)
[W3C(30491fcf)]位于tryCatcher(/Applications/Appium.app/Contents/Resources/app/node_modules/Appium/node_modules/bluebird/js/release/util.js:16:23)
[W3C(30491fcf)]在Promise.\u结算推荐自Handler(/Applications/Appium.app/Contents/Resources/app/node\u modules/Appium/node\u modules/bluebird/js/release/Promise.js:517:31)
[W3C(30491fcf)]在Promise.\u结算协议(/Applications/Appium.app/Contents/Resources/app/node\u modules/Appium/node\u modules/bluebird/js/release/Promise.js:574:18)
[W3C(30491fcf)]在Promise.\u结算Promistex(/Applications/Appium.app/Contents/Resources/app/node\u modules/Appium/node\u modules/bluebird/js/release/Promise.js:611:10)
[W3C(30491fcf)]位于drainQueueStep(/Applications/Appium.app/Contents/Resources/app/node\u modules/Appium/node\u modules/bluebird/js/release/async.js:142:12