WatiN LogonDialogHandlers not working correctly in Windows 7

后端 未结 7 1189
旧巷少年郎
旧巷少年郎 2020-12-07 02:01

I have recently updated to Windows 7, VS2010 and IE8. We have an automation suite running tests against IE using WatiN. These tests require the logon dialog handler to be us

7条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-12-07 02:09

    This can also be refactored as a DialogHandler like this:

    public class Windows7LogonDialogHandler : BaseDialogHandler
    {
        private readonly string _username;
        private readonly string _password;
        AndCondition _conditions = new AndCondition(new PropertyCondition(AutomationElement.IsEnabledProperty, true),
                                       new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Window));
    
        readonly AndCondition _listCondition = new AndCondition(new PropertyCondition(AutomationElement.IsEnabledProperty, true),
                                        new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.ListItem));
    
        readonly AndCondition _editCondition = new AndCondition(new PropertyCondition(AutomationElement.IsEnabledProperty, true),
                                    new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Edit));
    
        readonly AndCondition _buttonConditions = new AndCondition(new PropertyCondition(AutomationElement.IsEnabledProperty, true),
                                     new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Button));
    
        public Windows7LogonDialogHandler(string username, string password)
        {
            _username = username;
            _password = password;
        }
    
        public override bool HandleDialog(Window window)
        {
            if(CanHandleDialog(window))
            {
                var win = AutomationElement.FromHandle(window.Hwnd);
                var lists = win.FindAll(TreeScope.Children, _listCondition);
                var buttons = win.FindAll(TreeScope.Children, _buttonConditions);
                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, _editCondition)
                                         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(_username);
                    }
                    if (edit.Current.Name.Contains("Password"))
                    {
                        edit.SetFocus();
                        var passwordPattern = edit.GetCurrentPattern(ValuePattern.Pattern) as ValuePattern;
                        if (passwordPattern != null) passwordPattern.SetValue(_password);
                    }
                }
                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";
        }
    }
    

    Which is a little bit nicer. You can then use it like this:

    using(var ie = new IE())
            {
                ie.DialogWatcher.Add(new Windows7LogonDialogHandler(@"domain\user", "password"));
                ie.GoTo("http://mysecuredwebsite");
            }
    

提交回复
热议问题