簡體   English   中英

Watin的Windows登錄對話框

[英]Windows Logon Dialog by Watin

我們有一個使用WatiN在IE上運行的自動化測試。 此測試需要處理登錄對話框。 我應該如何處理Watin?

在Windows 7中,登錄處理程序成為WPF組件,不再是IE的一部分。 我認為這甚至適用於IE8或更高版本。

下面是我們用於處理這些對話框的代碼。 這是我自己寫的東西,所以只要有信譽就可以隨意使用。

using System.Windows.Automation;
using System.Linq;
using WatiN.Core.DialogHandlers;
using WatiN.Core.Native.Windows;

namespace DialogHandlers
{
    public class Windows7LogonDialogHandler : LogonDialogHandler
    {
        #region Private Fields

        private readonly string _mUsername;
        private readonly string _mPassword;
        private readonly AndCondition _mListCondition = new AndCondition(new PropertyCondition(AutomationElement.IsEnabledProperty, true), new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.ListItem));
        private readonly AndCondition _mEditCondition = new AndCondition(new PropertyCondition(AutomationElement.IsEnabledProperty, true), new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Edit));
        private readonly AndCondition _mButtonConditions = new AndCondition(new PropertyCondition(AutomationElement.IsEnabledProperty, true), new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Button));

        #endregion

        #region Constructor

        public Windows7LogonDialogHandler(string username, string password)
            : base(username, password)
        {
            _mUsername = username;
            _mPassword = password;
        }

        #endregion

        #region Public Members

        public override bool HandleDialog(Window window)
        {
            if (CanHandleDialog(window))
            {
                var win = AutomationElement.FromHandle(window.Hwnd);
                var lists = win.FindAll(TreeScope.Children, _mListCondition);
                var buttons = win.FindAll(TreeScope.Children, _mButtonConditions);
                var another = (from AutomationElement list in lists
                               where list.Current.ClassName == "UserTile"
                               where list.Current.Name == "Use another account"
                               select list).First();
                another.SetFocus();

                foreach (var edit in from AutomationElement list in lists
                                     where list.Current.ClassName == "UserTile"
                                     select list.FindAll(TreeScope.Children, _mEditCondition)
                                         into edits
                                         from AutomationElement edit in edits
                                         select edit)
                {
                    if (edit.Current.Name.Contains("User name"))
                    {
                        edit.SetFocus();
                        var usernamePattern = edit.GetCurrentPattern(ValuePattern.Pattern) as ValuePattern;
                        if (usernamePattern != null) usernamePattern.SetValue(_mUsername);
                    }
                    if (edit.Current.Name.Contains("Password"))
                    {
                        edit.SetFocus();
                        var passwordPattern = edit.GetCurrentPattern(ValuePattern.Pattern) as ValuePattern;
                        if (passwordPattern != null) passwordPattern.SetValue(_mPassword);
                    }
                }
                foreach (var submitPattern in from AutomationElement button in buttons
                                              where button.Current.AutomationId == "SubmitButton"
                                              select button.GetCurrentPattern(InvokePattern.Pattern) as InvokePattern)
                {
                    submitPattern.Invoke();
                    break;
                }
                return true;
            }
            return false;
        }

        public override bool CanHandleDialog(Window window)
        {
            return window.ClassName == "#32770";
        }

        #endregion
    }
}

你可以試試這個

Browser browser = new IE();
WatiN.Core.DialogHandlers.LogonDialogHandler ldh = 
        new WatiN.Core.DialogHandlers.LogonDialogHandler("UserName","Password");
browser.DialogWatcher.Add(ldh);
browser.ShowWindow(NativeMethods.WindowShowStyle.Maximize);
browser.GoTo("http://www.yoururl.com");

但是,如果您使用的是Windows 7,則可能需要更深入地了解

我知道回答這個問題已經有很長時間了,但是嘗試將這段代碼與IE11一起使用時(在配置了PT-BR語言的瀏覽器上)遇到了一些麻煩,所以我想在這里留下我的mod給那些可能對此感興趣或一直在掙扎的人。 *對不起,我的英語不好!

** watin ie11認證對話框

公共類Windows7LogonDialogHandler:BaseDialogHandler {#region私有字段

    private readonly string _mUsername;
    private readonly string _mPassword;

    private readonly AndCondition _mListCondition = new AndCondition(
                                                new PropertyCondition(AutomationElement.IsEnabledProperty, true),
                                                new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.List));

    private readonly AndCondition _mListItemsCondition = new AndCondition(
                                                new PropertyCondition(AutomationElement.IsEnabledProperty, true),
                                                new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.ListItem));

    private readonly AndCondition _mEditCondition = new AndCondition(
                                        new PropertyCondition(AutomationElement.IsEnabledProperty, true),
                                        new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Edit));

    private readonly AndCondition _mButtonConditions = new AndCondition(
                                        new PropertyCondition(AutomationElement.IsEnabledProperty, true), 
                                        new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Button));

    #endregion

    #region Constructor

    public Windows7LogonDialogHandler(string username, string password)
    {
        _mUsername = username;
        _mPassword = password;
    }

    #endregion

    #region Public Members

    public override bool HandleDialog(Window window)
    {
        if (CanHandleDialog(window))
        {
            var win = AutomationElement.FromHandle(window.Hwnd);

            var lists = win.FindAll(TreeScope.Descendants, _mListItemsCondition);
            var buttons = win.FindAll(TreeScope.Children, _mButtonConditions);

            var another = (from AutomationElement list in lists
                           where list.Current.ClassName == "UserTile"
                           where list.Current.Name == "Use another account"
                           select list).FirstOrDefault();
            if (another != null) another.SetFocus();

            foreach (var edit in from AutomationElement list in lists
                                 where list.Current.ClassName.Contains("UserTile")
                                 select list.FindAll(TreeScope.Children, _mEditCondition)
                                     into edits
                                     from AutomationElement edit in edits
                                     select edit)
            {
                if (edit.Current.Name.Contains("User name") || edit.Current.Name.Contains("Nome de usuário"))
                {
                    edit.SetFocus();
                    var usernamePattern = edit.GetCurrentPattern(ValuePattern.Pattern) as ValuePattern;
                    if (usernamePattern != null) usernamePattern.SetValue(_mUsername);
                }
                if (edit.Current.Name.Contains("Password") || edit.Current.Name.Contains("Senha"))
                {
                    edit.SetFocus();
                    var passwordPattern = edit.GetCurrentPattern(ValuePattern.Pattern) as ValuePattern;
                    if (passwordPattern != null) passwordPattern.SetValue(_mPassword);
                }
            }

            foreach (var submitPattern in from AutomationElement button in buttons
                                          where button.Current.AutomationId == "SubmitButton"
                                          select button.GetCurrentPattern(InvokePattern.Pattern) as InvokePattern)
            {
                submitPattern.Invoke();
                break;
            }
            return true;
        }
        return false;
    }

    public override bool CanHandleDialog(Window window)
    {
        return window.ClassName == "#32770";
    }

    #endregion
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM