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

C# 编码UI认为控件处于不同的位置,c#,winforms,coded-ui-tests,C#,Winforms,Coded Ui Tests,我还没有找到其他人有同样的问题,这是非常令人沮丧的。基本上,无论出于何种原因,编码的UI都会在不同的区域看到控件,而不是它实际所在的区域。这样地: 正如您在图片中看到的,由于某种原因,边界矩形位于所选标签的上方和左侧,其中包含单词“IDLE”。这是我第一次看到这个问题,在谷歌搜索了50次之后,我决定来这里 首先,我在Windows窗体应用程序中使用编码UI(我不知道这是否有区别),它似乎在所有Windows窗体应用程序中都做了相同的事情,它在我所有的WPF应用程序中都很好地工作 第二,无论我在

我还没有找到其他人有同样的问题,这是非常令人沮丧的。基本上,无论出于何种原因,编码的UI都会在不同的区域看到控件,而不是它实际所在的区域。这样地:

正如您在图片中看到的,由于某种原因,边界矩形位于所选标签的上方和左侧,其中包含单词“IDLE”。这是我第一次看到这个问题,在谷歌搜索了50次之后,我决定来这里

首先,我在Windows窗体应用程序中使用编码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);
两者都单击控件的向上和左侧,正如预期的那样,因为边框显示在那里,如图所示

编辑:用“左”代替“右”,因为我显然是个白痴,不知道自己的方向,哈哈

编辑:这里还有一些图片显示了我的应用程序上启用按钮的DrawHighlight(),很抱歉,由于公司政策的原因,我不得不拿出大量信息,这可能会使我有点难以看到所有事情的进展,但我不得不这样做

我还移动了应用程序,以便您可以看到DrawHighlight()在移动应用程序时有多大的不同


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

出现此问题的原因可能是您没有足够的唯一属性,这些属性可能明确描述控件。尝试添加其他
SearchProperties
。最有价值的是
控制ID
自动化ID
。如果无法在想要的控件上获得此属性,请要求开发团队添加它

还可以尝试调试该方法。在控件的
BoundingRectangle
属性中返回。尝试
DrawHighlight()
方法。它将用蓝色矩形标记控件的位置。另一个选项是使用
TryGetClickablePoint()
方法。也许你的控件的大小比你能看到的要大。最后但并非最不重要的一点:从
UIMap编辑器检查控件及其整个层次结构。您可能会发现您正在查找的控件被错误记录

如果没有任何帮助,那么提供更多的信息和调查结果

祝你好运


Alex

多亏了@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敏感,并且报告正确的坐标并考虑缩放

指向microsoft页面的链接,该页面大致讨论了以下内容:

我一直都明白这一点,解决这一问题的唯一办法是重新启动windows(想想另一个重新启动整个操作系统的MS解决方案)。无论如何,在我的情况下,它可以工作得很好,但后来我会从笔记本电脑进入我的桌面,所有的东西都会因为这个问题而发疯。直接使用PC时,我必须重新启动,从RD会话开始工作时,我必须重新启动。

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

我的猜测是,这是微软CodedUI中的一个缺陷,当它正在测试的窗口在某些情况下改变大小时,它无法重置自身。我在CodedUI中发现了很多bug,我真的希望有一天它们能让代码更加稳定


到目前为止,我的问题的解决方法是关闭我用来运行测试的InternetExplorer窗口并重新启动它。Codedu我甚至无法正确执行此操作,因此我出去并关闭所有iexplorer.exe进程,然后重新启动浏览器。

能否显示一些您尝试过的代码?我编辑了一个示例代码,但我认为代码是什么并不重要,它可以很好地找到控件。它只是知道它在屏幕上的确切位置,这似乎是一个不熟悉
编码UI
的问题,但我猜
BoundingRectangle
在客户端坐标中,这意味着返回的矩形是相对于控件的直接父对象的。矩形需要