我使用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的一部分。 有任何想法吗?
非常感谢
答案 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
第二行"而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? (无论谁找到解决方案都将获得赏金:))