2

我正在尝试使用 FluentAutomation.SeleniumWebDriver 和 NUnit 为基于 RequireJS 的 Backbone 应用程序编写一些 UI 测试。有问题的 HTML 页面包含一个典型的data-main属性,用于为应用程序加载 RequireJS 模块。我的困难在于正确检测应用程序何时完全加载了这些工具。到目前为止,我唯一能始终如一地工作的是在几秒钟内使用显式等待,如下所示:

I.Open("http://myapp")
    .Wait(5)
    .Enter("foo").In("input[name=username]")
    .Enter("bar").In("input[name=password]")
    .Click("button")
    .Wait(5)
    .Expect.Text("Welcome").In("#welcome");

这不太理想——我上面写的测试总是需要至少 10 秒才能运行,而实际上应用程序可能比这快得多。我想做的是这样的:

I.Open("http://myapp")
    .WaitUntil(() => I.Assert.Exists("input[name=username]"))
    .Enter("foo").In("input[name=username]")
    .Enter("bar").In("input[name=password]")
    .Click("button")
    .WaitUntil(() => I.Assert.Exists("#welcome"))
    .Expect.Text("Welcome").In("#welcome");

但是,这不起作用——实际上在这里使用 WaitUntil 似乎阻止了应用程序加载,原因我不清楚,因为我只是在默认等待期(30 秒)后收到超时异常,说明它无法找到在该时间范围内有问题的元素。

我看到 Selenium 2 为这种场景提供了一个 WebDriverWait ,并且可能在这里可以工作,但我不确定我将如何在 FluentAutomation 中使用它(并且在 GitHub 上快速搜索 FluentAutomation 代码似乎并没有表明它在在库中使用)。

我可以在 FluentAutomation 中使用什么来正确等待 RequireJS 模块(或由它加载的 DOM)准备好?

额外细节:

这可能根本不是 RequireJS 兼容性问题。我进一步研究了该应用程序,发现在Click("button")实际加载之后发生的事情window.location.replace-而不是RequireJS 异步模块加载。显然,这是应用程序中发生这种情况的一个地方。那么,window.location重定向是否会导致问题的已知场景WaitUntil,并且是否有另一种方法(除了简单的Wait(5))可以正确处理这个问题?

4

0 回答 0