我正在尝试让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主体没有变化。
似乎是一个或另一个,但不可能同时涵盖这两种可能性吗?
答案 0 :(得分:0)
我对JeffC有同样的疑问,但是要直接解决您的问题,请尝试添加
browser.refresh()
在调整窗口大小和截图之间。
答案 1 :(得分:0)
看来,除了更改我们执行操作的顺序之外,没有其他实际解决方案;本质上,解决方案是提前更改浏览器尺寸,以确保在截屏之前完成JS调整大小活动。