示例#1
0
        public static bool CanBeCut(WebElementInfoViewModel el)
        {
            if (el == null)
            {
                return(false);
            }
            if (WebElementsViewModelsHelper.IsAnyParentReference(el))
            {
                return(false);
            }
            if (el.Parent == null)
            {
                return(true);
            }
            if (el.Parent.ElementType == WebElementTypes.DropDown || el.Parent.ElementType == WebElementTypes.RadioGroup)
            {
                return(false);
            }
            if (el.Parent.ElementType == WebElementTypes.Control ||
                el.Parent.ElementType == WebElementTypes.Context ||
                el.Parent.ElementType == WebElementTypes.Page ||
                el.Parent.ElementType == WebElementTypes.Directory)
            {
                return(true);
            }

            return(false);
        }
示例#2
0
        public WebElementCreateEditDialog(Func <WebElementInfoViewModel, string> validate,
                                          CombinedWebElementInfoViewModel parent,
                                          string elementType,
                                          WebElementInfoViewModel baseInfo)
        {
            _validate  = validate;
            IsEditMode = false;

            Title      = $"Create new WebElement with type: {elementType}";
            WebElement = WebElementsViewModelsHelper.CreateModelFromWebElementType(elementType);

            if (baseInfo != null)
            {
                WebElementsViewModelsHelper.FillModelWithBaseInfo(WebElement, baseInfo, true);
            }

            if (WebElement.InnerKey != null)
            {
                Title = $"Specify new WebElement with role {WebElement.InnerKey}";
            }
            WebElement.Parent = parent;

            InitializeComponent();

            DataContext = this;
        }
示例#3
0
        public void Prepare(List <CombinedWebElementInfoViewModel> contexts,
                            string originalWebElementTreePath,
                            List <string> blockedElementsBreadStrings,
                            List <string> blockedElementTypes)
        {
            IsEditMode = originalWebElementTreePath != null;

            WebElements = new ObservableCollection <CombinedWebElementInfoViewModel>();

            foreach (var context in contexts)
            {
                var info    = WebElementsViewModelsHelper.CreateInfoFromModel(context);
                var model   = WebElementsViewModelsHelper.CreateModelFromInfo(info);
                var cleared = WebElementsViewModelsHelper.ClearAccrodingToBlocked(model,
                                                                                  blockedElementsBreadStrings,
                                                                                  blockedElementTypes);
                if (cleared != null)
                {
                    WebElements.Add((CombinedWebElementInfoViewModel)cleared);
                }
            }

            OriginalWebElementTreePath = originalWebElementTreePath;

            if (OriginalWebElementTreePath != null)
            {
                SelectedWebElementTreePath = OriginalWebElementTreePath;
            }
        }
 public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
 {
     if (value is WebElementInfoViewModel we)
     {
         return(WebElementsViewModelsHelper.IsAnyParentReference(we));
     }
     return(false);
 }
示例#5
0
        public List <SaKiMenuItemViewModel> CreateMenuItemsForWebElement()
        {
            var elementInfo = _webElementsTreeUserControl.SelectedWebElement;

            var et  = elementInfo?.ElementType ?? "Root";
            var p   = elementInfo?.Parent?.ElementType ?? "Root";
            var key = $"Menu Items for {et} {p}";

            var isAnyParentRef = WebElementsViewModelsHelper.IsAnyParentReference(elementInfo);

            if (isAnyParentRef)
            {
                key = "Reference";
            }

            if (elementInfo != null && elementInfo.ElementType == WebElementTypes.Reference)
            {
                key = $"Menu Items for {et} {p} ref";
            }

            if (!_menusCache.ContainsKey(key))
            {
                var items = new List <SaKiMenuItemViewModel>();

                if (isAnyParentRef)
                {
                    items.Add(CreateCopyNameMenuItem());
                    items.Add(CreateGoToReferencedMenuItem());
                }
                else
                {
                    if (elementInfo != null)
                    {
                        items.Add(CreateCopyNameMenuItem());

                        if (elementInfo.ElementType == WebElementTypes.Reference)
                        {
                            items.Add(CreateGoToReferencedMenuItem());
                        }

                        items.Add(CreateEditMenuItem());
                    }

                    if (WebElementCommandsHelper.CanElementHasCustomChildren(elementInfo))
                    {
                        items.Add(CreateCreateMenuItemGroup(et));
                    }

                    items.Add(CreateActionsMenuItemGroup(et, p));
                }

                _menusCache[key] = items;
            }
            return(_menusCache[key]);
        }
示例#6
0
        public override bool CanExecute(object parameter)
        {
            var result = CutOrCopied != null &&
                         Selected != CutOrCopied &&
                         !WebElementsViewModelsHelper.IsAnyParentReference(Selected) &&
                         WebElementCommandsHelper.CanElementHasCustomChildren(Selected) &&
                         !(Cut != null && Selected.IsDescendantdFor(Cut as CombinedWebElementInfoViewModel)) &&
                         ((Selected as CombinedWebElementInfoViewModel)?.Elements
                          ?? _webElementsTreeUserControl.WebElements.Cast <WebElementInfoViewModel>())
                         ?.FirstOrDefault(e => e.Name == CutOrCopied.Name) == null;

            return(result);
        }
示例#7
0
        public WebElementCreateEditDialog(Func <WebElementInfoViewModel, string> validate, WebElementInfoViewModel webElement)
        {
            _validate = validate;

            if (webElement == null)
            {
                throw new ArgumentNullException(nameof(webElement));
            }

            IsEditMode        = true;
            Title             = $"Edit WebElement: {webElement.Name}";
            SourceWebElement  = webElement;
            WebElement        = WebElementsViewModelsHelper.CreateModelCopyWithBaseInfo(webElement);
            WebElement.Parent = webElement.Parent;

            InitializeComponent();

            DataContext = this;
        }
        protected override void ExecuteCommand()
        {
            if (!CanExecute(null))
            {
                return;
            }

            var existedNames = WebElementCommandsHelper.GetExistedNamesForChildWebElements(
                Selected,
                _webElementsTreeUserControl,
                null);

            var textDialog = new TextDialog("Clonned WebElement name");

            textDialog.Validate = str => !existedNames.Contains(str);

            if (textDialog.ShowDialog() != true)
            {
                return;
            }

            var info  = WebElementsViewModelsHelper.CreateInfoFromModel(Selected);
            var model = WebElementsViewModelsHelper.CreateModelFromInfo(info);

            model.Name = textDialog.Text;

            if (Selected.Parent == null)
            {
                if (model is CombinedWebElementInfoViewModel wc)
                {
                    _webElementsTreeUserControl.WebElements.Add(wc);
                }
                else
                {
                    MessageBox.Show("WebElement to clone is not a CombinedWebElementInfoViewModel. Magic Error.");
                }
            }
            else
            {
                model.Parent = Selected.Parent;
                Selected.Parent.Elements.Add(model);
            }
        }
        private WebElementInfoViewModel CreateReference()
        {
            var blockedTypesToPick = WebElementsViewModelsHelper.GetBlockedElementTypesForElementType(_elementType);

            var picker = new WebElementPickerDialog(_webElementsTreeUserControl.WebElements.ToList(),
                                                    false,
                                                    null,
                                                    null,
                                                    blockedTypesToPick);

            if (picker.ShowDialog() != true)
            {
                return(null);
            }
            var referenceTreePath = picker.SelectedWebElementTreePath;
            var referencedElement = (WebElementInfoViewModel)_webElementsTreeUserControl.WebElements.FindNodeByTreePath(referenceTreePath);
            var referenceCopy     = WebElementsViewModelsHelper.CreateFullModelCopy(referencedElement);

            var templateInfo = WebElementsViewModelsHelper.CreateModelFromWebElementType(WebElementTypes.Reference)
                               as WebElementWithReferenceViewModel;

            WebElementsViewModelsHelper.FillModelWithBaseInfo(templateInfo, referencedElement);
            templateInfo.Locator              = null;
            templateInfo.ElementType          = WebElementTypes.Reference;
            templateInfo.ReferenceBreadString = referenceTreePath;
            templateInfo.ReferencedWebElement = referenceCopy;

            var createdElement = CreateWebElementInfo(null, templateInfo) as WebElementWithReferenceViewModel;

            if (createdElement == null)
            {
                return(null);
            }

            createdElement.ReferencedWebElement = referenceCopy;
            if (createdElement.Elements == null)
            {
                createdElement.Elements = new ObservableCollection <WebElementInfoViewModel>();
            }
            referenceCopy.Parent = createdElement;

            return(createdElement);
        }
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            if (values.Length != 2)
            {
                return(null);
            }
            if (!(values[1] is WebElementInfoViewModel webElement))
            {
                return(null);
            }

            WebSearchInfo ws = null;

            try
            {
                ws = webElement.GetWebSearch();
            }
            catch (Exception ex)
            {
                ws = new WebSearchInfo
                {
                    LocatorValue = $"Error: {ex.Message}"
                };
            }

            var wsModel = WebElementsViewModelsHelper.CreateWebSearchModelFromInfo(ws);

            var list = new List <WebSearchInfoModel>();

            var cur = wsModel;

            while (cur != null)
            {
                list.Add(cur);
                cur = cur.ParentSearch;
            }

            list.Reverse();

            return(list);
        }
示例#11
0
        public static bool CanBeCloned(WebElementInfoViewModel el)
        {
            if (el == null)
            {
                return(false);
            }
            if (WebElementsViewModelsHelper.IsAnyParentReference(el))
            {
                return(false);
            }
            if (el.Parent == null)
            {
                return(false);
            }
            if (el.Parent.ElementType == WebElementTypes.DropDown || el.Parent.ElementType == WebElementTypes.RadioGroup)
            {
                return(false);
            }

            return(true);
        }
示例#12
0
        private void AcceptMenuItem_Click(object sender, RoutedEventArgs e)
        {
            var validationResult = _validate?.Invoke(WebElement);

            if (!string.IsNullOrWhiteSpace(validationResult))
            {
                MessageBox.Show(validationResult, "WebElement data is not valid", MessageBoxButton.OK,
                                MessageBoxImage.Error);
                return;
            }

            if (IsEditMode)
            {
                WebElementsViewModelsHelper.FillModelWithBaseInfo(SourceWebElement, WebElement);
                WebElementsViewModelsHelper.UpdateAllReferences(WebElements, SourceWebElement);
                WebElement = SourceWebElement;
            }

            SourceWebElement = null;
            DialogResult     = true;
            Close();
        }
        private WebElementInfoViewModel CreateWebElementInfo(CombinedWebElementInfoViewModel parent = null, WebElementInfoViewModel template = null)
        {
            var validator = WebElementCommandsHelper.GetCreateUpdateWebElementValidator(_webElementsTreeUserControl, null);

            //TODO: add ctor override to accept WebElementInfoViewModel with default data
            var dialog = new WebElementCreateEditDialog(validator,
                                                        parent ?? Selected as CombinedWebElementInfoViewModel,
                                                        _elementType,
                                                        template);

            dialog.WebElements = _webElementsTreeUserControl.WebElements;
            if (dialog.ShowDialog() != true)
            {
                return(null);
            }

            var createdWebElement = WebElementsViewModelsHelper.CreateModelFromWebElementType(_elementType);

            WebElementsViewModelsHelper.FillModelWithBaseInfo(
                createdWebElement,
                dialog.WebElement);

            return(createdWebElement);
        }
示例#14
0
        protected override void ExecuteCommand()
        {
            if (!CanExecute(null))
            {
                return;
            }

            WebElementInfoViewModel model = Cut;

            var combined = Selected as CombinedWebElementInfoViewModel;

            if (combined == null && Selected != null)
            {
                MessageBox.Show("Magic!!! Try to paste to not combined element!");
                return;
            }

            if (combined != null)
            {
                if (combined.Elements == null)
                {
                    combined.Elements = new ObservableCollection <WebElementInfoViewModel>();
                }
            }

            if (Copied != null)
            {
                var info = WebElementsViewModelsHelper.CreateInfoFromModel(Copied);
                model = WebElementsViewModelsHelper.CreateModelFromInfo(info);
            }
            else
            {
                if (model.Parent != null)
                {
                    model.Parent.Elements.Remove(model);
                }
                else
                {
                    _webElementsTreeUserControl.WebElements.Remove(model as CombinedWebElementInfoViewModel);
                }
            }

            model.Parent = combined;

            if (combined != null)
            {
                combined.Elements.Add(model);
            }
            else
            {
                var cmb = model as CombinedWebElementInfoViewModel;
                if (cmb == null)
                {
                    MessageBox.Show("Magic!!! Try to paste not combined element to Root!");
                    return;
                }
                _webElementsTreeUserControl.WebElements.Add(cmb);
            }

            _webElementsTreeUserControl.SelectedWebElement = model;
        }
 public override bool CanExecute(object parameter)
 {
     return(Selected != null && !WebElementsViewModelsHelper.IsAnyParentReference(Selected));
 }
        private void EditReferencedElementButton_Click(object sender, RoutedEventArgs e)
        {
            if (WebElements == null ||
                !(WebElement is WebElementWithReferenceViewModel rm))
            {
                MessageBox.Show("Edit operaion is not supported. WebElements source is not specified or element doesn't support references");
                return;
            }

            var blockedTreePath = new List <string>();

            var curParent = WebElement;

            while (!(curParent?.Parent == null ||
                     curParent.Parent.ElementType == WebElementTypes.Directory))
            {
                curParent = curParent.Parent;
            }

            blockedTreePath.Clear();
            blockedTreePath.Add(curParent.GetTreePath());

            var picker = new WebElementPickerDialog(WebElements.ToList(),
                                                    WebElement.ElementType == WebElementTypes.Frame,
                                                    rm.ReferenceBreadString,
                                                    blockedTreePath,
                                                    WebElementsViewModelsHelper.GetBlockedElementTypesForElementType(rm.ElementType)
                                                    );

            if (picker.ShowDialog() != true)
            {
                return;
            }

            if (rm.ReferenceBreadString == picker.SelectedWebElementTreePath)
            {
                return;
            }

            rm.ReferenceBreadString = picker.SelectedWebElementTreePath;

            var r    = (WebElementInfoViewModel)WebElements.FindNodeByTreePath(rm.ReferenceBreadString);
            var copy = WebElementsViewModelsHelper.CreateFullModelCopy(r);

            if (rm.ElementType == WebElementTypes.Reference)
            {
                var baseInfo = new WebElementInfoViewModel
                {
                    Name        = copy.Name,
                    Description = copy.Description,
                    Tags        = copy.Tags,
                    ElementType = null,
                    Locator     = null,
                    InnerKey    = null,
                };

                WebElementsViewModelsHelper.FillModelWithBaseInfo(rm, baseInfo, true);
            }

            rm.Elements?.Clear();
            if (rm.Elements == null)
            {
                rm.Elements = new ObservableCollection <WebElementInfoViewModel>();
            }

            if (rm.ElementType == WebElementTypes.Reference)
            {
                if (copy is CombinedWebElementInfoViewModel combinedRef)
                {
                    if (combinedRef.Elements != null)
                    {
                        foreach (var c in combinedRef.Elements)
                        {
                            rm.Elements.Add(c);
                            c.Parent = rm;
                        }
                    }
                }
            }
            else
            {
                if (rm.ReferencedWebElement != null)
                {
                    rm.ReferencedWebElement.Parent = null;
                    rm.ReferencedWebElement        = null;
                }

                rm.Elements.Add(copy);
            }

            rm.ReferencedWebElement = copy;
            copy.Parent             = rm;
            rm.HasLocator           = false;

            WebElement = WebElementsViewModelsHelper.CreateFullModelCopy(rm);
            UpdateLayout();
            WebElement = rm;
        }
        protected override void ExecuteCommand()
        {
            WebElementInfoViewModel createdElement = null;

            if (_elementType == WebElementTypes.Reference)
            {
                createdElement = CreateReference();
                if (createdElement == null)
                {
                    return;
                }
            }
            else
            {
                createdElement = CreateWebElementInfo();

                if (createdElement == null)
                {
                    return;
                }

                if (_elementType == WebElementTypes.DropDown ||
                    _elementType == WebElementTypes.RadioGroup)
                {
                    var combinedCreatedElement = createdElement as CombinedWebElementInfoViewModel;

                    if (combinedCreatedElement.Elements == null)
                    {
                        combinedCreatedElement.Elements = new ObservableCollection <WebElementInfoViewModel>();
                    }

                    if (_elementType == WebElementTypes.DropDown)
                    {
                        var inputTemplate = new WebElementInfoViewModel
                        {
                            Name        = $"{createdElement.Name} Input",
                            Description = $"Input for {createdElement.Name}",
                            InnerKey    = DropDownElementInfo.Keys.Input,
                            ElementType = WebElementTypes.Element,
                            IsKey       = true,
                            Locator     = new WebLocatorInfoViewModel
                            {
                                IsRelative   = true,
                                LocatorType  = WebLocatorType.XPath,
                                LocatorValue = ".//"
                            }
                        };

                        var inputElement = CreateWebElementInfo(
                            combinedCreatedElement,
                            inputTemplate);
                        if (inputElement == null)
                        {
                            return;
                        }

                        inputElement.Parent = combinedCreatedElement;
                        combinedCreatedElement.Elements.Add(inputElement);
                    }

                    var optionTemplate = new WebElementInfoViewModel
                    {
                        Name        = $"{createdElement.Name} Option",
                        Description = $"Option for {createdElement.Name}",
                        InnerKey    = _elementType == WebElementTypes.DropDown
                            ? DropDownElementInfo.Keys.Option
                            : RadioGroupElementInfo.Keys.Option,
                        ElementType = WebElementTypes.Element,
                        IsKey       = true,
                        Locator     = new WebLocatorInfoViewModel
                        {
                            IsRelative   = true,
                            LocatorType  = WebLocatorType.XPath,
                            LocatorValue = ".//"
                        }
                    };

                    var optionElement = CreateWebElementInfo(
                        combinedCreatedElement,
                        optionTemplate);
                    if (optionElement == null)
                    {
                        return;
                    }

                    optionElement.Parent = combinedCreatedElement;
                    combinedCreatedElement.Elements.Add(optionElement);
                }

                if (_elementType == WebElementTypes.Frame)
                {
                    var frameElement      = createdElement as WebElementWithReferenceViewModel;
                    var referenceTreePath = frameElement.ReferenceBreadString;
                    if (referenceTreePath == null)
                    {
                        var blockedTypesToPick = WebElementsViewModelsHelper.GetBlockedElementTypesForElementType(_elementType);

                        var picker = new WebElementPickerDialog(_webElementsTreeUserControl.WebElements.ToList(),
                                                                true,
                                                                null,
                                                                null,
                                                                blockedTypesToPick);


                        if (picker.ShowDialog() != true)
                        {
                            return;
                        }
                        referenceTreePath = picker.SelectedWebElementTreePath;
                    }

                    var referencedElement = (WebElementInfoViewModel)_webElementsTreeUserControl.WebElements.FindNodeByTreePath(referenceTreePath);

                    var copy = WebElementsViewModelsHelper.CreateFullModelCopy(referencedElement);
                    copy.Parent = frameElement;
                    if (frameElement.Elements == null)
                    {
                        frameElement.Elements = new ObservableCollection <WebElementInfoViewModel>();
                    }
                    frameElement.Elements.Clear();
                    frameElement.Elements.Add(copy);
                }
            }
            if (createdElement == null)
            {
                return;
            }

            if (Selected == null)
            {
                if (_webElementsTreeUserControl.WebElements == null)
                {
                    _webElementsTreeUserControl.WebElements = new ObservableCollection <CombinedWebElementInfoViewModel>();
                }
                _webElementsTreeUserControl.WebElements.Add(createdElement as CombinedWebElementInfoViewModel);
            }
            else
            {
                var comb = Selected as CombinedWebElementInfoViewModel;
                if (comb == null)
                {
                    MessageBox.Show("Magic error. WebElement was created not from CombinedWebElement");
                    return;
                }

                if (comb.Elements == null)
                {
                    comb.Elements = new ObservableCollection <WebElementInfoViewModel>();
                }

                comb.Elements.Add(createdElement);
                createdElement.Parent = comb;
            }

            return;
        }
 public override bool CanExecute(object parameter)
 {
     return((Selected?.ElementType == WebElementTypes.Reference) ||
            WebElementsViewModelsHelper.IsAnyParentReference(Selected));
 }