Selenium 在 Firefox 中使用过多内存

Nae*_*han 6 python firefox selenium selenium-firefoxdriver geckodriver

我在 Firefox 中使用 selenium 来自动化 Instagram 上的一些任务。它基本上在用户配置文件和通知页面之间来回切换,并根据发现的内容执行任务。

它有一个无限循环,可确保任务继续进行。我每隔几步就有 sleep() 函数,但内存使用量不断增加。我在 Python 中有这样的东西:

while(True):
    expected_conditions()
    ...doTask()
    driver.back()
    expected_conditions()
    ...doAnotherTask()
    driver.forward()
    expected_conditions()
Run Code Online (Sandbox Code Playgroud)

我从不关闭驱动程序,因为这会大大减慢程序的速度,因为它有很多查询要处理。有没有办法在不关闭或退出驱动程序的情况下防止内存使用增加超时?

编辑:添加了明确的条件,但这也没有帮助。我正在使用 Firefox 的无头模式。

Dar*_*ght 11

嗯,这是我几天来一直遇到的严重问题。但我已经找到了解决方案。您可以添加一些标志来优化内存使用。

options = Options()
options.add_argument("start-maximized")
options.add_argument("disable-infobars")
options.add_argument("--disable-extensions")
options.add_argument('--no-sandbox')
options.add_argument('--disable-application-cache')
options.add_argument('--disable-gpu')
options.add_argument("--disable-dev-shm-usage")
Run Code Online (Sandbox Code Playgroud)

这些是我添加的标志。在我添加标志之前,RAM 使用量在超过 4GB(我的机器是 8GB)后不断增加,我的机器卡住了。添加这些标志后,内存使用量没有超过 500MB。正如DebanjanB回答的那样,如果您运行for loopwhile loop尝试在每次执行后休眠几秒钟,它将给予一些时间来杀死未使用的线程。


Deb*_*anB 5

首先,SeleniumFirefox使用的RAM量几乎没有控制。正如您提到的,浏览器客户端MozillaInstagram 上的用户配置文件和通知页面之间来回切换,并根据它发现的作为单一用例的内容来执行任务。因此,首要任务是将与您的用相关的无限循环分解为较小的Tests


时间.sleep()

诱导time.sleep()实际上掩盖了根本问题。然而在使用webdriver的通过你的执行的测试自动化框架使用,time.sleep()没有任何具体的条件违背了自动化的目的,应不惜一切代价避免。根据文档:

time.sleep(secs)在给定的秒数内暂停当前线程的执行。参数可能是一个浮点数,以指示更精确的睡眠时间。实际的暂停时间可能比请求的少,因为任何捕获的信号都会在执行该信号的捕获例程后终止 sleep()。此外,由于系统中其他活动的调度,暂停时间可能比任意数量的请求长。

您可以在How to sleep webdriver in python for milliseconds 中找到详细讨论


分析

之前有过Firefox消耗大约 80% 内存的情况。

火狐_内存

但是,根据此讨论,一些用户认为使用的内存越多越好,因为这意味着您不会浪费 RAM。Firefox 使用 RAM 使其进程更快,因为应用程序数据在 RAM 中的传输速度要快得多。


解决方案

您可以执行以下任一/所有通用/特定步骤:

  • Selenium升级到当前级别版本 3.141.59
  • 升级GeckoDriverGeckoDriver v0.24.0水平。
  • Firefox版本升级到Firefox v65.0.2级别。
  • 清理你的项目工作,通过你的IDE重建仅需要依赖你的项目。
  • 如果您的基本Web 客户端版本太旧,请卸载它并安装最新的 GA 和发布版本的Web 客户端
  • 一些扩展允许您阻止此类不必要的内容,例如:

  • 如果您的测试不需要CSS,您可以按照此讨论禁用CSS