硒在Firefox中使用过多RAM

时间:2019-03-09 00:18:13

标签: python selenium firefox geckodriver selenium-firefoxdriver

我在Firefox上使用硒来自动执行Instagram上的某些任务。它基本上在用户个人资料和通知页面之间来回移动,并根据发现的内容执行任务。

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

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

我从不关闭驱动程序,因为这会减慢程序的速度,因为它要处理的查询很多。有什么方法可以避免在不关闭或退出驱动程序的情况下增加内存使用量的时间?

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

5 个答案:

答案 0 :(得分: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);

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

答案 1 :(得分:2)

到目前为止,尚无此修复程序。 我建议您使用driver.close()方法。 我也在内存问题上苦苦挣扎,我所做的是我计算了循环数,当循环数达到一定数量(对我来说是200)时,我调用driver.close(),然后再次启动驱动程序并重置计数。 这样,我不需要在每次执行循环时都关闭驱动程序,并且对性能的影响也较小。 尝试这个。也许这也会对您有帮助。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

Selenium 开始,对 Firefox 使用的 RAM 的数量几乎没有控制。正如您提到的 Browser Client ,即 Mozilla Instagram 上的用户个人资料和通知页面之间来回移动,并根据发现的内容执行任务作为单个用例太宽。因此,首要任务是将与您的用例有关的无限循环分解为较小的 Tests


time.sleep()

生动地引出time.sleep()掩盖了潜在的问题。但是,在使用 time.sleep(secs) 使用 Selenium WebDriver 进行自动化时,没有任何特定条件实现 违反了自动化 的目的,应不惜一切代价避免这样做。根据文档:

  

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

您可以在How to sleep webdriver in python for milliseconds

中找到详细的讨论

分析

在以前的情况下, Firefox 消耗了大约80%的RAM。

Firefox_RAM

但是,根据this discussion,有些用户认为使用的内存越多越好,因为这意味着您不会浪费RAM。 Firefox使用RAM来提高其处理速度,因为应用程序数据在RAM中的传输速度更快。


解决方案

您可以执行以下一个或所有常规/特定步骤:

  • 升级到当前水平Version 3.141.59
  • GeckoDriver 升级到GeckoDriver v0.24.0级。
  • Firefox 版本升级到 Firefox v65.0.2 级别。
  • 通过您的 IDE
  • 清理您的项目工作区重建您的项目,并且仅具有必需的依赖项。
  • 如果您的基本 Web客户端版本太旧,则将其卸载并安装最新版本的 Web客户端 GA。
  • 某些扩展程序使您可以阻止此类不必要的内容,例如:

    • 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') 
      
  • 如果您的 Tests 不需要 CSS ,则可以在this discussion之后禁用 CSS 。< / p>

答案 4 :(得分:0)

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

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)后,RAM的使用一直在增加,我的机器被卡住了。添加这些标志后,内存使用量未超过50MB。正如 DebanjanB 的回答一样,如果您运行for loopwhile loop尝试在每次执行后使睡眠几秒钟,它将给您一些时间来杀死未使用的线程。