3-4 1449 web view
1.app类型

| 不同类型的应用 | 区别 |
|---|---|
| native app | 纯原声app,Android用Java些,iOS用object c写 |
| hybrid app | 套用原声应用的外壳,既有原生的UI页面,又通过内置web view组件(相当于内置浏览器),可以访问本地和远程的html文件,Native Hardware Access可以访问本地文件和通过js脚本或html调用本地的函数方法。 |
| web app | 只靠浏览器访问使用 |
| 微信小程序 | 微信内层嵌入的组件 |
2.web view页面
模拟器默认支持
真机需要打开app内开关
//必须从您的应用启用web view调试。要启用web view调试,请在web view类上调用静态方法setWebContentsDebuggingEnabled。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
WebView.setWebContentDebuggingEnabled(true)
}

3.打印当前页面的上下文
3.1雪球
@Test
public void testWebView1() throws InterruptedException{
System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName());
WebDriverWait wait = new WebDriverWait(driver,10);
String jiaoyi = "//*[@text='交易']";
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(jiaoyi)));
for(int i=0;i<3;i++) {
System.out.println("首页: " + driver.getContextHandles());//查看当前页面有几个上下文
Thread.sleep(2000);
}
driver.findElementByXPath(jiaoyi).click();
for(int i=0;i<3;i++){
System.out.println("交易: "+driver.getContextHandles());
Thread.sleep(2000);
}
}
模拟器

使用真机,不会打印web view

3.2使用API demo
@Test
public void testWebview3() throws InterruptedException{
System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName());
WebDriverWait wait = new WebDriverWait(driver,10);
WebElement el = wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//android.widget.TextView[@text=\"App\"]")));
WebElement list = driver.findElement(By.id("android:id/list"));
MobileElement webview1 = list.findElement(MobileBy.AndroidUIAutomator("new UiScrollable(new UiSelector()).scrollIntoView("+"new UiSelector().text(\"Views\"));"));
driver.findElementByXPath("//android.widget.TextView[@text=\"Views\"]").click();
MobileElement webview = list.findElement(MobileBy.AndroidUIAutomator("new UiScrollable(new UiSelector()).scrollIntoView("+"new UiSelector().text(\"WebView\"));"));
driver.findElementByXPath("//android.widget.TextView[@text=\"WebView\"]").click();
for(int i=0;i<5;i++){
System.out.println(driver.getContextHandles());
Thread.sleep(2000);
}
}
使用模拟器:

使用真机

4.切换上下文
4.1.Java
public void testWebview2(){
System.out.println(Thread.currentThread().getStackTrace()[1].getMethodName());
WebDriverWait wait = new WebDriverWait(driver,10);
String jiaoyi = "//*[@text='交易']";
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(jiaoyi)));
driver.findElementByXPath(jiaoyi).click();
System.out.println("Native page source:\n"+driver.getPageSource());
driver.context("WEBVIEW_com.xueqiu.android");
System.out.println("webview page source:\n"+driver.getPageSource());
}
native为xml

webview是html

4.2.python未验证
#代码有错误
# 切换到web view
webview = driver.contexts.last
driver.switch_to.context(webview)
#点击页面中class为green_button的控件
driver.find_element(:css,".green_button").click
#切回原生页面
driver.switch_to.context(driver.contexts.first)
driver.quit()
关于web view测试的内容等待补充
FAQ
1.红米note5使用全面屏,控件By.xpath("//*[@text="交易"]")可以找到,但是控件属性显示不可点击。
解决方法:取消全面屏,使用经典导航键。控件可以正常访问。
2.使用真机,driver.getContextHandles();没有打印web view,使用UC也没有打印
3.切换上下文,提示如下错误
io.appium.java_client.NoSuchContextExcetpion: An unknown server-side error occurred while processing the command. Original error: Failed to start Chromedriver session: A new session could not be created. (Original error:session not created exception:Chrome version must be >= 64.0.3282.0
(Driver info:chromedriver=2.37.544337 (8c0344a12e552148c185f7d5117db1f28d6c9e85), platform=Mac OS X 10.13.3 X86-64))
当前Chromedriver版本为2.37对应Chrome版本64. Chrome版本低于64,session创建失败。在github中appium下搜索Chrome version,找到chromedriver.md文件,查看Chrome和driver对应关系
3.1 查看Chrome版本
方法1:开发者模式-WebView实现-查看Chrome版本

方法2:使用命令
adb -s 406e8f3 shell pm list packages|grep webview
adb -s 406e8f3 shell dumpsys package com.google.android.webview|grep versionName

webview版本为62.0,下载对应的2.35版本的driver即可。
```#shell
appium -g /tmp/csj527.log --session-override --chromedriver-executable /users/csj/Downloads/chromedriver.2.35/chromedriver
```
3-4 1449 web view的更多相关文章
- Appium——unknown error: cannot activate web view
测试步骤: 1. 打开必应APP(如果出现欢迎界面和定位服务弹窗,需要点掉) 2. 点击搜索按钮 3. 输入JAVA到搜索框 4. 点击搜索网页 5. 观察显示搜索出来的结果是否含有java 6. ...
- web view调h5的方法死活调不到
(WebViewJavascriptBridge注册方法都能调用,只有callhandlename时无论如何也没响应)这个问题真是纠缠我好久了 webview评论区刷新问题终于找到原因了 ,我试着把咨 ...
- 为自己搭建一个鹊桥 -- Native Page与Web View之间的JSBridge实现方式
说起JSBridge,大家最熟悉的应该就是微信的WeixinJSBridge,通过它各个公众页面可以调用后台方法和微信进行交互,为用户提供相关功能.我们就来说说UWP下怎么样实现我们自己的JSBrid ...
- webViewDidFinishLoad因为网页里的重定向,会调用多次,使用web view.isLoading来解决
我编码如下,但我发现 webViewDidFinishLoad() 会发生若干次. 如何知道 webViewDidFinishLoad() 最后发生吗? iNavigate = ; - (void)w ...
- iOS web view 与 js 交互
移动应用中许多复杂的且经常改动的页面会使用H5进行代替native,这里就会使用到js和webview的交互 iOS里面,UIWebView提供了方法stringByEvaluatingJavaScr ...
- org.springframework.web.servlet.view.InternalResourceViewResolver
http://blog.csdn.net/superdog007/article/details/28857495 我们在controller里面经常这样return一个ModelAndView: r ...
- java web学习总结(二十二) -------------------简单模拟SpringMVC
在Spring MVC中,将一个普通的java类标注上Controller注解之后,再将类中的方法使用RequestMapping注解标注,那么这个普通的java类就够处理Web请求,示例代码如下: ...
- 【web开发 | 移动APP开发】 Web 移动开发指南(2017.01.05更新)
版本记录 - 版本1.0 创建文章(2016.12.30) - 版本1.1 更正了hybird相关知识:增加了参考文章(2017.01.05): + Web APP更正为响应式移动站点与页面,简称响应 ...
- 浅析Yii2的view层设计
Yii2.0的view层提供了若干重要的功能:assets资源管理,widgets小组件,layouts布局... 下面将通过对Yii2.0代码直接进行分析,看一下上述功能都是如何实现的,当然细枝末节 ...
随机推荐
- 使用MyEclipse开发Java EE应用:EJB项目开发初探(上)
你开学,我放价!MyEclipse线上狂欢继续!火热开启中>> [MyEclipse最新版下载] 一.MyEclipse EJB开发工具 Enterprise Java Beans (EJ ...
- SharePoint 2013的100个新功能之网站管理(一)
一:设置盘 网站操作现在被替换为新的(设置)盘子.一些新的操作像添加一个应用.添加一个页面或设计管理器被添加而像创建网站则从菜单中移除了. 二:移除以其他用户身份登录 在SharePoint 2013 ...
- 深入理解Linux网络技术内幕——内核基础架构和组件初始化
引导期间的内核选项 Linux允许用户把内核配置选项传给引导记录,再有引导记录传给内核,以便对内核进行调整. start_kernel中调用两次parse_args,用于引导期间配置用 ...
- 微信小程序之蓝牙开发(详细读数据、写数据、附源码)
本文将详细介绍微信小程序的蓝牙开发流程(附源码)准备:微信只支持低功耗蓝牙也就是蓝牙4.0,普通的蓝牙模块是用不了的,一定要注意. 蓝牙可以连TTL接到电脑上,再用XCOM调试 一开始定义的变量 va ...
- Samsung_tiny4412(驱动笔记09)----alloc_pages,kmalloc,vmalloc,kmem_cache,class
/*********************************************************************************** * * alloc_pages ...
- Pycharm出现的部分快捷键无效问题及解决办法
为了进行python开发,下载了Pycharm.但是发现启动后,执行ctrl+c和ctrl+v等快捷键都无法生效. 网上搜索了下,参考https://blog.csdn.net/c2366994582 ...
- virtualenv 设置虚拟环境来运行不同版本的python
转自: http://pythonguidecn.readthedocs.io/zh/latest/dev/virtualenvs.html virtualenv 是一个创建隔绝的Python环境的 ...
- C#反射 字符串转为实体类,并做为参数传入泛型方法中使用
工作中有这样一个需求,有N张不同的报表,每张报表对应一个数据源,统计数据采用内存方式,首先在内在里定义了数据源对应实体.统计条件用lamdba表达式式实现,通过工具对单元格进行定义.在实现过程中针对每 ...
- Future接口和FutureTask类【FutureTask实现了Runnable和Future接口】
Future API: public interface Future<V> { /** * Attempts to cancel execution of this task. This ...
- Slack 开发入门之 Incoming Webhooks:往 Slack 的 Channel 中发消息
一个工程师团队使用 Slack 进行团队协作比 QQ / 微信流的效率高多啦.除了基本的 IM 之外,它的扩展性也是非常重要的一点. 本文介绍 Slack 的开发入门:Incoming Webhook ...