Selenium在Firefox中使用了太多内存

问题描述 投票:2回答:3

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

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

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

我从不关闭驱动程序,因为它会使程序变慢,因为它有很多查询需要处理。有没有办法在不关闭或退出驱动程序的情况下保持内存使用不会增加加班时间?

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

python selenium firefox geckodriver selenium-firefoxdriver
3个回答
1
投票

首先,Selenium几乎无法控制Firefox使用的RAM量。正如您提到的浏览器客户端,即Mozilla在Instagram上的用户配置文件和通知页面之间来回切换,并根据它发现的任务执行的任务过于宽泛而不是单个用例。因此,首要任务是将与您的用例相关的无限循环拆分为较小的测试。


time.sleep()

诱导time.sleep()在根本上解决了根本问题。然而,使用Selenium和WebDriver进行自动化使用time.sleep(secs)而没有任何特定条件来实现自动化的目的,应该不惜一切代价避免。根据文件:

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

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


分析

之前的情况是Firefox消耗了大约80%的RAM。

Firefox_RAM

然而,根据this discussion,一些用户认为使用的内存越多越好,因为这意味着你没有浪费RAM。 Firefox使用RAM使其进程更快,因为应用程序数据在RAM中传输速度更快。


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

  • 将Selenium升级到当前水平Version 3.141.59
  • 将GeckoDriver升级到GeckoDriver v0.24.0级别。
  • 将Firefox版本升级到Firefox v65.0.2级别。
  • 通过IDE清理项目工作区,并仅使用所需的依赖项重建项目。
  • 如果您的基本Web客户端版本太旧,请将其卸载并安装最新的GA和已发布的Web客户端版本。
  • 一些扩展允许您阻止此类不必要的内容,例如: uBlock Origin允许您在网站上隐藏广告。 NoScript允许您有选择地启用和禁用网站上运行的所有脚本。 要使用扩展名打开Firefox客户端,您可以从XPI下载扩展名,即https://addons.mozilla.org文件,并使用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,您可以在this discussion之后禁用CSS。

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

2
投票

创建新的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);

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

© www.soinside.com 2019 - 2024. All rights reserved.