繁体   English   中英

Selenium 在 Firefox 中使用过多内存

[英]Selenium using too much RAM with Firefox

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

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

while(True):
    expected_conditions()
    ...doTask()
    driver.back()
    expected_conditions()
    ...doAnotherTask()
    driver.forward()
    expected_conditions()

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

编辑:添加了明确的条件,但这也无济于事。 我正在使用 Firefox 的无头模式。

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


时间.sleep()

引入time.sleep()实际上掩盖了潜在的问题。 然而,在使用SeleniumWebDriver通过自动化框架执行测试时,在没有任何特定条件的情况下使用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 客户端
  • 一些扩展允许您阻止此类不必要的内容,例如:

    • uBlock Origin允许您隐藏网站上的广告。
    • NoScript允许您有选择地启用和禁用网站上运行的所有脚本。
    • 要打开带有扩展的Firefox客户端,您可以从https://addons.mozilla.org下载扩展,即XPI文件,并使用add_extension(extension='webdriver.xpi')方法在FirefoxProfile 中添加扩展,如下所示:

       from selenium import webdriver profile = webdriver.FirefoxProfile() profile.add_extension(extension='extension_name.xpi') driver = webdriver.Firefox(firefox_profile=profile, executable_path=r'C:\\path\\to\\geckodriver.exe')
  • 如果您的测试不需要CSS,您可以按照此讨论禁用CSS

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

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")

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

  • 使用显式等待或隐式等待。
  • 使用 driver.quit() 关闭所有浏览器窗口并终止 WebDriver 会话,因为如果您在程序结束时不使用 quit(),WebDriver 会话将不会正确关闭,文件也不会从内存中清除. 这可能会导致内存泄漏错误。

创建新的 Firefox 配置文件并在 Firefox 中运行测试用例时每次都使用它最终会提高执行性能,因为如果不这样做,总是会创建新的配置文件并在那里完成缓存信息,如果 driver.quit 之前没有以某种方式被调用失败然后在这种情况下,每次我们最终都会创建新的配置文件,其中包含一些会消耗内存的缓存信息。

// ------------ 创建一个新的 Firefox 配置文件 -----------

1. If Firefox is open, close Firefox.
2. Press Windows +R on the keyboard. A Run dialog will open.
3. In the Run dialog box, type in firefox.exe -P
Note: You can use -P or -ProfileManager(either one should work).
4. Click OK.
5. Create a new profile and sets its location to the RAM Drive.

// ----------- 关联 Firefox 配置文件 -----------

ProfilesIni profile = new ProfilesIni();
FirefoxProfile myprofile = profile.getProfile("automation_profile");
WebDriver driver = new FirefoxDriver(myprofile);

如果您打算以这种方式实施,请与社区分享执行性能。

目前还没有解决办法。 我建议你使用 driver.close() 方法。 我也在努力解决 RAM 问题,我所做的是计算循环次数,当循环次数达到某个数字(对我来说是 200)时,我调用了 driver.close() 然后再次启动驱动程序并重置计数。 这样我就不需要在每次执行循环时关闭驱动程序,对性能的影响也较小。 尝试这个。 也许它对你的情况也有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM