java - Selenium 测试在本地工作但在 Jenkins 中失败

标签 java selenium jenkins continuous-integration

在工作中,我们为其中一个应用程序提供了一个自动化套件,该套件设置为在每次提交到 master/部署到产品时运行,并且很长一段时间以来,我们一直在尝试使其足够可靠。

测试在 Jenkins 中运行,使用 Selenium webDriver + Chrome + xvfb 作为显示服务器。我们知道这些测试是有效的,因为如果我们在笔记本电脑上本地运行它们(我和两个 friend 已经尝试过),它们每次都会完美运行,但在 Jenkins 中几乎每次都会失败。 几乎是关键字,因为它们也在那里起作用......大约每 5 次一次。

当他们失败时,他们并不总是在同一个地方失败。有时是等待元素时超时,有时测试最终会出现一个本来不应该到达的错误页面,我不知道它是如何到达那里的......所以是的,这很令人沮丧。

我们尝试了很多不同的方法来调试它。重写每个测试的设置,以确保在每个测试结束时都清除所有内容,以便下一个测试从干净的工作区/缓存开始,从而使 Selenium 每次无法看到发生了什么时都会截取屏幕截图,尝试过不同版本的 chromedriver/chrome/selenium,将测试连续运行几次,看看是否有任何模式......而且因为我已经没有想法了,所以我想我可以在这里问!

有什么方法可以设置 Selenium 驱动程序来记录整个流程,而不是只是到处截图?我希望能够观看 Jenkins 中运行的测试,但我不知道这是否可能或如何做到。

测试使用Java7 + Spring + TestNG 6.8.1 + Selenium 2.45.0 + XVFB作为显示服务器。

关于我可以尝试什么的任何想法或提示?

最佳答案

阅读您尝试过的所有解决方案,我几乎可以肯定您使用虚拟机 (VM) 来执行 Selenium 测试。表明这一点的事实主要是:

And when they fail they don't always fail at the same spot. Sometimes it's a timeout while waiting for an element, sometimes the test ends up in an error page that shouldn't have reached in the first place and I have no idea how it got there...

我已经和同样的问题斗争了两年多了,相信我,我知道

So yeah, it's frustrating.

虚拟机的主要问题是它们没有正确的渲染功能,而且无论它们的 CPU 和 RAM 有多大,它们最终都无法重现您的本地(或任何物理)显卡。当您尝试并行运行所有测试时,事情会变得非常糟糕。例如,我的团队实际上无法在具有 12 GB RAM 的虚拟机上运行 4 个以上的浏览器!?!我的 8 GB easy 笔记本电脑可以运行 15 个浏览器,同时我可以继续做日常工作。所以底线:Selenium 驱动程序和浏览器之间的同步是问题。每次都不同,具体取决于渲染速度。

Is there any way I could set Selenium driver to record the entire flow instead of just taking a screenshot every here and there?

实际上有几种方法。但为了保持简单 - 使用第二个线程,每 5 秒(或您的服务器可以跟上的尽可能多的时间)进行一次扫描,并将它们保存在每个测试的文件夹中。但出于性能原因,我建议使用 Queue并只保留最后 12 个(最后一分钟)。

更新:

我已经在片状测试中扩展了所有这些 blog post .

关于java - Selenium 测试在本地工作但在 Jenkins 中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37681256/

相关文章:

javascript - 如何在 Nightwatch.js 中的部分使用命令?

testing - 使用 Jenkins 进行负载测试

linux - 如何将文件从 Linux 实例正确复制到 aws ec2 实例?

java - 如何调试和调整我的 jenkins maven 构建的内存设置

java - 实现二叉搜索树 - 包含方法

python - 如何单击 python selenium 中 web 元素列表中的第二个元素?

Java MongoDB 在多个字段中搜索值

python - 如何比较Python和selenium中的字符串

java - 从 Katalon 的 Groovy/Java 测试用例运行外部程序

java - 如何在 Firebase 中订购 'subdata'?