当我尝试通过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
提前致谢
答案 0 :(得分:2)
有一种可行的解决方法可以做到这一点。首先,您需要创建一个启动SafariDriver的Automator工作流程或Apple脚本
然后将其另存为应用程序。假设我们将其命名为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)
就我而言:
security unlock-keychain -p your_host_password /Users/$USER/Library/Keychains/login.keychain-db
safaridriver --enable
safaridriver -p 7050
open /Applications/StartSafariDriver7050.app/
run pytest cmd
osascript -e 'quit app "StartSafariDriver7050"'
pkill safaridriver
def safaridriver():
return webdriver.Safari(desired_capabilities=Caps.SAFARI, port=7050)