使用Selenium拍摄相同的屏幕截图后,哈希文件有所不同

时间:2017-09-10 11:14:00

标签: c# selenium

我正在尝试使用Selenium了解自动化测试。我一个人工作,所以只有文档,谷歌和你们。

在VS-2105中使用Selenium,我将网站的屏幕截图保存为文件位置的图像,然后在此时停止调试。然后该文件成为预期的'结果。

然后我评论该线路,再次运行,拍摄屏幕截图但保存到其他位置。这些文件虽然大小相同,但具有不同的哈希值。

在我看来,他们是完全相同的。

我的方法有问题吗?

这是我创建我的' master'

的代码
import axios from 'axios';

// pushOnResolve would be something like () => push('mynew/url')
export function login(email, password, pushOnResolve) {
  const promise = axios.post('http://localhost:3114/api/users/authenticate';
  // it's possible to have several .then on a promise
  // so this shouldn't interfere with
  // the Redux-promise or the LOGIN_USER_FULFILLED reducer
  promise.then(pushOnResolve);

  return {
    type: 'LOGIN_USER',
    payload: promise, 
    {
      email,
      password,
    }),
  };
}

这是我用来比较的代码

        _webDriver.Navigate().GoToUrl(url);

        var accept = _webDriver.SwitchTo().Alert();
        accept.Accept();

        IWebElement menu = _webDriver.FindElement(By.Id("link"));

        menu.Click();
        System.Threading.Thread.Sleep(500);

        var screenshot = _webDriver.GetScreenshot();

        var fileName = "expandMenuInPlan.png";
        var origFile = _testImagesPersistentPath + fileName;
        screenshot.SaveAsFile(origFile, OpenQA.Selenium.ScreenshotImageFormat.Png);

GetBytes方法

        _webDriver.Navigate().GoToUrl(url);

        var accept = _webDriver.SwitchTo().Alert();
        accept.Accept();

        IWebElement menu = _webDriver.FindElement(By.Id("link"));

        menu.Click();
        System.Threading.Thread.Sleep(500);

        var screenshot = _webDriver.GetScreenshot();

        var fileName = "expandMenuInPlan.png";
        var origFile = _testImagesPersistentPath + fileName;
        //screenshot.SaveAsFile(origFile, OpenQA.Selenium.ScreenshotImageFormat.Png); COMMENTED OUT

//The above is identical

        var newFile = _testImagesTempForTestRunPath + fileName;
        screenshot.SaveAsFile(newFile, OpenQA.Selenium.ScreenshotImageFormat.Png);

        string hashOrig = GetBytes(origFile);
        string hashNew = GetBytes(newFile);

        if (hashOrig != hashNew)
        {
            SaveFailedImage(origFile, newFile, fileName);
        }

以这种方式使用屏幕截图是不可靠还是我的代码有问题?

1 个答案:

答案 0 :(得分:0)

散列图像文件并进行比较绝不是正确的方法。即使单个像素关闭也会改变散列。所以你不想让你的测试变得脆弱

您可以使用C#方法ImageComparer.Compare Method (Image, Image, ColorDifference, Image)

https://msdn.microsoft.com/en-in/library/hh191601.aspx?f=255&MSPPError=-2147217396

或者你可以使用像https://applitools.com/这样的外部工具,它们可以比较聪明的图像

PS:我与applitools没有关联,这只是一个例子,也可能有其他服务。