如何解决webdriver中的竞争条件

时间:2013-10-04 12:39:01

标签: angularjs selenium webdriver protractor

我有一个使用angular和asp.net混合的应用程序。我的问题是通过设置window.location重定向主页,然后从服务器请求所需的数据和页面。

以前情况并非如此,所有路由都是通过角度应用程序完成的。但是由于要求,应用程序路由必须更改为现在的状态。

现在因为应用程序需要服务器端请求/响应(我相信)这导致我的测试中出现竞争条件,因为我每5次测试只收到一次预期结果。

目前我无法提供代码来解释我的情况。但是,我将在今天稍后的编辑中提供一些代码。

我现在唯一能提供的代码就是正在运行的测试。虽然我不相信如果没有运行应用程序的代码,这将有所帮助。

2 个答案:

答案 0 :(得分:0)

最近的框架具有此功能,它将浏览器的document.readState设置为完成,然后加载内容。因此,测试可能会失败,因为我们期望元素存在。

对于这样的条件,您必须使用显式等待在您加载或更改页面后要为其执行操作的元素。

答案 1 :(得分:0)

以下是我们如何等待项目中的元素的示例(应用程序也是angularjs,我们使用Java作为webdriver):

在我们的Webdriver实现中,我们添加了:

private WebDriverWait iWait(int timeoutInSeconds) {
    return new WebDriverWait(webDriver, timeoutInSeconds);
}

我们希望等待元素可见(“可见性意味着不仅显示元素,而且高度和宽度也大于0”):

public void waitForElementToAppear(By by, int timeoutInSeconds) {
    iWait(timeoutInSeconds).ignoring(StaleElementReferenceException.class).until(ExpectedConditions.visibilityOfElementLocated(by));
}    

ExpectedConditions类提供了许多其他开箱即用的条件,这里有一些:

  • elementToBeClickable
  • textToBePresentInElement
  • titleContains
  • elementSelectionStateToBe

了解更多信息,请查看ExpectedConditions Javadoc

如果您需要创建自己的条件,可以使用ExoectedCondition(no's')类 ExpectedCondition Javadoc