2017-02-20 31 views
2

Я использую Selenium с хромированной решеткой, чтобы сделать довольно простой экранный скребок, но поскольку я петлю и жду элементов, а затем нажимаю ссылки - процесс становится настолько медленным это непригодно. Если я удалю экземпляр хромодровера и новый экземпляр другого, все снова начнется быстро.Selenium ChromeDriver постепенно уменьшается медленнее в течение короткого периода времени

Почему это происходит так быстро? Что я могу сделать, чтобы ускорить это?

Псевдо C# код:

while(true) 
{ 
    var dataGridRows = browser.Driver.FindElements(By.XPath(".//*[@class='datadrid-row']")); 

    foreach (var dataGridRow in dataGridRows) 
    { 
     OpenQA.Selenium.Interactions.Actions act = new OpenQA.Selenium.Interactions.Actions(browser.Driver); 

     //Double click on the grid row. A new dialog (CSS style) will show up. 
     act.DoubleClick(dataGridRow).Build().Perform(); 

     // This first time I double click the grid row, the dialog pops up within a few miliseconds. 
     // This gets incrementally slower, about 10 iterations later the popup will take several MINUTES to show up after the double-click. 

     //This line waits for a "close dialog" button to appear. This is where the delay occurs but this returns as soon as the dialog actually appears. 
     ReadOnlyCollection<IWebElement> closeButtons = browser.Driver.FindElements(By.XPath(".//*[@class='dilog-close-button']")); 

     CollectScreenScrapeInformation(...); 
    } 

    Sleep(1000 * 60); 
} 
+0

Линия 'closeButtons' не ждет ничего. Он просто царапает страницу для кнопки закрытия диалогового окна XPath. Я предполагаю, что вы устанавливаете неявное ожидание где-то, что вызывает проблему. Кроме того, вы смешиваете неявные и явные ожидания? Документы говорят, что не делайте этого, потому что это может вызвать непредсказуемое время ожидания. – JeffC

+0

Вы пробовали этот сценарий вручную? Возможно, это сайт. Вы пробовали FF или другой драйвер браузера? Это ведет себя по-другому? – JeffC

ответ

1

Драйвер сам не ест память, это браузер. Да, создание нового экземпляра драйвера ускоряет работу, но это не новый экземпляр chromedriver.exe, который ускоряет его, это свежий экземпляр chrome.exe. Если вы выполняете свои проблемные сценарии вручную (попробуйте нажать и оскорбить свою страницу в течение 10 минут и посмотреть, что произойдет), вы найдете те же проблемы, браузеры будут замедляться. Но я должен признать, что по моему опыту хром - самый быстрый и эффективный драйвер, firefoxdriver имеет больше проблем с памятью, когда один и тот же экземпляр используется много, а IEdriver невозможно использовать, если у вас есть только один экземпляр в течение более длительного времени (Multiple tests on the same IEdriver instance - memory issues). Даже у phantomJS/ghostdriver есть такие проблемы.

tldr; Восстановите экземпляр вашего драйвера, если со временем он станет медленнее.