在Jenkins服务器中使用Selenium和Ruby进行黄瓜测试失败,但是传入本地计算机

时间:2016-01-29 20:49:42

标签: ruby selenium jenkins cucumber headless

我使用gem' cucumber-rails'进行了一些黄瓜测试。

此测试使用另一个名为' page-objects' (来自cheezy)在我的测试中我使用Selenium和Chrome驱动程序。

为了让测试在Jenkins服务器(没有X)中运行,我使用了gem' headless'并且我已将服务器配置为使用Xfvb(我的本地计算机运行Elementary OS Freya 0.3.2,服务器运行Ubuntu 15.10)。

当我在本地机器上运行这些测试时(也使用无头),每次都完美无缺地通过。当我在Jenkins'中运行测试时,同样会发生来自终端的服务器

当我在Jenkins CI上运行它们时,有些会失败(错误是"没有找到元素" - 当元素存在时)。

两个测试都失败了,因为它找不到元素(元素存在,当它失败时我打印屏幕只是为了检查发生了什么。页面打印显示它在右页并显示元素)

奇怪的是,它们都在第二步失败(第一步是进入登录页面并进行身份验证,它正确执行)。此外,还有另一个始终通过的测试(测试具有几乎相同的结构)。

两个测试都在同一台服务器上运行(他们访问的网页是相同的,数据是相同的)。

我一遍又一遍地看着这个,我找不到任何解释。我知道问题不是很详细,所以如果有任何遗漏可能很重要,请告诉我,我会更新帖子。

如果您碰巧知道为什么测试可能会失败,并且#X; Xless'服务器,我将不胜感激!

非常感谢您的帮助!

编辑: 失败是"元素未找到"并且元素存在。

我也让Jenkins用户成为了sudoers的一部分。 有任何想法吗?

非常感谢

3 个答案:

答案 0 :(得分:3)

解决这些问题的唯一方法是调试收到的错误。要进行调试,我们可以在方案中的不同位置添加屏幕截图,以确定失败的原因。如果由于页面未完全加载而失败,那么要解决此问题,是增加打开特定页面或查找元素的默认等待时间。找到页面加载或元素后,将默认时间设置为其原始值。

实施例: 1.您可以在场景中添加屏幕截图:

Scenario: Click on Sign In Link
Given Joe opens "www.yahoo.com" page
When Joe takes screenshot with file name "ScreenShot1"
When Joe clicks "Sign In" link

第二行"当Joe使用文件名" ScreenShot1"可用于拍摄屏幕截图

And(/^(\S*) takes screenshot with file name "([^"]*)"$/) do |user, file_name|
  takes_screenshot_with_file_name(file_name, "ScreenShot")
end

def takes_screenshot_with_file_name(file_name, message)
  page.save_screenshot("../../target/#{file_name}.png", :full => true)
end
  1. 默认等待时间可以用下面提到的方式增加:
  2. 第二行"而Joe等待"登录"链接"可用于增加默认等待时间

    Scenario: Click on Sign In Link
    Given Joe opens "www.yahoo.com" page
    And Joe waits for "Sign In" link
    When Joe clicks "Sign In" link
    
    And(/^Joe waits for "([^"]*)" link$/) do |linkName|
      Capybara.default_wait_time = 120
      page.should have_content(linkName)
      Capybara.default_wait_time = DEFAULT_WAIT_TIME
    end
    

答案 1 :(得分:2)

你可以尝试的事情:

将测试简化为基础知识:而不是全部运行,只是那个具体页面并尝试找到该元素。检查是否有效。它可能不会......但你可以更好地指出问题。

在代码中添加一些等待(sleep <number of seconds>),看看你的代码是否试图找到“太快”的东西。这种情况时有发生。

不要使用无头,而是尝试使用其他东西并在浏览器中运行(有一些宝石,如水豚,你可以在无头,火狐或铬之间切换)。

你能找到某种JS日志,看看是否有错误吗?

Jenkins和您的环境是否具有完全相同的宝石版本?

调试它可以做的另一件事是使用byebug之类的东西,并在它失败之前设置一个断点。然后,您可以使用交互式控制台检查页面,并运行不同的命令以尝试查找元素。你必须在詹金斯这样做,但作为最后的手段......

答案 2 :(得分:0)

好的,所以我发现了问题和解决方案。

问题是在执行查找时仍未加载元素。解决方案是使用PageObject.wait_until来等待它们。

我意识到这是在注意到错误有时是这些问题之后的问题:Stale Element Reference

但仍有一个问题仍然存在:为什么这只发生在Jenkins CI? (无论谁找到解决方案都将获得赏金:))