internal static CruciatusElement FindFirst(CruciatusElement parent, By getStrategy, int timeout) { if (parent == null) { throw new ArgumentNullException("parent"); } var element = FindFirst(parent.Instance, getStrategy, timeout); return element == null ? null : new CruciatusElement(parent, element, getStrategy); }
internal static IEnumerable<CruciatusElement> FindAll(CruciatusElement parent, By strategy, int timeout) { if (parent == null) { throw new ArgumentNullException("parent"); } var result = strategy.FindAll(parent.Instance, timeout); return result.Select(e => new CruciatusElement(parent, e, strategy)); }
internal static CruciatusElement FindFirst(CruciatusElement parent, By strategy, int timeout) { var element = strategy.FindFirst(parent.Instance, timeout); if (element == null) { Logger.Info("Element '{0}' not found", strategy); CruciatusFactory.Screenshoter.AutomaticScreenshotCaptureIfNeeded(); return null; } return new CruciatusElement(parent, element, strategy); }
internal static AutomationElement FindFirst(AutomationElement parent, By getStrategy, int timeout) { var element = parent; foreach (var info in getStrategy.FindInfoList) { element = AutomationElementHelper.FindFirst(element, info.TreeScope, info.Condition, timeout); if (element == null) { Logger.Info("Element '{0}' not found", info); CruciatusFactory.Screenshoter.AutomaticScreenshotCaptureIfNeeded(); return null; } } return element; }
internal static IEnumerable<CruciatusElement> FindAll(CruciatusElement parent, By getStrategy, int timeout) { if (parent == null) { throw new ArgumentNullException("parent"); } var element = parent.Instance; var info = getStrategy.FindInfoList; for (var i = 0; i < info.Count - 1; ++i) { element = AutomationElementHelper.FindFirst(element, info[i].TreeScope, info[i].Condition, timeout); if (element == null) { Logger.Error("Element '{0}' not found", info); CruciatusFactory.Screenshoter.AutomaticScreenshotCaptureIfNeeded(); throw new CruciatusException("ELEMENT NOT FOUND"); } } var lastIinfo = getStrategy.FindInfoList.Last(); var result = AutomationElementHelper.FindAll(element, lastIinfo.TreeScope, lastIinfo.Condition); return result.Select(e => new CruciatusElement(parent, e, getStrategy)); }
internal static AutomationElement FindFirst(AutomationElement parent, By getStrategy) { return FindFirst(parent, getStrategy, CruciatusFactory.Settings.SearchTimeout); }
internal static IEnumerable<CruciatusElement> FindAll(CruciatusElement parent, By getStrategy) { return FindAll(parent, getStrategy, CruciatusFactory.Settings.SearchTimeout); }
/// <summary> /// Создает экземпляр таблицы. Поиск осуществится только при необходимости. /// </summary> /// <param name="parent"> /// Родительский элемент. /// </param> /// <param name="getStrategy"> /// Стратегия поиска элемента. /// </param> public DataGrid(CruciatusElement parent, By getStrategy) : base(parent, getStrategy) { }
public SecondTab(CruciatusElement parent, By getStrategy) : base(parent, getStrategy) { }
public MainWindow(CruciatusElement parent, By getStrategy) : base(parent, getStrategy) { }
/// <summary> /// Создает экземпляр вкладки. Поиск осуществится только при необходимости. /// </summary> /// <param name="parent"> /// Родительский элемент. /// </param> /// <param name="getStrategy"> /// Стратегия поиска элемента. /// </param> public TabItem(CruciatusElement parent, By getStrategy) : base(parent, getStrategy) { }
/// <summary> /// Прокручивает список до элемента, удовлетворяющего стратегии поиска. /// Возвращает целевой элемент, либо null, если он не найден. /// </summary> /// <param name="getStrategy"> /// Стратегия поиска целевого элемента. /// </param> public CruciatusElement ScrollTo(By getStrategy) { if (!this.Instance.Current.IsEnabled) { Logger.Error("Element '{0}' not enabled. Scroll failed.", this.ToString()); CruciatusFactory.Screenshoter.AutomaticScreenshotCaptureIfNeeded(); throw new ElementNotEnabledException("NOT SCROLL"); } var scrollPattern = this.Instance.GetCurrentPattern(ScrollPattern.Pattern) as ScrollPattern; if (scrollPattern == null) { Logger.Debug("{0} does not support ScrollPattern.", this); throw new ElementNotEnabledException("NOT SCROLL"); } // Стартовый поиск элемента var element = CruciatusCommand.FindFirst(this, getStrategy, 1000); // Вертикальная прокрутка (при необходимости и возможности) if (element == null && scrollPattern.Current.VerticallyScrollable) { // Установка самого верхнего положения прокрутки while (scrollPattern.Current.VerticalScrollPercent > 0.1) { scrollPattern.ScrollVertical(ScrollAmount.LargeDecrement); } // Установка самого левого положения прокрутки (при возможности) if (scrollPattern.Current.HorizontallyScrollable) { while (scrollPattern.Current.HorizontalScrollPercent > 0.1) { scrollPattern.ScrollHorizontal(ScrollAmount.LargeDecrement); } } // Основная вертикальная прокрутка while (element == null && scrollPattern.Current.VerticalScrollPercent < 99.9) { scrollPattern.ScrollVertical(ScrollAmount.LargeIncrement); element = CruciatusCommand.FindFirst(this, getStrategy, 1000); } } if (element == null) { Logger.Debug("No elements matching {1} were found in {0}.", this, getStrategy); return null; } // Если точка клика элемента под границей списка - докручиваем по вертикали вниз while (element.Instance.ClickablePointUnder(this.Instance, scrollPattern)) { scrollPattern.ScrollVertical(ScrollAmount.SmallIncrement); } // Если точка клика элемента над границей списка - докручиваем по вертикали вверх while (element.Instance.ClickablePointOver(this.Instance)) { scrollPattern.ScrollVertical(ScrollAmount.SmallDecrement); } // Если точка клика элемента справа от границы списка - докручиваем по горизонтали вправо while (element.Instance.ClickablePointRight(this.Instance, scrollPattern)) { scrollPattern.ScrollHorizontal(ScrollAmount.SmallIncrement); } // Если точка клика элемента слева от границы списка - докручиваем по горизонтали влево while (element.Instance.ClickablePointLeft(this.Instance)) { scrollPattern.ScrollHorizontal(ScrollAmount.SmallDecrement); } return element; }
/// <summary> /// Создает экземпляр меню. Поиск осуществится только при необходимости. /// </summary> /// <param name="parent"> /// Родительский элемент. /// </param> /// <param name="getStrategy"> /// Стратегия поиска элемента. /// </param> public Menu(CruciatusElement parent, By getStrategy) : base(parent, getStrategy) { }
/// <summary> /// Создает экземпляр диалогового окна. Поиск осуществится только при необходимости. /// </summary> /// <param name="parent"> /// Родительский элемент. /// </param> /// <param name="getStrategy"> /// Стратегия поиска элемента. /// </param> public SaveFileDialog(CruciatusElement parent, By getStrategy) : base(parent, getStrategy) { }
/// <summary> /// Создает экземпляр чекбокса. Поиск осуществится только при необходимости. /// </summary> /// <param name="parent"> /// Родительский элемент. /// </param> /// <param name="getStrategy"> /// Стратегия поиска элемента. /// </param> public CheckBox(CruciatusElement parent, By getStrategy) : base(parent, getStrategy) { }
internal static CruciatusElement FindFirst(CruciatusElement parent, By strategy) { return FindFirst(parent, strategy, CruciatusFactory.Settings.SearchTimeout); }
public FirstRibbonTab(CruciatusElement parent, By getStrategy) : base(parent, getStrategy) { }
/// <summary> /// Прокручивает список до элемента, удовлетворяющего стратегии поиска. /// Возвращает целевой элемент, либо null, если он не найден. /// </summary> /// <param name="getStrategy"> /// Стратегия поиска целевого элемента. /// </param> public CruciatusElement ScrollTo(By getStrategy) { if (!this.Instance.Current.IsEnabled) { Logger.Error("Element '{0}' not enabled. Scroll failed.", this.ToString()); CruciatusFactory.Screenshoter.AutomaticScreenshotCaptureIfNeeded(); throw new ElementNotEnabledException("NOT SCROLL"); } // Проверка, что выпадающий список раскрыт if (this.ExpandCollapseState != ExpandCollapseState.Expanded) { Logger.Error("Element {0} is not opened.", this); throw new CruciatusException("NOT SCROLL"); } var scrollPattern = this.Instance.GetCurrentPattern(ScrollPattern.Pattern) as ScrollPattern; if (scrollPattern == null) { Logger.Error("{0} does not support ScrollPattern.", this); throw new CruciatusException("NOT SCROLL"); } // Стартовый поиск элемента var element = CruciatusCommand.FindFirst(this, getStrategy, 1000); // Вертикальная прокрутка (при необходимости и возможности) if (element == null && scrollPattern.Current.VerticallyScrollable) { // Установка самого верхнего положения прокрутки while (scrollPattern.Current.VerticalScrollPercent > 0.1) { scrollPattern.ScrollVertical(ScrollAmount.LargeDecrement); } // Установка самого левого положения прокрутки (при возможности) if (scrollPattern.Current.HorizontallyScrollable) { while (scrollPattern.Current.HorizontalScrollPercent > 0.1) { scrollPattern.ScrollHorizontal(ScrollAmount.LargeDecrement); } } // Основная вертикальная прокрутка while (element == null && scrollPattern.Current.VerticalScrollPercent < 99.9) { scrollPattern.ScrollVertical(ScrollAmount.LargeIncrement); element = CruciatusCommand.FindFirst(this, getStrategy, 1000); } } // Если прокрутив до конца элемент не найден, то его нет (кэп) if (element == null) { Logger.Debug("No elements matching {1} were found in {0}.", this, getStrategy); return null; } var strategy = By.AutomationProperty(TreeScope.Subtree, AutomationElement.ClassNameProperty, "Popup") .And(AutomationElement.ProcessIdProperty, this.Instance.Current.ProcessId); var popupWindow = CruciatusFactory.Root.FindElement(strategy); if (popupWindow == null) { Logger.Error("Popup window of drop-down list was not found."); throw new CruciatusException("NOT SCROLL"); } // Если точка клика элемента под границей списка - докручиваем по вертикали вниз var popupWindowInstance = popupWindow.Instance; while (element.Instance.ClickablePointUnder(popupWindowInstance, scrollPattern)) { scrollPattern.ScrollVertical(ScrollAmount.LargeIncrement); } // Если точка клика элемента над границей списка - докручиваем по вертикали вверх while (element.Instance.ClickablePointOver(popupWindowInstance)) { scrollPattern.ScrollVertical(ScrollAmount.SmallDecrement); } // Если точка клика элемента справа от границы списка - докручиваем по горизонтали вправо while (element.Instance.ClickablePointRight(popupWindowInstance, scrollPattern)) { scrollPattern.ScrollHorizontal(ScrollAmount.LargeIncrement); } // Если точка клика элемента слева от границы списка - докручиваем по горизонтали влево while (element.Instance.ClickablePointLeft(popupWindowInstance)) { scrollPattern.ScrollHorizontal(ScrollAmount.SmallDecrement); } return element; }