在 Jenkins 服务器中使用 Selenium 和 Ruby 的 Cucumber 测试失败但在本地机器中通过

Cucumber test with Selenium and Ruby in Jenkins server fails but passes in local machine

我使用 gem 'cucumber-rails'.

进行了一些黄瓜测试

此测试使用另一个名为 'page-objects'(来自 cheezy)的 gem,在我的测试中我使用 Selenium 和 Chrome-driver。

为了在 Jenkins 服务器(没有 X)中进行测试 运行,我使用 gem 'headless' 并将服务器配置为使用 Xfvb(我的本地机器 运行s 初级 OS Freya 0.3.2 和服务器 运行s Ubuntu 15.10).

当我 运行 在我的本地机器上进行这些测试时(也使用 headless),它们每次都完美通过。当我 运行 从终端 在 Jenkins 的服务器中进行测试时,也会发生同样的情况

但是 当我 运行 他们在 Jenkins CI 上时,有些失败 (错误是 "didn't find an element" - 当元素存在时) .

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

奇怪的是,他们都在第二步失败了(第一步是进入登录页面并进行身份验证,它正确地完成了)。此外,还有另一个测试 运行s 首先总是通过(测试具有几乎相同的结构)。

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

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

如果您碰巧知道在 'Xless' 服务器上测试可能失败的任何原因,我将不胜感激!

非常感谢您的帮助!


编辑: 失败都是 "element not found" 并且元素存在。

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

非常感谢

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

示例: 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

第二行"When Joe takes screenshot with file name "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. 可以通过以下方式增加默认等待时间:

第二行"And Joe waits for "Sign In"link"可用于增加默认等待时间

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

您可以尝试的事情:

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

在代码中添加一些等待 (sleep <number of seconds>),以查看您的代码是否正在尝试查找某些内容 "too fast"。这种情况时有发生。

不要使用 headless,而是尝试使用其他东西 运行 在浏览器中使用它(对于像水豚这样的 gem,你可以在 headless、firefox 或 chrome 之间切换) .

能不能找个JS日志之类的,看看有没有错误?

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

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

好的,所以我找到了问题和解决方案。

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

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

但是还有一个问题仍然存在:为什么这只发生在 Jenkins CI 中? (找到解决方案的人将获得赏金:))