带有无头 Chrome 的 Tkinter 在 Mac 上运行良好,但在 Ubuntu 服务器上运行不正常

Posted

技术标签:

【中文标题】带有无头 Chrome 的 Tkinter 在 Mac 上运行良好,但在 Ubuntu 服务器上运行不正常【英文标题】:Tkinter with headless Chrome runs fine on Mac but not on Ubuntu server 【发布时间】:2020-12-14 16:27:41 【问题描述】:

我正在编写一个 Python 脚本,它打开一个链接并单击一个链接以将内容复制到剪贴板。然后我使用 Tkinter 将内容传递给变量。以下是我的脚本的一部分:

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

chromeOptions = webdriver.ChromeOptions()
chromeOptions.add_argument("--headless")
chromeOptions.add_argument('window-size=1366x768')
driver = webdriver.Chrome(options=chromeOptions)

driver.get('https://www.example.com')

r = Tk()
r.withdraw()

while not r.selection_get(selection="CLIPBOARD"):
      time.sleep(0.1)

copyResult = r.selection_get(selection="CLIPBOARD")

在 Mac 上执行脚本时,它可以完美运行,但在 Ubuntu 上却出现此错误:

Traceback (most recent call last):
  File "DeliveryTracking.py", line 52, in <module>
    r = Tk()
  File "/usr/lib/python3.8/tkinter/__init__.py", line 2261, in __init__
    self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: no display name and no $DISPLAY environment variable

我的 Ubuntu 服务器托管在 Amazon EC2 上,因此没有 GUI。这就是我在 Ubuntu 上收到此错误的原因吗?如果是,那么有什么替代方案?无论如何,在 Mac 上我还指定了 --headless 参数,所以它不应该使用任何 GUI 来运行脚本。不过我可能错了。

编辑:

我尝试按照this link 安装xvfb。但是,执行脚本时仍然出现以下错误:

Traceback (most recent call last):
  File "DeliveryTracking.py", line 49, in <module>
    driver = webdriver.Chrome(options=chromeOptions)
  File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/chrome/webdriver.py", line 76, in __init__
    RemoteWebDriver.__init__(
  File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/remote/webdriver.py", line 157, in __init__
    self.start_session(capabilities, browser_profile)
  File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/remote/webdriver.py", line 252, in start_session
    response = self.execute(Command.NEW_SESSION, parameters)
  File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: exited abnormally.
  (unknown error: DevToolsActivePort file doesn't exist)
  (The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)

如果我只运行 Google Chrome,我会收到此错误 [15352:15352:1215/003611.154158:ERROR:browser_main_loop.cc(1426)] Unable to open X display.

【问题讨论】:

【参考方案1】:

问题不在于在无头环境中运行 chrome,而在于运行 tkinter。 Tkinter 需要一个显示器,无论是物理显示器还是 Linux 环境下的 X11 显示器。在大多数情况下,这意味着 tkinter 无法在服务器环境中运行,除非您将该环境设置为具有 tkinter 进程的虚拟显示(例如:xvfb)。

【讨论】:

感谢您的回答。就像我怀疑的那样。但我确实在 Mac 上指定了--headless 那么为什么它能够运行呢?我还按照这个答案***.com/a/61043049/5685946 安装了xvfb,但它也没有工作。我将编辑我的问题以包含 xvfb。 @KelvinLow:tkinter 没有“--headless”选项。

以上是关于带有无头 Chrome 的 Tkinter 在 Mac 上运行良好,但在 Ubuntu 服务器上运行不正常的主要内容,如果未能解决你的问题,请参考以下文章

反爬虫中chrome无头浏览器的几种检测与绕过方式

PhantomJS使用Chrome或Firefox的无头版本来替代

在无头模式下运行 Chrome

Qt 5.7:使用无头 QWebEngine

seleniumChrom无头浏览器

Chrome 浏览器无头问题:没有这样的元素:无法在 chrome://downloads/ 找到元素 [重复]