尝试测试iOS应用时,我遇到了webdriverio / appium的奇怪问题。该应用程序具有一个带标签为“刷新”的WebView。当我尝试测试此按钮时,出现“未显示”错误(请参见下面的代码)。
it('should have the Refresh button', () => {
WebViewScreen.waitForWebsiteLoaded();
// Verify that Refresh button is displayed
WebViewScreen.switchToContext(CONTEXT_REF.WEBVIEW);
const button = $('button=Refresh');
expect(button).toBeDisplayed();
WebViewScreen.switchToContext(CONTEXT_REF.NATIVE);
});
请注意,在测试按钮之前,我正在将上下文切换到WEBVIEW。查看Appium日志,查找按钮($('button=Refresh')
)的请求返回404。尝试使用其他选择器:['button[data-test="refresh-button"]']
,但没有。我什至放了一个browser.debug()并在REPL中查询-仍然是404-尽管我实际上可以在屏幕上看到该按钮!
我知道我的webdriverio / appium设置很好,因为完全相同的代码可用于带有WebView和按钮的另一个iOS屏幕-唯一的区别是按钮名称。
我还通过进入独立的网页并测试该按钮来排除我的选择器不正确的可能性-在这种情况下,没有错误!这是独立的网页代码-唯一的区别是没有上下文切换调用:
it('should have the Refresh button', () => {
browser.url('https://example.site.com/');
// Verify that Refresh button is displayed
const button = $('button=Refresh')
expect(button).toBeDisplayed();
});
关于如何调试此方法的任何想法?我缺少关于切换到WEBVIEW上下文的任何细微之处吗?
[在这方面终于取得了突破-感谢Alexi's suggestions on the Appium forum。原来,我的应用程序中有多个WebView,并且不得不将上下文切换到正确的WebView。诀窍是在Appium上设置fullContextList
选项以获得有关可用上下文的更多信息,然后选择合适的上下文。
切换到常规网络视图时会发生什么
public static void switch(AppiumDriver driver) {
Set<String> contextNames = driver.getContextHandles();
for (String context : contextNames) {
log.debug("Context available:{}", context);
if (StringUtils.startsWithIgnoreCase(context, "WEBVIEW")) {
log.debug("Switch to WEBVIEW");
driver.context(context);
}