2

当我尝试通过 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

提前致谢

4

2 回答 2

3

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

Safari 应用程序

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

然后从您需要执行的 SSH 会话中

open /Applications/SafariDriver7050.app

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

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

编辑-1:

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

编辑-2

为什么 SafariDriver 在 SSH 中不起作用?好吧,如果你看看 linux 对应的

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

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

于 2018-01-15T18:45:06.377 回答
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)
于 2020-06-17T15:55:22.930 回答