我正在编写一个perl
在 Windows 平台上使用的软件测试框架,它通过调用被测软件来运行测试用例。如果测试用例失败,框架将捕获屏幕,以便我们获得有关失败的更多信息。
一开始我用了一个小程序,叫做boxcutter-fs.exe
. 所以我只需要在测试用例失败时调用这个程序:
system("boxcutter-fs.exe screenshot.png");
print "Failed: $?" if ($?);
当框架处理正常故障时,它工作得很好,并给了我正确的故障截图。但是我注意到当软件崩溃时(活动窗口会出现一个错误消息框,并且被测软件会在超时后被杀死),boxcutter-fs.exe
并以代码1退出,并且没有得到任何截图。
然后我转向其他解决方案。我尝试的第一个选择是Win32::GuiTest
:
eval {
SendKeys('{PRTSCR}');
my $screen = Win32::Clipboard::GetBitmap() or die "No image captured: $!\n";
open BITMAP, "> screenshot.bmp" or die "Couldn't open bitmap file: $!\n";
binmode BITMAP;
print BITMAP $screen;
close BITMAP;
};
print "$@" if ($@);
同样的结果。除非发生软件崩溃情况,否则这很有效。该程序报告No image captured
了所以我认为Win32::Clipboard::GetBitmap
剪贴板中没有任何内容。
最后的解决方案是Imager::Screenshot
:
eval {
my $img = screenshot(hwnd => 'active');
$img->write(file => 'screenshot.bmp', type => 'bmp' )
or die "Failed: ", $img->{ERRSTR} , "\n";
};
print "$@" if ($@);
这次它在软件崩溃案例发生时给出了黑屏截图(全黑图像)。还是不行。
然后我发现当出现崩溃和错误消息框时,但软件还没有被杀死所以测试框架仍然挂起,使用上面任何解决方案的小脚本都可以捕获屏幕截图。似乎他们只是在被测软件被杀死的那一刻失败了。
由于这 3 种方法都使用 Win32 API 来获取屏幕截图,我想知道它们是否会因为同样的问题而失败?有什么提示吗?