如何在截图之前等待每个页面?

时间:2019-02-25 17:08:40

标签: c# selenium selenium-webdriver selenium-chromedriver

我正在尝试让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主体没有变化。

似乎是一个或另一个,但不可能同时涵盖这两种可能性吗?

2 个答案:

答案 0 :(得分:0)

我对JeffC有同样的疑问,但是要直接解决您的问题,请尝试添加

browser.refresh()

在调整窗口大小和截图之间。

答案 1 :(得分:0)

看来,除了更改我们执行操作的顺序之外,没有其他实际解决方案;本质上,解决方案是提前更改浏览器尺寸,以确保在截屏之前完成JS调整大小活动。