错误:在Headless模式下通过ChromeDriver初始化Chrome浏览器时,ERROR:gpu_process_transport_factory.cc(1007)-Lost UI shared context。

6

当我尝试在三台计算机中的两台上运行代码时,出现了以下错误:

[0502/155335.565:ERROR:gpu_process_transport_factory.cc(1007)] Lost UI shared context.

以下是代码:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import os

chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument("--disable-gpu")
chrome_options.add_argument("--window-size=1920x1080")

chrome_driver = os.getcwd() + "\\chromedriver.exe"
print "chrome driver:" + chrome_driver

driver = webdriver.Chrome(chrome_options=chrome_options, 
executable_path=chrome_driver)

driver.get("http://www.google.com")

luck_button = driver.find_element_by_css_selector("[name=btnI")
luck_button.click()

driver.get_screenshot_as_file("capture.png")

现在我已经检查了所有的系统,它们都运行着Windows 10 64位操作系统,Google Chrome 64位版本:66.0.3359.139,Python 2.7 32位版本,chromedriver.exe 32位版本和Pycharm 2018.1.1。
有趣的是,如果我不使用无头选项来运行这个程序,那么一切都可以正常工作。浏览器会弹出,点击“我感到幸运”按钮,并且会拍摄一个截屏。只有当我添加了无头选项时才会出现这个错误。
我不确定为什么只有一个系统上能够正常工作,而其他系统却使用相同的软件。
2个回答

10

无头浏览器 Headless Chrome首次由Google团队发布为GA(正式版)时,文章入门指南:使用无头浏览器 Headless Chrome提到:

--disable-gpu \                # Temporarily needed if running on Windows.

添加了一个注释:

如果您在Windows上运行,请同时包含--disable-gpu标志。

根据讨论Headless: make --disable-gpu flag unnecessary,可以得知:

在Linux或Mac OSX上,--disable-gpu标志不再必要。一旦修复错误SwiftShader fails an assert on Windows in headless mode,它也将在Windows上变得不必要。

底层发生了什么?

根据讨论headless: Switch from osmesa to SwiftShader,Google/Chromium团队决定将SwiftShaderChrome一起发布,团队想开始使用它来呈现Headless Mode中的GL内容。这需要进行一些更改,如下所示:

  • Headless Mode中跳过GPU数据收集,因为该代码不认为SwiftShader是软件实现,这导致我们尝试从Window System检索信息时失败。
  • 仅在我们打算使用osmesa时,在InitializeStaticEGLInternal中跳过GL初始化。像其他非软件实现一样,SwiftShader需要初始化。
  • SwiftShader目前不支持Mac OSX,因此团队决定在该平台上继续在Headless Mode中使用physical GPU(与在其他平台上一样,一切都是软件渲染)。
  • 因此,为了在Headless Mode中禁用WebGL支持,他们决定使用--disable-gpu--disable-software-rasterizer

支持在Headless Mode中的Support WebGL in headless的想法仍在讨论中,但SwiftShader fails an assert on Windows in headless mode出现错误:

[0117/125830.649194:ERROR:gpu_process_transport_factory.cc(1043)] Lost UI shared context.
DevTools listening on ws://127.0.0.1:37429/devtools/browser/1f0b2bf7-dfdd-44ac-9da7-f2659d352f0d

结论

这个错误不会影响您的@Test,您可以暂时忽略该错误。


我们正在使用 ember exam 运行测试,但由于这个错误它完全停止了。有没有什么解决方法可以修复它? - xbmono
@xbmono 如果没有"相关的html","代码尝试"和"错误堆栈跟踪",则无法对 ember exam 进行评论。但是,根据来自 Chromium团队 的文档,错误 Lost UI shared context 看起来无害,并且在 Windows10操作系统 上很容易复现,这并不是一个阻碍问题 - undetected Selenium
在Windows上可能不是阻塞问题,但我们正在使用Debian和Jenkins Pipeline。由于此问题,我们所有的测试都失败并停止了。我们现在决定暂时禁用测试,这并不好。 - xbmono
我有以下这些设置:module.exports = { "test_page": "tests/index.html?hidepassed", "disable_watching": true, "parallel": 6, "launch_in_ci": [ "Chrome" ], "launch_in_dev": [ "Chrome" ], "browser_start_timeout": 80, "browser_args": { "Chrome": [ '--no-sandbox', '--disable-gpu', '--headless', '--window-size=1440,900' ] } }; - xbmono
@xbmono,由于您正在使用Debian,--disable-gpu不是所需的参数。请参见讨论Lost UI Shared Context Error - Running protractor tests in headless chrome - undetected Selenium
我在没有 --disable-gpu 标志的情况下遇到了这个问题。 - nights

0

我曾经遇到过同样的问题。尝试在Chrome驱动器选项中添加这些标志:

options.add_arguments("--proxy-server='direct://'");
options.add_arguments("--proxy-bypass-list=*");

请参考此链接获取更多信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接