/// <summary> /// Поиск элемента. /// Возвращает целевой элемент, либо null, если он не найден. /// </summary> /// <param name="strategy"> /// Стратегия поиска. /// </param> public virtual CruciatusElement FindElement(By strategy) { return(CruciatusCommand.FindFirst(this, strategy)); }
/// <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> /// Прокручивает список до элемента, удовлетворяющего стратегии поиска. /// Возвращает целевой элемент, либо 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("Элемент {0} не развернут.", this); throw new CruciatusException("NOT SCROLL"); } var scrollPattern = this.Instance.GetCurrentPattern(ScrollPattern.Pattern) as ScrollPattern; if (scrollPattern == null) { Logger.Error("{0} не поддерживает 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("В {0} нет элемента '{1}'.", 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 окно выпадающего списка."); 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); }
public WindowAppElement 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); }
public WindowAppElement 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); }