编码 UI 认为控件处于不同的位置

Coded UI thinks control is in a different position

我没能找到有同样问题的其他人,这非常令人沮丧。基本上,无论出于何种原因,Coded UI 都在与实际位置不同的区域中看到控件。像这样: Bounding Rectangle for Label with "IDLE" in it is up and to the left of the control

正如您在图片中看到的那样,出于某种原因,边界矩形位于所选标签的左上方,其中包含单词 "IDLE"。这是我第一次看到这个问题,在进行了大约 50 次谷歌搜索后,我决定来这里。

首先,我将 Coded UI 与 Windows 表单应用程序一起使用(我不知道这是否会有所不同),它似乎对所有 Windows Forms 应用程序,它对我所有的 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 显示在那里,如图所示

编辑:将 "right" 替换为 "left" 因为我显然是个白痴而且不知道我的方向 lol

编辑:这里有更多图片显示我的应用程序上启用按钮的 DrawHighlight(),抱歉,出于公司政策原因,我必须删除大量信息,这可能会让我很难看清所有内容正在进行,但我必须

我还移动了应用程序,因此您可以看到移动应用程序时 DrawHighlight() 有多大差异

Application dragged further down and to the right

您尝试传递给 Click() 方法的 obj 变量中存储了什么?

这个问题可能是因为你没有足够的唯一属性,谁能确定地描述控件。尝试添加额外的 SearchProperties。最有价值的是 Control IDAutomation 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% 之后,果然这个数字与它应该报告的坐标相匹配。如果我试图在不重新启动 windows 的情况下更改显示器缩放比例,问题会变得更糟,我也会错过点击。我想您的 GetWindowRect 解决方案似乎也对 DPI 敏感,并报告正确的坐标并考虑缩放。

Link 到对此进行松散讨论的 Microsoft 页面: Understanding Screen Scaling Issues

我一直遇到这个问题,我设法解决它的唯一方法是重新启动 windows(想想另一个 MS 解决方案,重新启动整个 OS)。无论如何,在我的情况下,它可能工作正常,但后来我会从笔记本电脑 RD 进入我的桌面,一切都会因这个问题而变得疯狂。直接使用 PC 时我不得不重新启动,而在 RD 会话中工作时我不得不重新启动。

我也经常遇到这个问题。在我的例子中,每当我的代码尝试下载文件时,浏览器都会弹出底部的小下载栏。从那时起,我所有的位置矩形都会偏离该条的高度。

我的猜测是,它是 Microsoft CodedUI 中的一个错误,当它正在测试的 window 在某些情况下更改大小时,它无法自行重置。我在 CodedUI 中发现了很多错误,我真的希望有一天他们能使它更稳定。

到目前为止,我的问题的解决方法是关闭我用来 运行 测试的 Internet Explorer window 并重新启动它。 CodedUI 甚至无法做到这一点,所以我出去杀死所有 iexplorer.exe 进程,然后重新启动浏览器。