android - 切换网页视图后的findElement不起作用
问题描述
我有一个针对 Android 的简单 Espresso 测试,在切换 Activity 之前可以正常工作。测试通过登录运行,按类从 web 视图中选择元素,然后在成功登录后,活动切换。一旦进入新的活动,我无法在新的 web 视图中找到任何东西,无论是通过类、css 选择器还是通过 x_path。
我知道这被隐藏在 html 中,我可以看到它并在 chrome insepctor 中搜索它:
<div _ngcontent-c9="" class="tile-title" title="Pay">Pay </div>
然而我无法用这个 CSS_SELECTOR 找到它:
onWebView(allOf<View>(isDisplayed(), isJavascriptEnabled()))
.withElement(findElement(Locator.CSS_SELECTOR, "div[title=Pay]"))
同样,我也尝试过使用 X_PATH 字符串,甚至使用类名(这不是唯一的),但它仍然失败。
我们确实创建了多个 webview,但只有一个是可见的。
我该怎么做才能更清楚地了解这一点并弄清楚为什么我不能选择有问题的 div?
更新
看来我错过了日志中的某些内容,这些内容揭示了我的部分问题。AmbiguousViewMatcherException
我在日志中看到了一个。
查看代码,我们有一个带有名称的 FrameLayout,web_container
并通过调用将 3 个 webview 附加到视图addView()
。所以这个组件最终有 3 个孩子。
我将测试更改为使用withParent()
并isDisplayed()
匹配 webview。此调用之前抛出异常,但现在正在通过。
onWebView(allOf(withParent(withId(R.id.web_container)), isDisplayed())).forceJavascriptEnabled()
鉴于这次成功,我仍然无法在这个 webview 中找到任何东西,这里是修改后的 onWebVeiw 语句:
onWebView(allOf(withParent(withId(R.id.web_container)), isDisplayed())).forceJavascriptEnabled()
Log.d("FeatureTest", "passed forceJavaScriptEnabled()")
onWebView(allOf(withParent(withId(R.id.web_container)), isDisplayed()))
.withElement(findElement(Locator.CSS_SELECTOR, "div[title=Pay]")).perform(webClick())
我在日志中看到的错误:
09-21 09:19:19.490 9481 9529 D FeatureTest: Key: Mobile, with visibility: 0
09-21 09:19:19.490 9481 9529 D FeatureTest: Key: RDBX, with visibility: 4
09-21 09:19:19.490 9481 9529 D FeatureTest: Key: DEFAULT, with visibility: 4
09-21 09:19:19.496 9481 9481 I ViewInteraction: Performing 'Forcibly enable javascript.' action on view (has parent matching: with id: com.package.android.debug:id/web_container and is displayed on the screen to the user)
09-21 09:19:19.496 9481 9529 D FeatureTest: passed forceJavaScriptEnabled()
09-21 09:19:19.499 9481 9481 I ViewInteraction: Performing 'Evaluate Atom: android.support.test.espresso.web.webdriver.DriverAtoms$FindElementTransformingAtom@7c99c3e in window: null with element: null' action on view (has parent matching: with id: com.package.android.debug:id/web_container and is displayed on the screen to the user)
0
09-21 09:19:29.505 9481 9481 I ViewInteraction: Performing 'Propagate: java.lang.RuntimeException: java.util.concurrent.TimeoutException: Waited 10 seconds for android.support.test.espresso.web.internal.deps.guava.util.concurrent.AbstractTransformFuture$TransformFuture@8c677ec[status=PENDING, info=[inputFuture=[android.support.test.espresso.web.internal.deps.guava.util.concurrent.SettableFuture@19327b5[status=PENDING]], function=[android.support.test.espresso.web.action.AtomAction$3@cbf3e4a]]]' action on view (has parent matching: with id: com.package.android.debug:id/web_container and is displayed on the screen to the user)
09-21 09:19:29.515 9481 9529 D FeatureTest: java.lang.RuntimeException@89926d8[cause=java.util.concurrent.TimeoutException: Waited 10 seconds for android.support.test.espresso.web.internal.deps.guava.util.concurrent.AbstractTransformFuture$TransformFuture@8c677ec[status=PENDING, info=[inputFuture=[android.support.test.espresso.web.internal.deps.guava.util.concurrent.SettableFuture@19327b5[status=PENDING]], function=[android.support.test.espresso.web.action.AtomAction$3@cbf3e4a]]],detailMessage=java.util.concurrent.TimeoutException: Waited 10 seconds for android.support.test.espresso.web.internal.deps.guava.util.concurrent.AbstractTransformFuture$TransformFuture@8c677ec[status=PENDING, info=[inputFuture=[android.support.test.espresso.web.internal.deps.guava.util.concurrent.SettableFuture@19327b5[status=PENDING]], function=[android.support.test.espresso.web.action.AtomAction$3@cbf3e4a]]],stackTrace={},suppressedExceptions=[]]
09-21 09:19:29.516 9481 9481 W e.android.debu: Accessing hidden field Landroid/app/Activity;->mResultCode:I (light greylist, reflection)
09-21 09:19:29.517 9481 9481 W e.android.debu: Accessing hidden field Landroid/app/Activity;->mResultData:Landroid/content/Intent; (light greylist, reflection)
09-21 09:19:29.517 9481 9529 I TestRunner: failed: testFeature(com.package.android.ui.FeatureTest)
解决方案
您需要.reset()
在第一次交互结束时调用;
否则您将无法再访问(或匹配)该引用。
onWebView(allOf<View>(isDisplayed(), isJavascriptEnabled()))
.withElement(findElement(Locator.CSS_SELECTOR, "div[title=Pay]"))
.perform( ... )
.reset();
正如Espresso Web的文档所述:
reset()
将 WebView 恢复到其初始状态。当先前的操作(例如单击)引入了使 ElementReference 和 WindowReference 对象无法访问的导航更改时,这是必要的。
然后再次匹配,将提供一个新的引用,可以访问。
推荐阅读
- xamarin - 使用 Azure“文本到语音”的 .NET 标准库是否应该受到平台影响?
- c# - 我如何连接 Blazor 和 SOAP api
- javascript - 为什么我得到的项目比我存储到数据库中的项目多?
- c - C中的非法指令4
- node.js - http-proxy 错误:必须提供正确的 URL 作为目标
- python - PIP 使用 C++ 构建安装 Python 模块 || 致命错误 C1083:无法打开包含文件:'winpty.h':没有这样的文件或目录
- c++ - 将多个数组转换为元组
- amazon-web-services - boto3 或 aws cli 是否具有从实例创建模板?
- javascript - 事件处理程序在类中使用时报告元素未定义
- ruby-on-rails - Ruby:如何在模块加载到其父类中之前急切加载类内容