【发布时间】:2019-02-25 17:08:39
【问题描述】:
我正在尝试让 Selenium 在 webdriver 中截取当前页面的屏幕截图。我还想在此之前设置浏览器的尺寸,以便屏幕截图可以捕获特定尺寸的图像。
我用它来改变窗口大小:
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 正文没有变化。
似乎是其中之一,但不可能涵盖两种可能性?
【问题讨论】:
-
是否有某些原因您没有在测试开始时设置浏览器大小?是否需要即时调整大小?
-
你是对的,这绝对是一个选择。在大多数情况下这很好,但有时我想多次调整窗口大小以获得不同大小的屏幕截图。
-
为什么不直接截取您可能需要的最大屏幕截图?为什么您需要多个不同大小的屏幕截图来处理相同的错误等?
-
我同意 JeffC 的观点,我想不出在测试之前简单地设置大屏幕尺寸并不能解决问题的用例。
-
谢谢,是的,完全正确。这看起来是一个必须通过更改设计来避免的问题。
标签: c# selenium selenium-webdriver selenium-chromedriver