2017-11-18 171 views
1

我正在使用nodejs和nighwatch进行测试自动化的项目。这里的问题是测试不可靠,并给出很多误报。我尽一切努力使他们稳定并仍然遇到错误。我浏览了一些博客,如https://bocoup.com/blog/a-day-at-the-races,并做了一些代码重构。有没有人有一些建议来解决这个问题。在这一刻我有两个选择,要么我用Java重写代码(从解决方案中删除nodejs和nightwatch,因为我更喜欢Java和Javascript,大多数情况下,要与Javascript的非阻塞性质斗争)快照/审查应用程序日志/一次运行一个测试。测试服务器上的硒测试随机失败

测试环境: -

  • 服务器-Linux
  • 显示 - 帧缓冲
  • 总VM的-9硒节点并行运行测试。
  • 浏览器 - 铬
  • ,我得到的是没有找到元素错误的

类型。大多数情况下,页面加载后测试都会失败。我已经为超时设定了80秒,所以时间不会成问题。测试并行运行,但在单独的虚拟机上运行,​​所以我不知道它是否可以成为问题。

编辑1: - 正在研究此问题以了解根本原因。我做了以下事情以消除随机失败: - a。添加--suiteRetries以重试失败的案例。 b。通过错误截图和DOM源。一切似乎都很好。 c。用显式等待代替了browser.pause

同时在调试时我观察到一个问题,也许这是导致随机故障的问题。下面的代码片段

for (var i = 0; i < apiResponse.data.length; i++) { 
    var name = apiResponse.data[i]; 
    browser.useXpath().waitForElementVisible(pageObject.getDynamicElement("@topicTextLabel", name.trim()), 5000, false); 
    browser.useCss().assert.containsText(
    pageObject.getDynamicElement("@topicText", i + 1), 
    name.trim(), 
    util.format(issueCats.WRONG_DATA) 
); 

}

我加入了XPath的检查来验证,如果我在等待能有这样的文字出现。我观察到可见断言正在通过,但在接下来的断言中,@topicText将作为之前的值或为null。这是一个间歇性问题,但在测试服务器上频繁发生。

+1

您可以与错误堆栈跟踪一起分享您的代码试用吗? – DebanjanB

+0

“超时80秒”是什么意思?你是否执行了一些明确的等待,你在页面中定位的第一个元素,在80秒后失败,它不存在?或者你总是等待80秒? – danidiaz

+0

@danidiaz - 是的,我正在执行显式等待,最大超时时间为80秒。 –

回答

1

脆弱的UI端到端测试没有灵丹妙药。在理想的世界中,将会有一个选项set avoid_random_failures=true,可以快速轻松地解决问题,但现在它只是一个梦想。

在Java中简单重写所有测试并不能解决问题,但如果您在java中感觉更好,那么我肯定会朝这个方向前进。


正如你已经从这篇文章中知道Avoiding random failures in Selenium UI tests有在UI测试3个常用避免技术竞争条件:使用常数sleep

  • 使用的webdriver的“隐等待”参数
    1. 使用显式等待(WebDriverWait + ExpectedConditions + FluentWait)

    这些技术进行了简要的WebDriver: Advanced Usage提到的,你也可以在这里读到过:Tips to Avoid Brittle UI Tests

    方法1和2,一般不推荐使用,他们有drawbaks,他们能很好地在简单的HTML网页的工作,但他们都没有100%可以在AJAX页面上实现,并且它们减慢了测试。最好的是#3 - 明确的等待。


    为了使用技术#3(明确的等待),你需要熟悉并适应以下webdriver的工具(我点了他们的Java版本,但他们有其他语言的同行):

    ExpectedConditions有许多预定义的等待状态,最常用的(以我的经验)是ExpectedConditions#elementToBeClickable,它等待一个元素可见并启用,以便您可以单击它。

    如何使用它 - 例如:假设您打开一个页面,其中包含您想要输入数据的几个字段。通常它是足够多的等待,直到第一场会出现在页面上,这将是编辑(点击):

    By field1 = By.xpath("//div//input[.......]"); 
    By field2 = By.id("some_id"); 
    By field3 = By.name("some_name"); 
    By buttonOk = By.xpath("//input[ text() = 'OK' ]"); 
    .... 
    .... 
    WebDriwerWait wait = new WebDriverWait(driver, 60); // wait max 60 seconds 
    
    // wait max 60 seconds until element is visible and enabled such that you can click it 
    // if you can click it, that means it is editable 
    wait.until(ExpectedConditions.elementToBeClickable(field1)).sendKeys("some data"); 
    driver.findElement(field2).sendKeys("other data"); 
    driver.findElement(field3).sendKeys("name"); 
    .... 
    wait.until(ExpectedConditions.elementToBeClickable(buttonOK)).click(); 
    

    上面的代码等待页面加载和渲染后field1变为可编辑 - 但不再,只要它是坏的,。如果元素在60秒后不可见并且可编辑,则测试将失败,并显示TimeoutException
    通常只需要等待页面上的第一个字段,如果它变为活动状态,那么其他字段也会变为活动状态。

    +0

    是的,我知道不会有任何确定的方法来做到这一点,但希望我选择最好的方式。你给出的建议很好。我会尝试并更新。 –