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

时间:2018-01-15 11:43:27

标签: ssh rspec safari safaridriver

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

执行测试时,我收到以下错误:

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

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

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

更新:我发现当我通过ssh登录时,无法通过某些原因生成应该由测试生成的safaridriver可执行文件。 例如:

/usr/bin/safaridriver -p 7050

它将以非零退出代码终止,而直接在机器上运行相同的命令将在前台运行safaridriver。由于我希望Jenkins在这台机器上运行测试工作,我克服这个问题的想法是在这台机器上启动safaridriver(通过cron或launchctl),然后使用这个实例通过我的测试连接到它。然而,到目前为止,我无法让我的测试(Selenium / Capybara)重新使用现有的safaridriver,而不是总是尝试在不同的端口上生成新的。对此的任何想法也将非常感激。

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

提前致谢

2 个答案:

答案 0 :(得分:2)

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

Safari App

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

然后从SSH会话中执行

open /Applications/SafariDriver7050.app

这实际上会在登录会话中启动SafariDriver,它应该适合你。

要注意关闭它,你需要先杀死SafariDriver7050应用,然后你需要杀死safaridriver进程。顺序很重要,否则它将在UI上创建一个错误对话框

修改-1:

正如您所建议的那样,当您将测试作为应用程序包装然后它将自动启动SafariDriver而没有任何问题时,这样做会更容易。问题的关键是在SSH会话中使用open命令

修改-2

为什么SafariDriver无法在SSH中运行?好吧,如果你看看linux对手

在linux的情况下,我们可以使用DISPLAY环境变量在现有显示器中启动应用程序,或者我们可以使用XVFB之类的东西在虚拟显示器中启动浏览器。这是大多数框架在linux机器上使用的概念。

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

答案 1 :(得分:0)

就我而言:

  1. 如上所述,在OSX主机端创建了Automator应用程序,并进行了一些修改:
security unlock-keychain -p your_host_password /Users/$USER/Library/Keychains/login.keychain-db
safaridriver --enable
safaridriver -p 7050
  1. 在CCI / Jenkins方面:
open /Applications/StartSafariDriver7050.app/
run pytest cmd
osascript -e 'quit app "StartSafariDriver7050"'
pkill safaridriver
  1. 在Python中:
def safaridriver():
    return webdriver.Safari(desired_capabilities=Caps.SAFARI, port=7050)