Cucumber TeamCity-Cumber验收测试白天失败,但隔夜通过构建

Cucumber TeamCity-Cumber验收测试白天失败,但隔夜通过构建,cucumber,teamcity,selenium-webdriver,watir-webdriver,page-object-gem,Cucumber,Teamcity,Selenium Webdriver,Watir Webdriver,Page Object Gem,我们正在使用Cucumber和PageObject gem测试一个web应用程序,在TeamCity上运行CI。我们碰到了一个我们谁也解决不了的问题 我们正在访问两个下拉列表,它们的组合内容生成一个无线电选择字段。当我在本地机器上运行时,它通过了,但是当在同一环境下从集成服务器上运行时,它大部分时间都失败了 …除了晚上。我配置了一些预定的构建,这样我就可以在稳定的环境中观察它,并且它会在一夜之间持续通过 它抛出的错误是国家/地区下拉列表(第二个字段,取决于第一个“客户端”)不包含选择值。我已经手

我们正在使用Cucumber和PageObject gem测试一个web应用程序,在TeamCity上运行CI。我们碰到了一个我们谁也解决不了的问题

我们正在访问两个下拉列表,它们的组合内容生成一个无线电选择字段。当我在本地机器上运行时,它通过了,但是当在同一环境下从集成服务器上运行时,它大部分时间都失败了

…除了晚上。我配置了一些预定的构建,这样我就可以在稳定的环境中观察它,并且它会在一夜之间持续通过

它抛出的错误是国家/地区下拉列表(第二个字段,取决于第一个“客户端”)不包含选择值。我已经手动检查过了,客户端框似乎是空的

导致错误的自动化代码如下所示。请注意,我已经尝试了几种方法来访问它,包括下拉到Watir Webdriver,但都没有任何效果

您认为这只是一个简单的性能问题吗?我不明白这是怎么回事,因为测试代理一次只运行一个项目,所以理论上,无论构建负载如何,它们都应该执行相同的操作

def safe_select_client(value, attempts = 10)

  count_attempts_to(attempts)do
    self.client_code = value
    if self.client_code_element.selected? value
      next
    else
      $stdout.puts attempts-1
      safe_select_client(value, attempts-1)
    end
  end
end

def safe_select_country(value, attempts = 10)
  count_attempts_to(attempts) do
    self.client_country = value
    if self.client_country_element.selected? value
      next
    else
      safe_select_country(value, attempts-1) unless self.client_country_element.selected? value
    end
  end
end


def safe_select_proposition(value, attempts = 10)
  count_attempts_to(attempts) do
    self.select_default_proposition
    safe_select_proposition(value, attempts-1) unless default_proposition_selected?
  end
end

这似乎是一个性能问题,因为脚本试图在完成加载之前设置国家/地区下拉列表

在不知道
count\u尝试\u方法执行什么操作的情况下,代码似乎试图设置下拉列表值并多次重新尝试。但是,如果该值不存在,则可能无法运行重试,因为可能已引发异常。即使重试部分有效,重试也会立即出现,因此下拉列表可能尚未加载

您可能应该改用内置的等待方法-请参阅

假设
count\u尝试
只是重试机制的一部分,我认为您可以重写country方法(以及其他方法),如下所示:


这表示等待选项最多30秒。找到后,选择它。

我有一个解决方案

应用程序开发人员对此进行了调查,发现该漏洞与应用程序健壮性有关,而不是与测试代码有关:客户端正在缓存下拉列表的值。如果不是为了自动验收测试,这个bug永远不会被发现,或者在生产中被发现,修复成本要高得多


谢谢大家。

查看上面的代码,您似乎正在设置下拉列表中的值,然后立即检查该值是否已设置。你为什么这么做?是什么导致您编写此代码?因为元素中没有可靠地设置值。我最终会停止脚本,因为没有填充依赖的选择列表。我无法手动复制,但一直在自动化套件中看到它。这可能是“延迟”脚本,因为显然他们会报告错误并在超时后继续。恐怕我已经尝试过了。它实际上损害了脚本的健壮性,因为我随后开始看到StaleElementReferenceErrors以及我现有的问题。异常是否告诉您哪个元素是过时的-客户端国家/地区选择列表或选项值?我正在查找错误,但TeamCity日志没有;不容易搜索我已经考虑过了:如果找不到值,它不会抛出StaleElementReferenceError,是吗?看起来不太可能,但StaleElementReferenceError是可能发生的。例如,可能脚本获取客户端国家/地区下拉列表,要填充下拉列表,可能应用程序删除整个下拉列表并重建它,然后脚本尝试访问现在过时的下拉列表。但是,是的,这似乎不太可能。我建议尝试再次运行此代码,看看异常是什么。这样,它将为我们提供更多的信息来调试/解决问题。
def safe_select_country(value)
  self.client_country_element.option(:value => value).when_present.set
end