在Ubuntu Server中使用Selenium无头模式,轻微错误“浏览器似乎在我们连接之前已退出”
我在一个Ubuntu服务器的虚拟机上运行Selenium,遇到一个小问题。当我启动虚拟机并运行Selenium测试脚本时,出现了这个错误:selenium.common.exceptions.WebDriverException: Message: '浏览器似乎在我们连接之前就退出了'。不过,如果我在终端里先执行export DISPLAY=:99这个命令,然后再运行我的Selenium测试脚本,一切就正常了。所有测试都能顺利运行,且没有界面显示!
我想问问大家,有没有办法让这个命令在启动时自动执行,这样我就不用在每次运行Selenium测试脚本之前都手动输入这个命令。我尝试把它添加到/etc/rc.local文件里,但似乎没有效果。
我也试过在我的Selenium测试脚本开头执行这个命令,只需添加这个(我用的是python)
os.system("export DISPLAY=:99")
有没有什么建议可以实现这个呢?谢谢大家!
1 个回答
这个方法行不通:
os.system("export DISPLAY=:99")
因为 system()
会启动一个新的命令行窗口,而这个窗口在完成后会关闭,这样只会影响到一个非常短暂的进程。(子进程不能影响它们的父进程的环境。父进程只能在执行子进程之前改变环境,才能影响到子进程。)
你可以选择几种不同的方法来设置 DISPLAY
:
在启动测试机制的脚本中设置
如果系统可能会执行其他任务,这种方法特别好,因为它会尽量减少影响。在 Python 中,这样写:
os.environ["DISPLAY"]=":99"
在
bash(1)
中,这样写:export DISPLAY=:99
在运行测试的用户账户的登录脚本中设置。
如果运行测试的用户账户永远不需要
DISPLAY
变量,这种方法很好。(不过如果用户通过ssh -X testinguser@machine ...
登录,这会覆盖通常的ssh(1)
X 会话转发。)把这个添加到用户的
~/.bashrc
或~/.profile
或~/.bash_profile
中。(关于这些文件的区别,可以查看bash(1)
。)export DISPLAY=:99
为所有用户在登录时设置。这种方法很好,如果系统上的多个用户账户都要运行测试脚本,而你只想让它对所有人都有效。你不在乎用户是否需要用于 X 转发的
DISPLAY
。编辑
/etc/environment
来添加新的变量。pam_env(8)
PAM 模块会为所有在/etc/pam.d/
配置目录下经过认证的用户账户设置环境变量。(这听起来比实际复杂——有些服务希望经过认证的用户有环境变量,有些则不需要。)