当我尝试在 3 台计算机中的 2 台上运行代码时,我收到此错误:
[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 位,谷歌浏览器 64 位 版本: 66.0.3359.139, python 2.7 32 位, 铬驱动程序.exe 32 位, pycharm 2018.1.1
有趣的是,如果我在没有无头选项的情况下运行它,那么一切正常。浏览器弹出,按下I'm feeling lucky
按钮,然后截取屏幕截图。只有当我添加无头位时,才会发生此错误。
我不确定当其他系统运行相同的软件时,在一个允许它工作的系统上会有什么不同。
当 GoogleTeam首次将Headless Chrome作为GA(正式发布(发布时,文章Getting Started with 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团队决定将SwiftShader与Chrome一起发布时,团队认为开始使用它以无头模式渲染GL内容。这需要进行以下一些更改:
- 在无头模式下跳过 GPU 数据收集,因为该代码不认为SwiftShader是软件实现,当我们尝试从窗口系统检索信息时会导致失败。
- 如果我们打算使用osmesa,则仅在InitializeStaticEGLIternal中跳过GL 初始化。SwiftShader需要像其他非软件实现一样进行初始化。
- Mac OSX目前不支持SwiftShader,因此团队决定继续在该平台上以无头模式使用物理GPU(与其他平台上所有内容都是软件渲染的平台上不同(。
- 因此,为了在无头模式下禁用WebGL支持,他们决定使用--disable-gpu和--disable-software-rasterizer 。
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
,您可以暂时忽略该错误。
我遇到了同样的问题。尝试将这些标志添加到 Chrome 驱动程序选项中:
options.add_arguments("--proxy-server='direct://'");
options.add_arguments("--proxy-bypass-list=*");
有关详细信息,请参阅此链接。