首页 > 解决方案 > 切换网页视图后的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)

标签: androidandroid-espresso

解决方案


您需要.reset()在第一次交互结束时调用;

否则您将无法再访问(或匹配)该引用。

onWebView(allOf<View>(isDisplayed(), isJavascriptEnabled()))
    .withElement(findElement(Locator.CSS_SELECTOR, "div[title=Pay]"))
    .perform( ... )
    .reset();

正如Espresso Web的文档所述:

reset()将 WebView 恢复到其初始状态。当先前的操作(例如单击)引入了使 ElementReference 和 WindowReference 对象无法访问的导航更改时,这是必要的。

然后再次匹配,将提供一个新的引用,可以访问。


推荐阅读