Не удалось выполнить действие при исключении блокированного управления? Использование кодированного пользовательского интерфейса?

Я автоматизирую приложение WPF, когда я записываю "WpfComboBox" Control и выполняю select index на этом элементе управления, он бросает ошибку, например "Failed To Perform Action on Blocked Control Exception". Пожалуйста, помогите мне преодолеть эту проблему.

WpfControl customContr = new WpfControl(subDvnMap.SubDvsnItemCustom.SubDvsnItemTabList.SubDvsnPIPrismPrismExtensioTabPage);
customContr.SearchProperties.Add(WpfControl.PropertyNames.AutomationId, "legalFormatsControl");

WpfComboBox combLegal = new WpfComboBox(customContr);       
combLegal.SearchProperties.Add(WpfComboBox.PropertyNames.AutomationId, "legalFormats");
combLegal.Find();
combLegal.SelectedIndex = 2; 

выше мой код, он бросает ошибку в combLegal.selectedIndex = 2

введите описание изображения здесь

Ответ 1

Причина этой проблемы:

Элемент управления помещен внутри невидимого элемента управления, который помещается внутри родительского элемента управления. Как и в вашем коде, combobox находится внутри customContr Wpfcontrol. но есть еще один элемент управления, который блокирует доступ к выпадающим спискам. Дизайнеры, должно быть, использовали это для некоторых других целей при отладке и забыли удалить их после того, как они это сделали.

Возможные решения:


1. Попробуйте получить доступ к невидимому элементу управления его родителем.

WpfControl customContr = new WpfControl(subDvnMap.SubDvsnItemCustom......);
customContr.SearchProperties.Add(....AutomationId, "legalFormatsControl");
foreach(WpfControl TempContr in customContr.GetChildren())
{
  WpfControl ChildContr = TempContr.GetChildren().ElementAt(0);
  if(ChildContr is WpfComboBox)
    {
     combLegal.SelectedIndex = 2;
     break;
    }
}



2. Попробуйте получить доступ к управлению, проверив его ширину.

WpfControl customContr = new WpfControl(subDvnMap.SubDvsnItemCustom......);
customContr.SearchProperties.Add(....AutomationId, "legalFormatsControl");
foreach(WpfControl TempContr in customContr.GetChildren())
{
   if(TempContr.BoundingRectangle.Width>0)
      {
        combLegal.SelectedIndex = 2;
        break;
      }
}



3. Попробуйте получить доступ к управлению, проверив его ширину родителя.

  WpfControl customContr = new WpfControl(subDvnMap.SubDvsnItemCustom......);
    customContr.SearchProperties.Add(....AutomationId, "legalFormatsControl");
    foreach(WpfControl TempContr in customContr.GetChildren())
    {
       if(TempContr.BoundingRectangle.Width>0)
         {
           WpfControlCollection Collection = TempContr.GetChildren();
           foreach(WpfControl combLegal in Collection)
             {
               if(combLegal is WpfComboBox)
                 {
                  combLegal.SelectedIndex = 2;
                   break;
                 }
             }
         }
    }


Один из них должен решить вашу проблему. Если нет, сделайте комментарий ниже, мы дадим еще несколько попыток. удачи..!!

Ответ 2

Привет, я думаю, что раньше вы выполняли другие операции над тем же элементом управления.

Лучше снова добавить тот же элемент управления и переименовать его с каким-либо другим именем и убедиться, что он связан только с одним действием или операцией.

Это поможет вам.

Ответ 3

Это происходит в веб-приложениях angular, где есть родительский элемент управления, который блокирует "реальный" под ним, а также не принимает прямого управления. В конечном счете @Rajesh-S прав на деньги, и иногда его подход родитель-ребенок превосходит этот. Однако это не всегда ответ.

Чтобы обойти это, моя команда использует метод что-то вроде этого. Используйте экономно.

 /// <summary>
/// Clicks any control on a page for the given area.
/// </summary>
/// <param name="controlObject">Control Object to Click</param>
public static void ClickControl(UITestControl controlObject, int offset = 5)
{
    Rectangle clickArea = controlObject.BoundingRectangle;
    Point clickPoint = new Point(clickArea.X + offset, clickArea.Y + offset);
    Mouse.Click(clickPoint);
}

Перейдите в любой элемент управления, где вы получаете правильную ограничительную рамку. Помните, что смещение будет из верхнего левого угла. Обычно 5 хорошо взаимодействует с большинством элементов управления.

Ответ 4

public static void ClickCenterOfAControl(UITestControl control)
{
    Point location = control.BoundingRectangle.Location;
    location.Offset(control.BoundingRectangle.Width / 2, control.BoundingRectangle.Height / 2);
    Mouse.Click(location);
}

Надеюсь, что это сработает

Ответ 5

Если элемент является ссылкой или кнопкой, то он работает с использованием следующей строки кода

Mouse.Click(element);

Но иногда мы можем захотеть щелкнуть теги div или теги span вместо ссылок. Для этого, если место, где щелкнуть, не ясен, также мы получаем этот тип ошибки.

Для этого мы можем использовать следующую строку кода

Mouse.Click(element.BoundingRectangle.Location);