Coded UI录制会话中,鼠标点击后捕获图像的最优方案是什么?
最优实现方案:Coded UI点击后精准捕获图像的正确姿势
你遇到的问题其实是Coded UI自动化里很常见的两个坑:一是误改了自动生成的UIMap.Designer.cs文件(这个文件每次录制或更新控件都会被覆盖,代码白写),二是点击后立刻截图,没等页面加载/渲染完成,自然抓不到预期内容。下面给你一套完整的最优实现方案:
1. 把自定义代码移到安全的地方:UIMap.cs
UIMap.cs是专门用来放咱们自己写的代码的,不会被工具自动覆盖。所有点击+截图的逻辑都要放在这里,别碰Designer文件。
2. 核心:点击后必须等页面稳定再截图
点击操作后,页面跳转、元素渲染都需要时间,直接截图只会抓到“半加载”的状态。我们可以通过等待目标页面的标志性控件出现来判断页面是否加载完成,这是最可靠的方式。
3. 完整可运行的代码示例
using Microsoft.VisualStudio.TestTools.UITesting; using Microsoft.VisualStudio.TestTools.UITesting.HtmlControls; using System; using System.Drawing; using System.IO; namespace YourTestProjectNamespace { public partial class UIMap { // 自定义方法:点击OutagesandSafety链接+等待页面加载+截图 public void ClickOutagesAndSafetyAndCaptureScreenshot() { // 调用Designer里自动生成的点击方法(不用自己写点击逻辑,复用录制的代码) this.UIMSOHomePage.UIMSOHomePageDocument.UIOutagesandSafetyHyperlink.Click(); // 等待目标页面的标志性控件加载完成(这里替换成你目标页面独有的控件,比如页面标题栏) HtmlControl targetPageFlag = new HtmlControl(this.UIMSOHomePage); targetPageFlag.SearchProperties.Add(HtmlControl.PropertyNames.Id, "TargetPageUniqueHeader"); // 最多等10秒,超时就抛出异常提醒 if (!targetPageFlag.WaitForControlExist(10000)) { throw new Exception("目标页面加载超时,未找到标志性控件"); } // 额外等500毫秒,确保页面渲染完全(可选,根据你的页面性能调整) Playback.Wait(500); // 捕获图像:可以选整个桌面,或者只捕获目标页面控件(更精准) // 方案1:捕获整个桌面 Image fullScreenshot = UITestControl.Desktop.CaptureImage(); // 方案2:只捕获目标页面(推荐,减少无效内容) // Image pageScreenshot = this.UIMSOHomePage.CaptureImage(); // 保存截图:先确保路径存在,避免报错 string screenshotFolder = @"C:\Automation\TestAutomation\web\Recordings\FullSite1\Screenshots\MSO\"; if (!Directory.Exists(screenshotFolder)) { Directory.CreateDirectory(screenshotFolder); } string fileName = $"HomePage_{DateTime.Now.ToString("ddMMyyyyHHmmss")}.png"; fullScreenshot.Save(Path.Combine(screenshotFolder, fileName)); } } }
4. 在测试用例里调用这个方法
在你的测试方法中,直接调用咱们写的自定义方法就行,不用再去调用Designer里的原始点击方法:
[TestMethod] public void TestHomePageNavigationAndScreenshot() { UIMap testMap = new UIMap(); testMap.ClickOutagesAndSafetyAndCaptureScreenshot(); }
几个额外的优化小技巧
- 别硬编码路径:把截图文件夹路径放到配置文件里,后续修改更方便。
- 精准截图:优先捕获目标页面的控件(比如
this.UIMSOHomePage.CaptureImage()),而不是整个桌面,减少无关内容。 - 加异常处理:在截图和保存的代码块外面套个
try-catch,避免因为权限不足、磁盘满等问题导致测试直接崩溃。
内容的提问来源于stack exchange,提问作者Sohel
相关产品推荐
相关产品推荐

