![](/img/trans.png)
[英]Selenium loop script using too much ram, eventually crashing Chrome
[英]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 的无头模式。
首先, Selenium对Firefox使用的RAM量几乎没有控制。 正如您所提到的,浏览器客户端即Mozilla在Instagram 上的用户配置文件和通知页面之间来回切换,并根据它发现的作为单一用例的范围过于广泛的内容来执行任务。 因此,首要任务是将与您的用例相关的无限循环分解为较小的Tests 。
引入time.sleep()
实际上掩盖了潜在的问题。 然而,在使用Selenium和WebDriver通过自动化框架执行测试时,在没有任何特定条件的情况下使用time.sleep()
破坏自动化的目的,应该不惜一切代价避免。 根据文档:
time.sleep(secs)在给定的秒数内暂停当前线程的执行。 参数可能是一个浮点数,以指示更精确的睡眠时间。 实际的暂停时间可能比请求的少,因为任何捕获的信号都会在执行该信号的捕获例程后终止 sleep()。 此外,由于系统中其他活动的调度,暂停时间可能比任意数量的请求长。
您可以在How to sleep webdriver in python for milliseconds 中找到详细讨论
之前有过Firefox消耗大约 80% 内存的情况。
但是,根据此讨论,一些用户认为使用的内存越多越好,因为这意味着您不会浪费 RAM。 Firefox 使用 RAM 使其进程更快,因为应用程序数据在 RAM 中的传输速度要快得多。
您可以执行以下任一/所有通用/特定步骤:
一些扩展允许您阻止此类不必要的内容,例如:
要打开带有扩展的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 loop
或while loop
尝试在每次执行后休眠几秒钟,它将花一些时间杀死未使用的线程。
创建新的 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.