硒和硒Chrome使用了太多内存

时间:2017-07-28 20:15:48

标签: c# google-chrome selenium selenium-chromedriver

我使用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是否会存储?有没有办法删除它并保持当前页面的状态&#34;?

1 个答案:

答案 0 :(得分:0)

Selenium会给网络抓取器带来很多开销,因为它会依赖浏览器的内存开销来呈现内容并将其显示给你的selenium驱动程序,无论你是否看到窗口。

您可以通过几种方法解决此问题。

选项1

我建议在http://html-agility-pack.net/?z=codeplex使用HtmlAgiltyPack 使用此敏捷包,您可以解析节点并获取更多数据并相应地存储/操作。

在下面我的网络蜘蛛的示例中,我使用MongoDB C#驱动程序来传递数据,但是你看到HtmlDocument是否是HtmlAgility Pack的一部分

    BsonArray IPageCrawler.CrawlForTags(Uri url, HtmlDocument doc)
    {
        var bsonTagArray = new BsonArray();
        if (doc.DocumentNode.SelectNodes("//*[self::h1 or self::h2 or self::h3]") == null)
        {
            return null;
        }
        foreach (var tag in doc.DocumentNode.SelectNodes("//*[self::h1 or self::h2 or self::h3]"))
        {
            if (tag.InnerHtml.Contains("href"))
            {
                var innerText = _contentHandler.CleanupString(tag.InnerText);
                bsonTagArray.Add(new BsonDocument(new BsonElement(tag.Name, innerText)));
            }
            else
            {
                var tagAtt = _contentHandler.CleanupString(tag.WriteContentTo());
                bsonTagArray.Add(new BsonDocument(new BsonElement(tag.Name, tagAtt)));
            }
        }
        return bsonTagArray;
   }

上面的代码将抓取页面中的所有超链接。我还有其他方法可以从任何页面中获取所有内容,到目前为止,即使在4Gb页面上也没有崩溃(因为下载的zip文件等)

选项2

您可以继续使用selenium并尝试使用selenium或其他第三方工具提供的无头浏览器支持来执行代码。 http://toolsqa.com/selenium-webdriver/headless-browser-testing-selenium-webdriver/

我相信PhantomJS是一种使用无头浏览器的好方法,它可以减少内存消耗http://phantomjs.org/