如何让Selenium测试定位Angular生成的元素?

时间:2014-07-09 08:39:33

标签: angularjs fluentlenium wisdom-framework

我目前正在使用angular tutorial作为后端使用Wisdom framework。因此,我使用Fluentlenium作为the wisdom framework doc states运行端到端测试。

我对第3步的测试虽然简单,但没有通过。

可以在github上找到完整的测试:Step03IsImplementedIT

然而,这是令人讨厌的摘录(第30行)

@Test
public void canTestPageCorrectly() {
    if (getDriver() instanceof HtmlUnitDriver) {
        HtmlUnitDriver driver = (HtmlUnitDriver) getDriver();
        if(!driver.isJavascriptEnabled()) {
            driver.setJavascriptEnabled(true);
        }
        Assert.assertTrue("Javascript should be enabled for Angular to work !", driver.isJavascriptEnabled());
    }
    goTo(GoogleShopController.LIST);
    // Et on charge la liste des téléphones
    FluentWebElement phones = findFirst(".phones");
    assertThat(phones).isDisplayed();

    FluentList<FluentWebElement> items = find(".phone");
    assertThat(items).hasSize(3); // <-- this is the assert that fails
}

失败消息:

canTestPageCorrectly(org.ndx.wisdom.tutorial.angular.Step03IsImplementedIT)  Time elapsed: 2.924 sec  <<< FAILURE!
java.lang.AssertionError: Expected size: 3. Actual size: 1.
    at org.fluentlenium.assertj.custom.FluentListAssert.hasSize(FluentListAssert.java:60)
    at org.ndx.wisdom.tutorial.angular.Step03IsImplementedIT.canTestPageCorrectly(Step03IsImplementedIT.java:33)

从那次失败中,我猜想没有加载角度控制器。

我怎样才能确定它们?我怎样才能进行工作测试?

1 个答案:

答案 0 :(得分:0)

原来这个错误并不是预期的......好吧,它是,但是以一种隐藏的方式。

人们可能知道,

HtmlUnitDriver是浏览器的纯Java实现,因此有一些限制。

它的一个限制是Javascript解释,这似乎与角度非常糟糕....

简而言之,解决这个问题的最简单方法是用firefox替换默认驱动程序,这意味着

  • fluentlenium.browser设为firefox
  • 通过在测试开始时添加一个小断言,确保驱动程序正确加载(因为firefox.exe在尝试使用其驱动程序时应该在路径上)

然后进行最终测试

    assertThat(getDriver()).isInstanceOf(FirefoxDriver.class);
    goTo(GoogleShopController.LIST);
    FluentList<FluentWebElement> items = find("li");
    FluentLeniumAssertions.assertThat(items).hasSize(3);
    fill("input").with("nexus");
    await();
    items = find(".phone");
    FluentLeniumAssertions.assertThat(items).hasSize(1);
    fill("input").with("motorola");
    await();
    items = find(".phone");
    FluentLeniumAssertions.assertThat(items).hasSize(2);