我在Firefox上使用硒来自动执行Instagram上的某些任务。它基本上在用户个人资料和通知页面之间来回移动,并根据发现的内容执行任务。
它具有一个无限循环,可确保任务继续进行。我每隔几步就有一次sleep()函数,但是内存使用量一直在增加。我在Python中有这样的东西:
while(True):
expected_conditions()
...doTask()
driver.back()
expected_conditions()
...doAnotherTask()
driver.forward()
expected_conditions()
我从不关闭驱动程序,因为这会减慢程序的速度,因为它要处理的查询很多。有什么方法可以避免在不关闭或退出驱动程序的情况下增加内存使用量的时间?
编辑:添加了明确的条件,但没有帮助。我正在使用Firefox的无头模式。
答案 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)
答案 3 :(得分:1)
从 Selenium 开始,对 Firefox 使用的 RAM 的数量几乎没有控制。正如您提到的 Browser Client ,即 Mozilla 在 Instagram 上的用户个人资料和通知页面之间来回移动,并根据发现的内容执行任务作为单个用例太宽。因此,首要任务是将与您的用例有关的无限循环分解为较小的 Tests 。
生动地引出time.sleep()
掩盖了潜在的问题。但是,在使用 time.sleep(secs)
使用 Selenium 和 WebDriver 进行自动化时,没有任何特定条件实现 违反了自动化 的目的,应不惜一切代价避免这样做。根据文档:
time.sleep(secs)
在给定的秒数内暂停当前线程的执行。该参数可以是浮点数,以指示更精确的睡眠时间。实际的暂停时间可能少于请求的暂停时间,因为任何捕获到的信号都会在执行该信号的捕获例程后终止sleep()。另外,由于系统中其他活动的安排,暂停时间可能比请求的时间长任意数量。
您可以在How to sleep webdriver in python for milliseconds
中找到详细的讨论在以前的情况下, Firefox 消耗了大约80%的RAM。
但是,根据this discussion,有些用户认为使用的内存越多越好,因为这意味着您不会浪费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')
如果您的 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 loop
或while loop
尝试在每次执行后使睡眠几秒钟,它将给您一些时间来杀死未使用的线程。