Python、Selenium和Chromedriver—使用按id查找元素的无休止循环会导致CPU问题

Python、Selenium和Chromedriver—使用按id查找元素的无休止循环会导致CPU问题,python,selenium,google-chrome,selenium-chromedriver,cpu-usage,Python,Selenium,Google Chrome,Selenium Chromedriver,Cpu Usage,大家好!我已经经历了一个星期的问题,但我不认为我可以解决它,我也没有看到任何解决方案的基础上的文章在线。希望有人能在这里帮助我 我的场景: 我需要在一个页面中监控6个不同表的价格,几乎每秒钟都在变化。在一天结束时,我会关闭浏览器(按X按钮),终止脚本(按Control+C),然后在早上再次运行,让它运行一整天。该脚本是用python编写的,并使用selenium读取价格。我使用的浏览器是Chrome。我的操作系统是Windows2008R2;Selenium版本是3.14.1 下面是部分代码。它

大家好!我已经经历了一个星期的问题,但我不认为我可以解决它,我也没有看到任何解决方案的基础上的文章在线。希望有人能在这里帮助我

我的场景: 我需要在一个页面中监控6个不同表的价格,几乎每秒钟都在变化。在一天结束时,我会关闭浏览器(按X按钮),终止脚本(按Control+C),然后在早上再次运行,让它运行一整天。该脚本是用python编写的,并使用selenium读取价格。我使用的浏览器是Chrome。我的操作系统是Windows2008R2;Selenium版本是3.14.1

下面是部分代码。它只是在一个无限循环中,以1秒为间隔,使用find\u elements\u by\u id简单地读取表中的价格

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出现此问题的原因并解决此问题。

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

...
while True:

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

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

import gc

while True: 
...
    gc.collect()
如果您认为原因可能是脚本,那么另一个检测问题的解决方案可能是启用Chrome来执行和调试页面

--remote-debugging-port=9222

我希望这能对您有所帮助。

如果不了解您的代码块(特别是WebDriver配置),很难猜测100%CPU使用率的确切原因。因此,答案基本上基于以下通用指南:

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
  • 切勿关闭浏览器(按X按钮)。始终在
    tearDown(){}
    方法中调用
    driver.quit()
    ,以优雅地关闭和销毁Web驱动程序和Web客户端实例。
    • 您可以在中找到详细的讨论
  • 切勿终止脚本(按Control+C)。如果存在僵尸Web驱动程序或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
    
  • 时间的形式使用硬编码睡眠。睡眠(1)
    是一个很大的问题

    • 您可以在中找到详细的讨论
  • 如果您在无头模式下使用Chrome,那么关于Chrome无头会话不可预测的CPU和内存消耗,已经有很多讨论。
    • 您可以在中找到详细的讨论
  • 始终使用最新发布的二进制文件更新测试环境,如下所示:
    • 将ChromeDriver升级到当前级别
    • 将Chrome版本保持在Chrome v69-71级别之间。()
    • 通过IDE清理项目工作区,并仅使用所需的依赖项重建项目
    • 如果您的基本Web客户端版本太旧,请通过卸载它并安装最新的GA和Web客户端发布版本
    • 重新启动系统
    • 执行
      @测试
  • 从空间和内存管理的角度来看:
    • (仅限Windows OS)在执行测试套件之前和之后,使用该工具清除所有操作系统杂务
    • (仅限LinuxOS)在执行测试套件之前和之后

来自评论:这看起来更像是一条评论,你能把它移到那里吗?谢谢你的建议。我试图通过将变量重置为无来释放内存,但这并没有解决问题。我将尝试强制垃圾收集器并在此处发布更新…在任务管理器中,哪个应用程序使用高CPU?Chrome.exe位于任务管理器顶部,占用大部分CPU。。它们的消耗量约为30~50%。文章免费发布。。。根据它自己页面上的评论,它实际上具有令人难以置信的误导性,并且不使用:/proc/sys/vm/drop\u缓存