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

Posted

技术标签:

【中文标题】Selenium 测试在本地工作,但在 Jenkins 中失败【英文标题】:Selenium tests work locally but fail in Jenkins 【发布时间】:2016-10-07 11:13:33 【问题描述】:

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

测试在 Jenkins 中运行,使用 Selenium webDriver + Chrome + xvfb 作为显示服务器。我们知道测试是有效的,因为如果我们在笔记本电脑上本地运行它们(我和 2 个朋友已经尝试过),它们每次都能完美运行,但在 Jenkins 中每次都几乎失败。 几乎是关键字,因为它们也在那里工作……每 5 次左右才一次。

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

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

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

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

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

【问题讨论】:

第一个建议你可以更新几乎所有你正在使用的框架来提高它们的效率。下一个建议是隐式等待或适当的显式等待。最终建议,如果它在本地运行良好,请配置 jenkins 机器与本地相同 【参考方案1】:

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

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

我已经为此奋斗了两年​​多了,当我说我知道的时候相信我

是的,这很令人沮丧。

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

有什么方法可以让 Selenium 驱动程序记录整个流程,而不是到处截屏?

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

更新:

我在一个不稳定的测试blog post 中扩展了所有这些。

【讨论】:

你知道,我认为实际上就是这样。我们甚至没有考虑过虚拟机如何以不同于实际物理机的方式呈现/使用资源。我们现在正在研究这一点,并添加一些行,以便每个测试在假设失败之前自动再次运行。【参考方案2】:

Jenkins 臭名昭著,任务调度程序效率低下。

所以两者都用!

    创建一个调用 selenium 脚本的 Bat 文件

    如果您使用 maven 作为构建工具,则将其写入记事本并使用 .bat 扩展名保存

    CD C:\ProjectPath
    mvn test        
    
    创建任务计划程序作业以运行 bat 文件。

    通过以下方式从 Jenkins 调用“任务调度程序作业”:

    添加此构建步骤“运行 windows 批处理命令”

        schtasks /Run /TN "Task Name"
    
    恭喜,现在您的测试将以交互模式运行。

【讨论】:

【参考方案3】:

这是 Jenkins 从属(作为服务运行)优先级问题。

您需要将 Jenkins 从属优先级更改为高或实时 找到Jenkins从进程并增加优先级。 跟随 - https://www.sevenforums.com/tutorials/83361-priority-level-set-applications-processes.html

【讨论】:

以上是关于Selenium 测试在本地工作,但在 Jenkins 中失败的主要内容,如果未能解决你的问题,请参考以下文章

Travis CI AVD上的Android Instrumentation测试失败,但在本地模拟器上工作

Docker 容器在本地工作,但在上传到 elasticbeanstalk 时不工作

Selenium IDE 测试在 GUI 中运行 - 但在 CL 中运行时失败(链接文本不可见)

Flutter websockets 在本地网络中工作,但在 Firebase 托管中不工作

如何使用Selenium RemoteWebDriver删除下载的文件?

如何连接到 CircleCI 上的原生 Selenium