Python,Selenium和Chromedriver-使用find_element_by_id的无限循环会导致CPU问题

时间:2018-12-07 08:54:22

标签: python selenium google-chrome selenium-chromedriver cpu-usage

大家好!我已经遇到这个问题一个星期了,但我认为我无法解决,而且我也看不到任何基于在线文章的解决方案。希望有人可以在这里帮助我...

我的情况: 我需要在一页中几乎每秒钟更改一次的6个不同表中监视价格。到一天结束时,我将关闭浏览器(按X按钮)并终止脚本(按Control + C),然后在早上再次运行并让它运行一整天。该脚本是用python编写的,并使用硒来读取价格。我使用的浏览器是Chrome。我的操作系统是Windows 2008 R2;硒版本为3.14.1

这是代码的一部分。只是使用 find_elements_by_id 在1秒间隔的无限循环内简单地读取表中的价格。

While True:
    close1 = float(browser.find_element_by_id('bnaBox1').find_elements_by_id('lastprc1')[0].text.encode('ascii','ignore'))
    close2 = float(browser.find_element_by_id('bnaBox2').find_elements_by_id('lastprc2')[0].text.encode('ascii','ignore'))
    close3 = float(browser.find_element_by_id('bnaBox3').find_elements_by_id('lastprc3')[0].text.encode('ascii','ignore'))
    close4 = float(browser.find_element_by_id('bnaBox4').find_elements_by_id('lastprc4')[0].text.encode('ascii','ignore'))
    close5 = float(browser.find_element_by_id('bnaBox5').find_elements_by_id('lastprc5')[0].text.encode('ascii','ignore'))
    close6 = float(browser.find_element_by_id('bnaBox6').find_elements_by_id('lastprc6')[0].text.encode('ascii','ignore'))
    time.sleep(1)
...

在运行的前几分钟,脚本消耗的CPU量最少(大约20%到30%),但在几分钟后,消耗量却缓慢上升到100%!除了脚本之外,计算机中没有其他进程在运行。

我到目前为止已完成的问题排查(它们都无法解决我的问题)

  • 将我的chrome升级到了最新版本-v71和chromerdriver 2.44
  • 将Chrome浏览器还原到以前的版本(v62,v68,v69,v70)
  • 将Chromedriver版本降到2.42和2.43
  • 清除了我的%TEMP%个文件-
  • 重新启动计算机(多次)

该程序仅在表中获取值,但我怀疑在脚本运行时,在后台某处会堆积不必要的数据,从而导致CPU崩溃。

希望有人可以帮助我找出导致CPU出现此问题的原因并解决问题。

2 个答案:

答案 0 :(得分:1)

很难猜测 100%CPU使用率的确切原因,而又没有对代码块的任何可见性,尤其是 WebDriver 配置。因此,答案将很大程度上基于通用准则,如下所示:

  • 请勿关闭浏览器(通过按X按钮)。始终在driver.quit()方法内调用tearDown(){},以优雅地关闭和销毁 WebDriver Web Client 实例。
  • 从不终止脚本(通过按Control + C)。如果存在僵尸 WebDriver Web浏览器实例,则可以通过编程方式将其删除。
  • 几个有用的ChromeOptions()及其用法如下:

    options.addArguments("start-maximized"); // open Browser in maximized mode
    options.addArguments("disable-infobars"); // disabling infobars
    options.addArguments("--disable-extensions"); // disabling extensions
    options.addArguments("--disable-gpu"); // applicable to windows os only
    options.addArguments("--disable-dev-shm-usage"); // overcome limited resource problems
    options.addArguments("--no-sandbox"); // Bypass OS security model
    
  • 使用time.sleep(1)形式的硬编码睡眠是很大的

  • 如果您在 headless 模式下使用 Chrome ,那么关于 Chrome Headless会话的不可预测的CPU和内存消耗的讨论很多/ strong>。
  • 始终使用以下最新发布的二进制文件更新您的 Test Environment
    • ChromeDriver 升级到当前的ChromeDriver v2.44级别。
    • Chrome 版本保持在 Chrome v69-71 级别之间。 (as per ChromeDriver v2.44 release notes
    • 通过您的 IDE
    • 清理您的项目工作区重建您的项目,并且仅具有必需的依赖项。
    • 如果您的基本 Web客户端版本过旧,请通过Revo Uninstaller进行卸载,并安装最新版本的 Web客户端。 li>
    • 进行系统重启
    • 执行您的@Test
  • 空间和内存管理角度来看:

答案 1 :(得分:0)

您是否尝试过将内存释放到循环中? 也许可以通过选择值(是否是循环列表?)然后将这些变量重置为None来避免过多的内存消耗。

...
while True:

...
    close1 = close2 = close3 = close4 = close5 = close6 = None

...

您也可以尝试强制垃圾收集器:

import gc

while True: 
...
    gc.collect()

如果您认为原因可能是脚本,则检测该问题的另一种解决方案可能是使Chrome浏览器执行remote debug并调试页面。

--remote-debugging-port=9222

我希望其中一些可以帮助您。