繁体   English   中英

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

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

我用宝石'cucumber-rails'做了一些黄瓜测试。

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

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

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

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

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

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

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

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

如果你碰巧知道为什么测试可能会在'Xless'服务器上失败,我会非常感激!

非常感谢您的帮助!


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

我也让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

第二行“当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. 默认等待时间可以通过以下方式增加:

第二行“和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

你可以尝试的事情:

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

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

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

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

Jenkins和你的环境有完全相同的宝石版本吗?

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

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

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

我意识到这是在注意到错误有时是这些之后的问题: 陈旧元素参考

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM