Я пытаюсь, чтобы Selenium сделал скриншот текущей страницы в веб-драйвере.Я также хотел бы установить размеры браузера до того, как это произойдет, чтобы на скриншоте можно было получить изображение определенного размера.
Я использую это для изменения размера окна:
webDrv.Manage().Window.Size = new Size(w, h);
Вот снимок экрана:
Screenshot ss = ((ITakesScreenshot)webDrv).GetScreenshot();
ss.SaveAsFile(Path.Combine(m_path, m_filename), ScreenshotImageFormat.Png);
Проблема в том, что на некоторых страницах снимок экрана будет сделан до того, как браузер закончит перерисовку страницы.
Я не могу использовать обычные методыпроверки (например, с помощью JS для получения document.readyState), поскольку страница уже загружена в этот момент, поэтому любые проверки, подобные этой, возвращают true.
Это проблема только на страницах, которые используют Javascript для изменения размераэлементы в зависимости от размера окна.Страницы, использующие CSS, не имеют этой проблемы.
Я могу обойти это, взяв весь элемент HTML Body до и сравнив его с после завершения изменения размера:
webDrv.Manage().Window.Size = new Size(w, h);
int oldBodyHash = webDrv.FindElement(By.TagName("body")).Text.GetHashCode(); //get a hash of the current html body
DateTime nextthink = DateTime.Now.AddSeconds(10); //hard time out incase there is no javascript resizing
while (webDrv.FindElement(By.TagName("body")).Text.GetHashCode() == oldBodyHash && DateTime.Now < nextthink) //wait until hash changes or timeout occurs
{
Thread.Sleep(500);
}
Screenshot ss = ((ITakesScreenshot)webDrv).GetScreenshot();
ss.SaveAsFile(Path.Combine(m_path, m_filename), ScreenshotImageFormat.Png);
Нозатем на страницах, использующих CSS для управления изменяющимися элементами, в теле HTML изменений нет.
Кажется, что это одно или другое, но невозможно охватить обе возможности?