Android 让浓缩咖啡等待WebView完成加载

Android 让浓缩咖啡等待WebView完成加载,android,testing,webview,android-espresso,Android,Testing,Webview,Android Espresso,有没有可靠的方法让浓缩咖啡等待WebView完成加载 我尝试过概述的方法,但发现它不可靠。它还有其他缺点: 它依赖于替换WebView的WebChromeClient。由于某些原因,WebViewrt没有getWebChromeClient()方法,因此也无法包装任何现有WebChromeClient 它需要一个特定的WebView实例,因此每次使用WebView启动活动时,我都必须获取WebView实例并为其注册一个新的WebviewIdlingResource 我希望有人能找到一个没有这

有没有可靠的方法让浓缩咖啡等待WebView完成加载

我尝试过概述的方法,但发现它不可靠。它还有其他缺点:

  • 它依赖于替换WebView的WebChromeClient。由于某些原因,WebViewrt没有getWebChromeClient()方法,因此也无法包装任何现有WebChromeClient
  • 它需要一个特定的WebView实例,因此每次使用WebView启动活动时,我都必须获取WebView实例并为其注册一个新的WebviewIdlingResource

我希望有人能找到一个没有这些缺点的解决方案。我曾希望espresso web包能够提供解决方案,但它似乎没有提供任何与加载相关的功能。

正如您所提到的,有一个名为espresso web的espresso附加组件,用于处理网络视图及其内容

“完成加载”是一个模糊的概念。这将取决于你具体想完成什么

如果使用
onWebView().check()
,则只有在加载web视图并且
检查成功后才会返回

Espresso web是在Android上使用WebView的入口点。它使用流行的WebDriver API中的原子来内省和控制WebView的行为

与onData类似,WebView交互实际上由几个视图原子组成。Atom可以看作是ViewAction,一个在UI中执行操作的自包含单元。但是,它们需要进行适当的编排,而且相当冗长。Web和WebInteraction将此样板文件包装起来,并为与WebView的交互提供一种类似意式咖啡的感觉


< P>如果使用“<代码> WebChromeClient < /代码>引起的不可靠性,请考虑使用<代码> WebViewClient < /C> > .< /P> 我发现
WebViewClient
在网页加载完成时可靠地激发
onPageFinished()
WebChromeClient
WebViewClient
类似,但
WebViewClient
更一般,因为
WebChromeClient
处理WebView的Chrome特定方面(请参阅)

在一个示例项目中,我将
onPageFinished()
函数注册到
WebView
中,如下所示:

playVideoWebView.webViewClient=对象:webViewClient(){
override fun shouldOverrideUrlLoading(视图:WebView,url:String):布尔值{
返回错误
}
覆盖乐趣onPageFinished(视图:WebView?,url:字符串?){
if(null!=url&&url!=关于url){
//下一行发送一个调用decrement()的操作
howToViewModel.dispatchAction(加载视频\u完成)
}
}
}
我希望这是有帮助的,尽管我承认我没有解决你提到的其他缺点。至于缺少,这似乎是可行的。至于需要一个特定的WebView实例,我不知道如何避免。不知何故,您必须使WebView在完成加载时减少空闲资源计数器。似乎任何解决方案都必须以某种方式接触WebView的特定实例才能完成此注册过程。一些开发人员可能会觉得,在生产代码中添加对和的调用是乏味或不合适的

为了最大限度地减少空闲资源计数调用的代码量,可以将这些调用隔离为异步代码的“副作用”。例如,我发现使用Redux数据存储非常有用。异步操作开始时,可以将状态更新为“进行中”;结束时,清除“正在进行”标志。“副作用”可以是监听“进行中”的任何机制。CoRedux实际上有一种称为“副作用”的结构,您可以使用它,但任何对状态更改做出响应的机制都可以

在示例项目的副作用中,它调用并如下所示:

何时(操作){
是初始化开始,是显示视频片段开始,是加载视频片段开始,是隐藏视频片段开始->{
espressoTestIdlingResource.increment()
}
初始化\u完成、显示视频片段\u完成、加载视频\u完成、隐藏视频片段\u完成->{
espressoTestIdlingResource.decrement()
}
}

通过将空闲资源逻辑与副作用隔离开来,整个Android项目可以依靠一段代码来分别在任何异步UI事件开始/结束时调用
increment()
/
decrement()

我发现:
WebView
似乎有一个方法。可能是在发布原始问题后引入的。这并不能回答问题。我已经有一段时间没有看这个了,但是如果我没记错的话,
check()
将在内容尚未加载时立即失败。换句话说,我需要等待内容加载后再调用它said@vaughandroid我添加了一个超时,它等待。