公司的 App 是 Native App,看大家经常在网上问 WebView 的问题,自己也尝试了一下,也有一些疑问,望高手们指导。测试 APP 为网上随便找的 APP。

疑问:

  1. 在 WebView 界面获取 Contexts 的值中,只获取到一个 NATIVE_APP 值,没有获取到 WebView 值;后来测试官网的 donet 的实例,在 WebView 界面获取到的也只有 NATIVE_APP 的值,而网友说 Java 语言的是可以获取到的,有没有遇到这种问题的,期望回答一下?

答:
获取 Webview 需要开发 app 的工程师在代码中添加开启 webview 调试的代码:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    WebView.setWebContentsDebuggingEnabled(true);
}

注:有时候会获取到多个 webiew 的 Context,切换时要切换成自己 app 对应的 webview.

  1. 代码中并没有用命令 Context 进行切换到 WebView,但仍然是可以访问的,这是怎么回事呢?不切换 Context 也可以控制 WebView 页面,难道是新版本的 Appium 已经自动识别,不用在 Native 和 WebView 切换了吗?
    答:
    对于混合型 APP,在 webview 界面有些元素的操作是不需要切到 webview 操作的,但使用比如 js 操作等是需要切换到 webview 的。

  2. 测试 WebView 的 App 一般用什么方法查看控件的?也是用 UI Automator Viewer 查看吗,有没有更好的方法?
    答:
    用 UI Automator Viewer 或 appium 自带的 inspector

测试环境:

手机型号: 三星 Galasy S6
系统版本: Android5.1.1
编程语言: donet
Appium 版本: 1.4.0.0

截图

手动启动 app 后,用 UI Automator Viewer 查看:

Appium 启动后,用 UI Automator Viewer 查看:

测试代码:

DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.SetCapability("BrowserName", "");
//capabilities.SetCapability("automationName", "selendroid");
capabilities.SetCapability("deviceName", "Android Emulator");
capabilities.SetCapability("platformName", "Android");
capabilities.SetCapability("platformVersion", "4.4");
capabilities.SetCapability("newCommandTimeout", "300");

capabilities.SetCapability("unicodeKeyboard", "True");
capabilities.SetCapability("resetKeyboard", "True"); 

capabilities.SetCapability("appPackage", "com.facishare.fs");
capabilities.SetCapability("appActivity", "com.facishare.fs.IndexActivity");

Uri serverUri = new Uri("http://127.0.0.1:4723/wd/hub");
driver = new AndroidDriver<AndroidElement>(serverUri, capabilities, TimeSpan.FromSeconds(180));
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(1));

WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(20));
IWebElement element = wait.Until<IWebElement>((d) =>
{
    return driver.FindElementByName("注册");
});

element.Click();
driver.FindElementByName("创建一个新企业,全新注册").Click();
Thread.Sleep(2000);

//webView界面, 疑问:此处获取到的contexts只有一个值NATIVE_APP,所以下面并没有对Context进行切换操作
var contexts = ((IContextAware)driver).Contexts;
string webviewContext = null;
for (int i = 0; i < contexts.Count; i++)
{
    Console.WriteLine(contexts[i]);
    if (contexts[i].Contains("WEBVIEW"))
    {
        webviewContext = contexts[i];
    }
}

Assert.IsTrue(driver.PageSource.Contains("新用户注册"));
driver.FindElementByName("请输入手机号").SendKeys("13890888555");
driver.FindElementByName("输入图中字符").SendKeys("kkejd");
driver.FindElementByName("获取验证码").Click();
driver.FindElementByName("确定").Click();
driver.FindElementByName("输入验证码").SendKeys("11111");
driver.FindElementByName("下一步").Click();

driver.Quit();


↙↙↙阅读原文可查看相关链接,并与作者交流