在Ubuntu Server中使用Selenium无头模式,轻微错误“浏览器似乎在我们连接之前已退出”

1 投票
1 回答
1744 浏览
提问于 2025-04-17 08:01

我在一个Ubuntu服务器的虚拟机上运行Selenium,遇到一个小问题。当我启动虚拟机并运行Selenium测试脚本时,出现了这个错误:selenium.common.exceptions.WebDriverException: Message: '浏览器似乎在我们连接之前就退出了'。不过,如果我在终端里先执行export DISPLAY=:99这个命令,然后再运行我的Selenium测试脚本,一切就正常了。所有测试都能顺利运行,且没有界面显示!

我想问问大家,有没有办法让这个命令在启动时自动执行,这样我就不用在每次运行Selenium测试脚本之前都手动输入这个命令。我尝试把它添加到/etc/rc.local文件里,但似乎没有效果。

我也试过在我的Selenium测试脚本开头执行这个命令,只需添加这个(我用的是python)

os.system("export DISPLAY=:99")

有没有什么建议可以实现这个呢?谢谢大家!

1 个回答

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/ 配置目录下经过认证的用户账户设置环境变量。(这听起来比实际复杂——有些服务希望经过认证的用户有环境变量,有些则不需要。)

撰写回答