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

本文关键字:于不同 位置 控件 UI 编码 | 更新日期: 2023-09-27 18:21:48

我还没能找到其他有同样问题的人,这非常令人沮丧。基本上,无论出于何种原因,Coded UI看到的控件所在的区域与实际所在的区域不同带有"IDLE"的标签的边界矩形在控制的左侧

正如你在图片中看到的,由于某种原因,边界矩形在所选标签的左侧,其中有单词"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);

向上和向左点击控件,正如预期的那样,因为BoundingRectangle显示在那里,如图片所示

编辑:用"左"代替"右",因为我显然是个白痴,不知道我的方向lol

编辑:这是更多的图片,显示了我的应用程序上启用按钮的DrawHighlight(),很抱歉,由于公司政策的原因,我不得不删除大量信息,这可能会让我有点难以了解一切,但我必须

我还移动了应用程序,这样你就可以看到当应用程序移动时DrawHighlight()有多大的不同

应用程序进一步向下拖动并向右拖动

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

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

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

同时尝试调试该方法。的Investigation在控件的BoundingRectangle属性中返回。试用DrawHighlight()方法。它将用一个蓝色矩形标记控件的位置。另一种选择是使用TryGetClickablePoint()方法。也许你的控件的大小比你能看到的要大。最后但同样重要的是:从UIMap Editor及其整个层次结构检查您的控件。您可能会发现您正在查找的控件记录不好。

如果没有任何帮助,请提供更多信息和调查结果。

祝你好运。

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%,可以肯定的是,这个数字与它应该报告的坐标相匹配。如果我试图在不重新启动窗口的情况下更改显示器的缩放比例,问题会变得更糟,我也会错过点击。我想您的GetWindowRect解决方案似乎也对DPI敏感,并在考虑缩放的情况下报告正确的坐标。

链接到微软页面,大致讨论了这一点:了解屏幕缩放问题

我一直都会遇到这种情况,我唯一能解决的方法就是重新启动窗口(通过重新启动整个操作系统来寻找另一个MS解决方案)。无论如何,在我的情况下,它可能工作得很好,但后来我会从笔记本电脑RD到我的桌面,这个问题会让一切都变得疯狂。当我直接使用PC工作时,我必须重新启动,当从RD会话工作时,必须重新启动。

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

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

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