【发布时间】:2017-07-28 20:15:47
【问题描述】:
我正在使用 Selenium/C# 和 Chrome 来报废一个网站,我需要滚动浏览一个列表,并报废它的元素,现在当我继续滚动时,新元素会显示出来,因为有数千个元素一旦计数达到 50 个元素,我将删除旧的,我正在使用 Javascript(注入)来实现这一点。
while (elementsCount > 50)
{
ReadOnlyCollection<IWebElement> first = driver.FindElements(By.XPath("//div[@role='dialog']//ul/li[position() <= 10]//div[@class='_gzjax']/a")); // select the first 10 elements
foreach (var item in first)
elements.Add(item.Text); // keep the elements before deleting them
// delete the first 10 elements
js.ExecuteScript("for(count = 0; count < 10; count++){ " +
"var elem = document.getElementsByClassName('_cx1ua')[0]; " +
"elem.parentNode.removeChild(elem); }");
}
这很好用!
所以大多数时候,同时显示的元素不超过 60 个,现在我运行程序一段时间,报废的元素超过 10'000,Chrome 的内存增加,有时超过 2gb。
我什至尝试安装这个extension 来阻止图片下载(因为每个元素都附有图片)但仍然是同样的问题。
Chrome 是否在我不知情的情况下保存了某些内容?有什么办法可以删除它并保持当前页面的“状态”?
【问题讨论】:
-
您似乎一直在添加到
elements,然后再也没有从中删除。 -
@TitusLucretius 元素实际上只是一个本地列表,与 Chrome 无关
-
您能否发布您正在抓取的网站的 URL,并提供有关您要捕获的内容的更多信息?使用 JS 删除元素似乎是一种低效的方法。您是否尝试过手动进行此测试?使用脚本和手动使用的内存使用情况是否不同?
-
如果元素与 JavaScript 事件绑定,我认为删除元素将无济于事,因为它们将作为分离的 DOM 留在内存中。
-
@JeffC 感谢 cmets,我正在尝试捕获 Instagram 用户关注者的用户名!当你点击关注者的按钮时,会出现一个对话框,里面有一个用户列表,这就是我正在滚动的内容。
标签: c# google-chrome selenium selenium-chromedriver