公司的 App 是 Native App,看大家经常在网上问 WebView 的问题,自己也尝试了一下,也有一些疑问,望高手们指导。测试 APP 为网上随便找的 APP。
答:
获取 Webview 需要开发 app 的工程师在代码中添加开启 webview 调试的代码:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WebView.setWebContentsDebuggingEnabled(true);
}
注:有时候会获取到多个 webiew 的 Context,切换时要切换成自己 app 对应的 webview.
代码中并没有用命令 Context 进行切换到 WebView,但仍然是可以访问的,这是怎么回事呢?不切换 Context 也可以控制 WebView 页面,难道是新版本的 Appium 已经自动识别,不用在 Native 和 WebView 切换了吗?
答:
对于混合型 APP,在 webview 界面有些元素的操作是不需要切到 webview 操作的,但使用比如 js 操作等是需要切换到 webview 的。
测试 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();