Python、Selenium和Chromedriver—使用按id查找元素的无休止循环会导致CPU问题
大家好!我已经经历了一个星期的问题,但我不认为我可以解决它,我也没有看到任何解决方案的基础上的文章在线。希望有人能在这里帮助我 我的场景: 我需要在一个页面中监控6个不同表的价格,几乎每秒钟都在变化。在一天结束时,我会关闭浏览器(按X按钮),终止脚本(按Control+C),然后在早上再次运行,让它运行一整天。该脚本是用python编写的,并使用selenium读取价格。我使用的浏览器是Chrome。我的操作系统是Windows2008R2;Selenium版本是3.14.1 下面是部分代码。它只是在一个无限循环中,以1秒为间隔,使用find\u elements\u by\u id简单地读取表中的价格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 下面是部分代码。它
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出现此问题的原因并解决此问题。您是否尝试过将内存释放到循环中? 也许通过拾取值(循环外列表?),然后将这些变量重置为
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(){}
,以优雅地关闭和销毁Web驱动程序和Web客户端实例。driver.quit()
- 您可以在中找到详细的讨论
- 切勿终止脚本(按Control+C)。如果存在
- 您可以在中找到详细的讨论
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)
是一个很大的问题
- 您可以在中找到详细的讨论
- 您可以在中找到详细的讨论
- 将ChromeDriver升级到当前级别
- 将Chrome版本保持在Chrome v69-71级别之间。()
- 通过IDE清理项目工作区,并仅使用所需的依赖项重建项目
- 如果您的基本Web客户端版本太旧,请通过卸载它并安装最新的GA和Web客户端发布版本
- 重新启动系统
- 执行
@测试
- (仅限Windows OS)在执行测试套件之前和之后,使用该工具清除所有操作系统杂务
- (仅限LinuxOS)在执行测试套件之前和之后
来自评论:这看起来更像是一条评论,你能把它移到那里吗?谢谢你的建议。我试图通过将变量重置为无来释放内存,但这并没有解决问题。我将尝试强制垃圾收集器并在此处发布更新…在任务管理器中,哪个应用程序使用高CPU?Chrome.exe位于任务管理器顶部,占用大部分CPU。。它们的消耗量约为30~50%。文章免费发布。。。根据它自己页面上的评论,它实际上具有令人难以置信的误导性,并且不使用:/proc/sys/vm/drop\u缓存