我一直无法找到有同样问题的其他人,而且非常令人沮丧。基本上,无论出于何种原因,Coded UI都会在不同的区域看到一个控件,然后在实际的位置。像这样:Bounding Rectangle for Label with "IDLE" in it is up and to the left of the control
正如您在图片中看到的那样,由于某种原因,边界矩形位于所选标签的左侧,其中包含“IDLE”字样。这是我第一次看到这个问题,经过50次googles搜索后,我决定来这里。
首先,我使用带有Windows窗体应用程序的Coded UI(我不知道这是否有所不同),它似乎与所有Windows窗体应用程序做同样的事情,它已经适用于我的所有WPF应用程序。
其次,无论我在应用程序中的某个按钮上记录了多少次,或者某种类型的东西,运行记录的方法总是会点击按钮(因为它认为按钮位于控件的左侧和左侧) )。向上和向左似乎是唯一一致的事情,根据应用程序在屏幕上的位置,向上和向左的数量会有所不同。
如果有人有任何想法或其他什么我可以尝试请帮助,我不知道发生了什么。如果您需要更多信息,请随时询问。谢谢
编辑代码示例:
public class Controller : WinWindow
{
#region Constructors
public Controller()
{
SearchProperties[PropertyNames.Name] = "My Sample C#";
SearchProperties.Add(new PropertyExpression(PropertyNames.ClassName, "WindowsForms10.Window", PropertyExpressionOperator.Contains));
WindowTitles.Add("My Sample C#");
enableWindow = new EnableWindow(this);
}
#endregion
public WinEdit CommunicationSetup
{
get
{
if(communicationSetup == null)
{
communicationSetup = new WinEdit(this);
communicationSetup.SearchProperties[PropertyNames.ControlName] = "Communication";
communicationSetup.WindowTitles.Add("My Sample C#");
}
return communicationSetup;
}
}
private WinEdit communicationSetup;
}
额外编辑:点击我用过的东西:
Mouse.Click(new Point(obj.BoundingRectangle.Location.X + 20, obj.BoundingRectangle.Location.Y + 10));
还有这个:
Mouse.Click(obj);
两者都点击向上和控件的左侧,正如预期的那样,因为BoundingRectangle显示在图片中
编辑:用“左”代替“右”,因为我显然是个白痴,不知道我的方向大声笑
编辑:这里有一些图片显示我的应用程序上的按钮启用DrawHighlight(),对不起,我出于公司政策原因需要提取大量信息,这可能会让一些事情变得有点困难但是我不得不
我还移动了应用程序,以便您可以看到DrawHighlight()在移动应用程序时有多大区别
你试图传递给obj
方法的Click()
变量中存储的是什么?
可能会出现此问题,因为您没有足够的唯一属性,可能肯定会描述控件。尝试添加额外的SearchProperties
。最有价值的是Control ID
或Automation ID
。如果您无法在所需控件上获取此属性,请让开发团队添加它。
还尝试调试方法。调查是在对照的BoundingRectangle
财产中返回的。试试DrawHighlight()
方法。它将用蓝色矩形标记控件的位置。另一种选择是使用TryGetClickablePoint()
方法。也许你的控制尺寸比你在视觉上获得的尺寸要大。最后但同样重要的是:从UIMap Editor
及其整个层次结构中检查您的控件。您可能会发现您正在寻找的控件被严重记录。
如果没有任何帮助,请提供更多信息和调查结果。
祝一切顺利。
亚历克斯
由于@Loathing对我的问题的评论,我想出了解决问题的一致方法。这是我解决它的方式:
var ret=new Rectangle();
GetWindowRect(obj.WindowHandle, ref ret);
Mouse.Hover(new Point(ret.X, ret.Y));
我仍然不确定为什么会这样,所以如果有人看到这个并理解随意评论和解释,我对GetWindowRect的情况有点模糊。
我最近在尝试调试IE和Chrome之间的跨浏览器测试时遇到了一些有趣的结果,这些测试同样模仿了您所报告的内容。事实证明,CodedUI和IE似乎对显示缩放敏感。我正在使用具有不同分辨率的多显示器设置并更改每个缩放,大多使用125%。控件的顶部和左侧坐标总是在IE中关闭,我无法弄清楚原因。在做了一些数学并除以125%之后,确定该数字与它应该报告的坐标相匹配。如果我试图在不重新启动窗口的情况下更改监视器缩放,问题会变得更糟,我也会错过点击次数。我想你的GetWindowRect解决方案也是DPI敏感的,并且考虑到缩放报告正确的坐标。
链接到微软页面,松散地讨论这个:Understanding Screen Scaling Issues
我总是得到这个,我设法解决它的唯一方法是重新启动Windows(再次使用整个操作系统的重新启动计算另一个MS解决方案)。无论如何,在我的情况下,它可能工作正常,但后来我会从笔记本电脑RD到我的桌面,一切都会解决这个问题。我不得不在直接使用PC时重新启动,并在使用RD会话时重新启动。
我也经常遇到这个问题。在我的情况下,只要我的代码试图下载文件,浏览器就会弹出底部的小下载栏。从那时起,我所有的位置矩形都将偏离该条的高度。
我的猜测是,微软的CodedUI中的一个错误是,当它正在测试的窗口在某些情况下改变大小时,它无法自行重置。我在CodedUI中发现了很多错误,我真的希望有一天他们能让它更稳定。
到目前为止我的问题的解决方法是关闭我用来运行测试并重新启动它的Internet Explorer窗口。 CodedUI甚至无法做到这一点,所以我出去杀死所有iexplorer.exe进程然后重新启动浏览器。