我在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上的用户配置文件和通知页面之间来回切换,并根据它发现的任务执行的任务过于宽泛而不是单个用例。因此,首要任务是将与您的用例相关的无限循环拆分为较小的测试。
诱导time.sleep()
在根本上解决了根本问题。然而,使用Selenium和WebDriver进行自动化使用time.sleep(secs)
而没有任何特定条件来实现自动化的目的,应该不惜一切代价避免。根据文件:
time.sleep(secs)
暂停执行当前线程达到给定的秒数。参数可以是浮点数,以指示更精确的睡眠时间。实际的暂停时间可能小于请求的时间,因为任何捕获的信号将在执行该信号的捕获例程后终止sleep()。此外,由于系统中的其他活动的安排,暂停时间可能比任意量请求的时间长。
你可以在How to sleep webdriver in python for milliseconds找到详细的讨论
之前的情况是Firefox消耗了大约80%的RAM。
然而,根据this discussion,一些用户认为使用的内存越多越好,因为这意味着你没有浪费RAM。 Firefox使用RAM使其进程更快,因为应用程序数据在RAM中传输速度更快。
您可以实现以下任一/所有通用/特定步骤:
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')
创建新的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);
如果您打算以这种方式实施,请与社区分享执行绩效。