我有最新版本的驱动程序(chromedriver=2.44.609551(、硒包(3.141.0(和(无头chrome=7.0.3538.110(。(在windows上(
我正在用浏览器打开多个窗口。使用firefox,我的脚本总是很快。但在chrome上,在切换到一个窗口(页面已经加载(后,当我试图从浏览器中获取任何内容(如driver.page_source或任何find_element(时,我会得到4秒的延迟。
我做错什么了吗?
[driver.execute_script('window.open(arguments[0]);', url) for url in urls]
for window in driver.window_handles[1:]:
driver.switch_to.window(window)
driver.page_source #it takes 4s here
driver.find_elements_by_class_name('class_name') #regular speed here (fast)
break
如果我用driver.find_elements_by_class_name('class_name')
切换driver.page_source
,第一个总是很慢。
正如您在问题中提到的那样,GeckoDriver/Firefox的组合比ChromeDriver/Chrome更快。在这一点上,值得一提的是,不同的浏览器以不同的方式呈现HTML DOM。
你可以在Chrome&Windows上的Firefox与Linux(selenium(
此外,关于Chrome Headless会话不可预测的CPU和内存消耗,也有很多讨论。
根据讨论,无头构建最低cpu+内存使用率的cpu+内存使用可以通过以下方式进行优化:
- 使用自定义代理或C++ProtocolHandlers,您可以返回存根1x1像素的图像,甚至可以完全阻止它们
- Chromium团队正在致力于添加一个程序控制框架的生产时间。目前,无头chrome仍在尝试以60 fps的速度渲染,这相当浪费。许多页面确实需要一些帧(可能110-20 fps(才能正确渲染(由于使用了
requestAnimationFrame
和animation triggers
(,但我们预计这里可以节省大量CPU - MemoryInfra应该可以帮助您确定哪个组件是设置中最大的内存消耗者
-
一种用法可以是:
$ headless_shell --remote-debugging-port=9222 --trace-startup=*,disabled-by-default-memory-infra http://www.chromium.org
-
Chromium总是会使用尽可能多的可用资源。如果你想有效地限制它的利用率,你应该考虑使用cgroups
您可以在限制铬无头CPU和内存使用中找到详细的讨论