【问题标题】:How to wait for each page before taking screenshot?如何在截屏前等待每一页?
【发布时间】: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


【解决方案1】:

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

browser.refresh()

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

【讨论】:

  • 这在某些情况下会起作用;例如,不需要您每次都登录的简单网页。在其他情况下,假设您在文本框控件中输入了一些文本,刷新页面会导致该信息丢失。当然,也有一些方法可以解决这个问题(例如:在输入文本之前调整大小)。我希望找到一种适用于所有场合的统一方式。
  • 那么为什么不在输入信息之前调整大小和刷新;页面加载后?这对我来说似乎微不足道。或者,就像 JeffC 所说,在测试开始时设置最大的屏幕截图。我想我的主要问题是,为什么你需要在任何时候调整到更小的屏幕?不会将窗口调整为您需要的最大屏幕截图,以便您从较小的屏幕尺寸捕获您需要的所有信息?
  • 谢谢,是的,这行得通,只是因为这是给我的要求。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-25
    • 2021-12-21
    • 2019-08-27
    • 2020-12-21
    • 2020-02-02
    • 2020-06-11
    • 2018-05-28
    • 1970-01-01
    相关资源
    最近更新 更多