[英]Suppress Selenium Warnings when running Cucumber Test on Local Machine
[英]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
第二行“和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.