Android Espresso WebView webClick() 和 webKeys() 不会触发输入字段上的模糊事件

Wir*_*ing 6 javascript android blur android-webview android-espresso

我正在尝试使用 Espresso 测试 WebView。WebView 包含一些输入字段和一个继续下一页的按钮。我可以在输入字段中输入文本。离开输入字段后,应该调用一个模糊事件来执行一些额外的格式化和验证。然而,模糊事件永远不会被调用,因此我无法继续下一页。

看起来webKeys()只是注入一些文本,而webClick()只是触发点击事件。这可能就是为什么焦点永远不会改变并且模糊事件永远不会被调用的原因。当我亲自按下输入字段时,事件确实被触发,并且我还看到了 Android 输入光标。当测试用例运行时,在输入字段中输入文本时我看不到光标。

有没有办法以编程方式触发模糊事件或使用 Espresso 将焦点设置到 WebView 中的元素?

这是我用来插入文本的代码。

public static void insertText(String label, String content)
{
    onWebView().withElement(findElement(Locator.XPATH, "//div[preceding::span[.='" + label + "']]/input")).perform(clearElement()).perform(webClick())
               .perform(webKeys(content));
}
Run Code Online (Sandbox Code Playgroud)

编辑:添加了相关依赖项。

implementation "androidx.test.espresso:espresso-idling-resource:3.2.0"
androidTestImplementation "androidx.test.espresso:espresso-core:3.2.0"
androidTestImplementation "androidx.test.espresso:espresso-intents:3.2.0"
androidTestImplementation "androidx.test.espresso:espresso-web:3.2.0"
androidTestImplementation "androidx.test.espresso:espresso-contrib:3.2.0"
Run Code Online (Sandbox Code Playgroud)

Jak*_* A. 3

您可以将任何 javascript 发送到您的 Web 视图。

每个“原子”(webKeys原子之一)只是一些 javascript 代码,它会发送到您的 Web 视图。webKeysatom 可能会发送keypress事件,但不会focus/blur/change在浏览器中触发事件。这是用户空间代码调度事件的标准浏览器行为。

由于您可以手动触发按键,因此您也可以触发焦点等。您可以使用以下方法创建和分派焦点:

onWebView().withElement(...)
        .perform(SimpleAtom("function(elem) {\n" +
                   "var e = document.createEvent('Event');\n" +
                   "e.initEvent('focus', true, true);\n" +
                   "elem.dispatchEvent(e);}"
                ))           
Run Code Online (Sandbox Code Playgroud)

这应该将焦点设置到给定元素。您正在发送函数,然后使用您的元素作为第一个参数来调用该函数。

您应该创建一些类似SetFocusAtomRemoveFocusAtom等的类,这些类将扩展SimpleAtom而不是到处复制和粘贴整个 javascript。

意识到:

  • 您可以将任何 javascript 发送到 WebView,但您可能不希望这样做。您可以自由编辑当前不可见输入的值等。您正在编写 UI 测试,因此您可以仅测试 UI 的可见部分。原始原子(webClickwebKeys)正在检查项目的实际可见性。您应该每次都使用一些原始原子或至少匹配可见性。
  • 你只能做用户空间 Javascript 中可能做的事情。有一些限制。例如,就像当前的问题一样。在具有复杂 WebView 的项目中,您应该考虑使用 UIAutomator 或 Selenium 的某些实现(使用 chromedriver)。Espresso-web 并不“像真实用户那样行事”。仅通过 javascript 注入无法实现这一点。Chromedriver 在用户行为方面非常强大。
  • 我的回答并不通用。有时您不需要设置focus/blur输入。例如,有时您想发送change事件,这也不是由 触发的webKeys