如何使用Espresso访问外部网站上的元素

12

使用Espresso,单击“登录”按钮会启动外部网站(Chrome自定义标签),您可以在其中登录,然后它会重定向回我们的Android应用程序。

在Espresso中有没有一种方法:
1)验证正在启动正确的URL
2)访问网站上的元素,以便我可以输入登录信息并继续登录

enter image description here

当我尝试在Espresso Launch Navigator中查看它时,页面上没有任何内容显示,如果我尝试记录,则无法录制我在页面上输入的任何内容。

这是我到目前为止的情况(它是用Kotlin编写的(不是Java)): enter image description here

这里是显示的错误: enter image description here

它启动了我的应用程序,选择了登录按钮,打开了网站,但随后无法访问元素。

我还尝试过:

enter image description here

更新:这是使用Chrome自定义标签(而不是Web视图),因此Espresso Web无法使用。


1
请下次将您的代码作为纯文本发布,而不是图像。 - Vadim Kotov
2个回答

11

我能够使用Espresso和UI Automator解决这个问题。你可以将两者结合起来使用。我用Espresso(以及应用程序的其他部分)选择了登录按钮。为了处理用于登录的Chrome自定义标签页,我使用了UIAutomator:

输入图像描述


非常感谢你。我永远不会想到需要按两次同一个按钮。你是怎么发现的,为什么你认为这是必要的呢? - Noah Andrews
你是指登录按钮吗?实际上,它首先点击了一个登录标题,然后再点击登录按钮,但我不得不这样做是因为我需要让键盘消失。键盘挡住了登录按钮,所以我先在屏幕其他地方点击了一个元素,让键盘消失,然后才能访问登录按钮。希望这有所帮助! - reutsey
谢谢!你让我意识到我也遇到了同样的问题,但是它能够工作是因为我的选择器不够具体,点击的是与我想象中不同的东西。现在我可以使用一个不同、更明显的选择器了。 - Noah Andrews
2
你如何使用UIautomator在网页上点击按钮?我试图点击网页上的按钮,但是我无法做到这一点。 - Umar Hussain

2

更新:

你不能使用Espresso来测试Chrome自定义选项卡。Espresso只适用于测试您自己的应用程序。

要测试Chrome选项卡,您可以使用UI Automator,但您可能不想这样做。

1)验证正在启动正确的URL

这里只需要进行单元测试即可。您只需确保传递给Chrome自定义选项卡库的URL是正确的。您只需要确保您的代码正常工作。接下来发生的事情由库处理,测试属于库的范畴。

2)访问网站上的元素,以便我可以输入登录信息并继续登录

在这里,您正在测试一个简单的网页。为什么要增加启动模拟器的额外开销呢?也许可以使用Selenium或其他适合Web的工具(不是Web开发者)?

您可以使用Espresso Web

这里是一个示例测试:

@Test
public void typeTextInInput_clickButton_SubmitsForm() {
    // Lazily launch the Activity with a custom start Intent per test.
    mActivityRule.launchActivity(withWebFormIntent());

    // Selects the WebView in your layout. If you have multiple WebView objects,
    // you can also use a matcher to select a given WebView,
    // onWebView(withId(R.id.web_view)).
    onWebView()
        // Find the input element by ID.
        .withElement(findElement(Locator.ID, "text_input"))
        // Clear previous input.
        .perform(clearElement())
        // Enter text into the input element.
        .perform(DriverAtoms.webKeys(MACCHIATO))
        // Find the submit button.
        .withElement(findElement(Locator.ID, "submitBtn"))
        // Simulate a click using JavaScript.
        .perform(webClick())
        // Find the response element by ID.
        .withElement(findElement(Locator.ID, "response"))
        // Verify that the response page contains the entered text.
        .check(webMatches(getText(), containsString(MACCHIATO)));
}

如果我尝试在启用JS的情况下启动它(在afterActivityLaunched的override中),它会给出以下信息:android.support.test.espresso.NoMatchingViewException:未找到与之匹配的层次结构中的视图:启用JS的WebView。 - reutsey
我尝试了那个解决方案(除非我的设置仍然有误)。请参见我在问题中尝试的示例。我有两个使用匹配器的截图。 - reutsey
我更新了我的问题,但是网页视图无法工作,因为我发现我们正在使用一个 Chrome 自定义选项卡而不是网页视图。 - reutsey
为什么你说我们不需要使用 UI Automator? 是因为有特定的缺点吗?我已经启动了模拟器进行测试。我在模拟器中启动我们的应用程序,选择登录按钮,然后我需要通过 Chrome 自定义选项卡登录,然后我们会被重定向回我们的应用程序进行登录。 - reutsey
@KeshavKumar,你可以在以下网址中找到该内容:https://github.com/android/testing-samples/blob/38155c782fca4730e9553a5ae6e98d9f04897999/ui/espresso/WebBasicSample/app/src/androidTest/java/com/example/android/testing/espresso/web/BasicSample/WebViewActivityTest.java#L130 - Chetan
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接