FindElement после переключения веб-просмотров не работает

У меня есть простой тест Espresso для Android, который работает нормально до переключения Activity. Тест проходит через вход в систему, выбор элементов из веб-просмотра по классам, а затем после успешного входа в систему действие переключается. Оказавшись в новом действии, я не могу найти что-либо в новом веб-просмотре ни по классу, ни по селектору css, ни по x_path.

Я знаю, что это закопано в html, я вижу это и ищу в chrome-инспекторе:

<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 и даже по имени класса (которое не является уникальным), но это все равно терпит неудачу.

У нас создано несколько веб-просмотров, но видно только одно.

Что я могу сделать, чтобы пролить свет на это и выяснить, почему я не могу выбрать рассматриваемый div?

Обновлять

Похоже, я что-то пропустил в журнале, который раскрыл часть моей проблемы. Я видел в журнале AmbiguousViewMatcherException.

Глядя на код, у нас есть FrameLayout с именем web_container, и мы прикрепляем 3 веб-просмотра к представлению с помощью вызова addView(). Таким образом, у этого компонента появляется 3 потомка.

Я изменил тест, чтобы использовать withParent() и isDisplayed() в соответствии с веб-просмотром. Этот вызов раньше вызывал исключение, но теперь проходит.

onWebView(allOf(withParent(withId(R.id.web_container)), isDisplayed())).forceJavascriptEnabled()

Учитывая этот успех, я все еще не могу найти ничего в этом веб-просмотре, вот измененный оператор 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)

Вы звонили в onWebView().forceJavascriptEnabled(); для коммутируемого Àctivity?

Anatolii 15.09.2018 18:46

Я просто добавил его снова после переключения действий, и это не имело никакого значения.

Gary Bak 19.09.2018 02:05

Удостоверились ли вы, что вызывается onWebView().forceJavascriptEnabled();, прежде чем вы действительно попытаетесь выполнить поиск (во втором Activity)?

Anatolii 19.09.2018 08:16

Да, звонили перед обыском.

Gary Bak 19.09.2018 13:23

Хорошо, еще вопрос - вы называете reset() после perform()? Например, onWebView().withElement(<some element>).perform(<some action>).reset();

Anatolii 19.09.2018 14:23
4
5
878
1

Ответы 1

вам необходимо вызвать в .reset() в конце первого взаимодействия;

иначе вы больше не сможете получить доступ (или сопоставить) эту ссылку.

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

как указано в документация для Espresso Web:

reset() reverts the WebView to its initial state. This is necessary when a prior action, such as a click, introduces a navigation change that makes ElementReference and WindowReference objects inaccessible.

затем повторное сопоставление предоставит новую ссылку, к которой можно будет получить доступ.

Добавление вызова в reset () не помогло.

Gary Bak 19.09.2018 19:29

@GaryBak трудно объяснить это лучше, в то время как вы показываете только одну его инструкцию (которую невозможно воспроизвести). Я имею в виду, что можно даже имитировать onActivityResult() с помощью Espresso Intents, что здесь вообще не рассматривается ... в такой ситуации, без надлежащего правила тестирования и настройки, второй сопоставитель, вероятно, даже не будет выполнен. .reset() применяется только к событиям браузера navigation change - и не требуется, пока этого не произойдет.

Martin Zeitler 19.09.2018 21:04

Другие вопросы по теме