C# 编码用户界面通过所有浏览器上的加载屏幕

C# 编码用户界面通过所有浏览器上的加载屏幕,c#,visual-studio,loading,coded-ui-tests,C#,Visual Studio,Loading,Coded Ui Tests,我正在Visual Studio 2015更新1上使用Microsoft编码的用户界面 我正在为网站构建编码的Ui测试,但在Chrome和Firefox上遇到了问题。该网站是。有一个分区包含以下信息: Chrome和Firefox呈现页面的速度非常快,以至于当样式为“display:table”时,它们可以看到加载覆盖。该加载覆盖几乎覆盖了站点的每个部分 我的问题是如何告诉Chrome和Firefox等待loadingOverlay显示none,以便它可以点击背景中的元素 我已经尝试过这个代码

我正在Visual Studio 2015更新1上使用Microsoft编码的用户界面

我正在为网站构建编码的Ui测试,但在Chrome和Firefox上遇到了问题。该网站是。有一个分区包含以下信息:

Chrome和Firefox呈现页面的速度非常快,以至于当样式为“display:table”时,它们可以看到加载覆盖。该加载覆盖几乎覆盖了站点的每个部分

我的问题是如何告诉Chrome和Firefox等待loadingOverlay显示none,以便它可以点击背景中的元素

我已经尝试过这个代码,但它一直说集合在1

public static HtmlDiv GetOverlay(UITestControl parent, string id)
    {
        var div = new HtmlDiv(parent);
        div.SearchProperties.Add(HtmlDiv.PropertyNames.Id, id);

        GetOverlayProperty(div);
        return div;
    }

    private static UITestControlCollection GetOverlayProperty(HtmlDiv overlay)
    {
        overlay.SearchProperties.Add(HtmlControl.PropertyNames.ControlDefinition, "display: table",
            PropertyExpressionOperator.Contains);

        UITestControlCollection collection = overlay.FindMatchingControls();

        if (collection.Any())
        {
            GetOverlay(browser, "loadingOverlay");
        }

        return collection;
    }
我的测试初始化

    [TestInitialize]
    public void ClassInitializer()
    {
        BrowserWindow.CurrentBrowser = ConfigurationManager.AppSettings.Get("Browser-Type");

        CodedUIUtils.browser = BrowserWindow.Launch(new Uri(ConfigurationManager.AppSettings.Get("Browser-Url")));

        CodedUIUtils.browser.CloseOnPlaybackCleanup = false;
        CodedUIUtils.browser.Maximized = false;
    }
我的登录测试

    [TestMethod]
    public void LoginAndLogout()
    {
        CodedUIUtils.ClickButton(CodedUIUtils.browser, "PassagewaysLogin");
        CodedUIUtils.LoginGuest(CodedUIUtils.browser);
        CodedUIUtils.ClickLogon(CodedUIUtils.browser, "Logon");

        HtmlDiv overlay = CodedUIUtils.GetOverlay(CodedUIUtils.browser, "loadingOverlay");
        overlay.WaitForControlNotExist();

        CodedUIUtils.ClickLink(CodedUIUtils.browser, "Log Out");
        Playback.Wait(2000);
    }
登录Utils

   public static class CodedUIUtils
   {
    public static BrowserWindow browser;

    public static void LoginGuest(BrowserWindow browser)
    {
        EnterText(browser, "Email", "onboardTestUserId+guest@gmail.com");
        EnterText(browser, "LoginPassword", "Testing2!");
    }

    public static void ClickButton(UITestControl parent, string id)
    {
        var button = new HtmlButton(parent);
        button.SearchProperties.Add(HtmlButton.PropertyNames.Id, id);

        Mouse.Click(button);
    }

    public static void EnterText(UITestControl parent, string id, string value)
    {
        var edit = new HtmlEdit(parent);
        edit.SearchProperties.Add(HtmlEdit.PropertyNames.Id, id);
        edit.Text = value;
    }

    public static void ClickLink(UITestControl parent, string innerText)
    {
        var link = new HtmlHyperlink(parent);
        link.SearchProperties.Add(HtmlHyperlink.PropertyNames.InnerText, innerText);
        link.WaitForControlReady();

        Mouse.Click(link);
    }

    public static void ClickLogon(UITestControl parent, string value)
    {
        var logonInput = new HtmlInputButton(parent);
        logonInput.SearchProperties.Add(HtmlInputButton.PropertyNames.ValueAttribute, value);

        Mouse.Click(logonInput);
    }
   }

通常的最佳实践是,当某些东西可能有加载时间/介绍动画或只是一般情况下使用WaitForControlReady或WaitForControlExist函数编码时

因此,除非您特别关心加载覆盖,否则您可以将函数放在覆盖影响的第一个对象上,该对象是您真正想要与之交互的对象

[TestMethod]
    public void StackOverflow()
        {
        BrowserWindow browser = BrowserWindow.Launch(new Uri("https://onboard.passageways.com/"));

        var _hyper = new HtmlButton(browser);
        _hyper.SearchProperties.Add("ID", "PassagewaysLogin");
        _hyper.WaitForControlReady();
        LoadingOverlay(browser);
        Mouse.Click(_hyper);

        var _email = new HtmlEdit(browser);

        _email.SearchProperties.Add("ID", "Email");
        _email.WaitForControlReady();
        LoadingOverlay(browser);
        Keyboard.SendKeys(_email, "testemail@email.com");
        Playback.Wait(10000);
        }

        public static void LoadingOverlay(BrowserWindow browser)
        {
        var _image = new HtmlDiv(browser);
        _image.SearchProperties.Add("ID", "loadingOverlay");
            _image.WaitForControlReady();
        }

我在这里等待什么控制?加载是否覆盖了一个可以在淡出时准备就绪的控件?我假设您希望单击div中的一个控件(一种元素类型)?超链接什么的?不。加载覆盖整个页面。我需要loadingOverlay来完成它的java脚本并淡出。当它消失时,我需要点击网页上的一个控件,如login。我在该网站上添加了在我的机器上为我工作的方法。你可以在加载覆盖上使用
WaitForControlCondition
,并检查显示属性(或强制搜索样式属性)。您还可以使用for
WaitForControlNotExist
,它将等待控件隐藏。见: