在Coded UI测试中测试标签可见性?

时间:2014-01-07 13:39:02

标签: c# visual-studio-2010 coded-ui-tests

我正在为我的项目编写一个编码的ui测试,我想测试一个标签是否可见。

但是,自动生成的代码使用WinText,它不包含任何可见性选项。

有没有办法检查WinText后面的ui元素的可见性或获取实际标签?

4 个答案:

答案 0 :(得分:2)

最简单,最直接的方法是调用WinText的TryGetClickablePoint。如果它返回false,则表示控件不可见,屏幕外或被其他控件阻止。

Point p = new Point();
bool isVisible = UIMap.UIForm1Window.UILabel1Window.UILabel1Text.TryGetClickablePoint(out p);

如果你想摆弄“WinText背后的ui元素”那么你必须得到它的原生元素并将其转换为适当的类(如果是winform则为IAccessible)并从那里获得可见性状态。小心:你可能必须得到标签的窗口的原生元素,而不是标签的。

IAccessible acc = (UIMap.UIForm1Window.UILabel1Window.NativeElement as object[])[id] as IAccessible; //id is most probably 0, check with AccExplorer
bool isVisible = (((AccessibleStates)acc.accState & AccessibleStates.Invisible) == 0) && (((AccessibleStates)acc.accState & AccessibleStates.Offscreen) == 0);

答案 1 :(得分:1)

我正在为UITestControl类使用以下扩展方法,到目前为止它已经非常防弹:

using Microsoft.VisualStudio.TestTools.UITesting;

namespace CodedUIExtensions
{
    public static class UITestControlExtensions
    {
        public static bool IsElementVisible(this UITestControl control)
        {
            // Assume the control is invisible
            bool visible = false;
            System.Drawing.Point p;

            try
            {
                // If the control is offscreen, bring it into the viewport
                control.EnsureClickable();

                // Now check the coordinates of the clickable point
                visible = control.TryGetClickablePoint(out p)
                    && (p.X > 0 || p.Y > 0);
            }
            catch (Exception ex)
            {
                // Boom goes the dynamite! Control is not visible.
                // Log to stdout for debugging.
                Console.WriteLine(ex);
            }

            return visible;
        }
    }
}

我的要求是:

  1. 确保控件位于视口内,以便控件可见,但屏幕外不会触发误报
  2. 然后断言控件可见
  3. 不要抛出异常
  4. 如果发生异常,请执行某些操作以进行调试
  5. 使用它:

    using CodedUIExtensions;
    
    [CodedUITest]
    class MyTest
    {
        [TestMethod]
        public void SomeVisibilityTest()
        {
            UITestControl control = // ...
            HtmlDiv div = // ...
    
            Assert.IsTrue(control.IsElementVisible(), "Not visible");
            Asset.IsFalse(div.IsElementVisible(), "Visible");
        }
    }
    

    只要Coded UI控件类继承自UITestControl并且您的C#文件中有using CodedUIExtensions,每个控件都将使用IsElementVisible()方法。这适用于网页以及GUI应用程序,例如WinForms。

答案 2 :(得分:0)

你可以试试这个:

Control.WaitForControlPropertyNotEqual(UITestControl.PropertyNames.State, ControlStates.Invisible);

答案 3 :(得分:0)

这个适用于我(以及使用 .TryGetClickablePoint()的方法):

while (myControl.State != ControlStates.Offscreen) { }
相关问题