当我尝试通过ssh手动或通过Jenkins(存在Safari的计算机是远程从属机器)运行测试时,在针对Safari 11运行Ruby / RSpec测试时遇到了麻烦。

执行测试时,出现以下错误:

Selenium::WebDriver::Error::WebDriverError:
   unable to connect to safaridriver 127.0.0.1:7050

奇怪的是,当我直接登录到Mac计算机时,我能够运行测试。这使我得出结论,可能有一些权限,默认情况下,该权限会禁止从ssh session 执行,但不确定为什么?

另外,据我所知,Safari驱动程序是Safari 10+的一部分,因此不再作为扩展安装

更新:我发现当我通过ssh登录时,由于某些原因无法生成应由测试生成的safaridriver可执行文件。
例:
/usr/bin/safaridriver -p 7050

它只会以非零的退出代码终止,而直接在计算机上运行相同的命令将在前台运行safaridriver。由于我希望Jenkins在此计算机上运行测试作业,因此我想解决此问题的想法是在此计算机上启动safaridriver(通过cron或launchctl),然后使用该实例将其连接到我的测试中。但是,到目前为止,我无法使我的测试(Selenium / Capybara)重新使用现有的safaridriver,而不是始终尝试在其他端口上生成新的safaridriver。任何对此的想法也将不胜感激。

这是我的环境:
操作系统:MacOS Sierra 10.12.6
浏览器:Safari 11.0.2

提前致谢

最佳答案

有一种可能的解决方法来做到这一点。首先,您需要创建一个自动工作流或启动SafariDriver的Apple脚本

ssh - 无法针对Safari 11远程运行测试(ssh,CI)-LMLPHP

然后将其另存为应用程序。假设我们将其命名为SafariDriver7050

然后,您需要从SSH session 执行

open /Applications/SafariDriver7050.app

这实际上将在已登录的 session 中启动SafariDriver,它应该可以为您工作。

需要警告的是,将其关闭,您需要先终止SafariDriver7050应用程序,然后再终止safaridriver进程。顺序很重要,否则它将在UI上创建一个错误对话框

编辑1:

正如您所建议的那样,将测试打包为应用程序后,这样做会更加容易,然后它将能够自动启动SafariDriver,而不会出现任何问题。发出的密钥是在SSH session 中使用open命令

编辑2

为什么SafariDriver在SSH中不起作用?好吧,如果您看一下Linux的对应版本

如果是Linux,我们可以使用DISPLAY环境变量在现有显示器中启动应用程序,也可以使用XVFB之类的东西在虚拟显示器中启动浏览器。那是大多数框架在Linux机器上使用的概念。

但是Mac没有这种功能,这就是为什么需要这种解决方法的原因。现在为什么不这样做,我不确定。可能还有其他一些我可能不知道的解决方法,因此任何有宝贵信息的人都可以帮助改善答案的这一部分

关于ssh - 无法针对Safari 11远程运行测试(ssh,CI),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48262318/

10-12 14:23