Драйвер Winium идентифицирует внутренние элементы управления WPF только в том случае, inspect.exe открыт, в противном случае он выдает исключение «Элемент не найден»

#wpf #automation #ui-automation #winium #automationpeer

#wpf #автоматизация #пользовательский интерфейс-автоматизация #winium #automationpeer

Вопрос:

Мой пользовательский элемент управления WPF имеет внутренние элементы. В моем случае моим пользовательским элементом управления является сетка, а внутренними элементами являются ячейки. Вы можете найти реализацию AutomationPeer ниже,

 public class GridAutomationPeer : FrameworkElementAutomationPeer, IGridProvider
{
      public virtual GridModel Model
        {
            get
            {
                var grid = this.Owner as GridBase;
                return grid.Model;
            }
        }
protected override AutomationControlType GetAutomationControlTypeCore()
        {
            return AutomationControlType.DataGrid;
        }

        protected override string GetClassNameCore()
        {
            return this.Owner.GetType().Name;
        }
protected override List<AutomationPeer> GetChildrenCore()
        {
            var peers = new List<AutomationPeer>();
            foreach (var kvp in this.cellPeers)
            {
                peers.Add(kvp.Value);
            }
            return peers;
        }
public override object GetPattern(PatternInterface patternInterface)
        {
            switch (patternInterface)
            {
                case PatternInterface.Grid:
                case PatternInterface.Selection:
                case PatternInterface.Table:
                    return this;

            return base.GetPattern(patternInterface);
        }
}
     int IGridProvider.ColumnCount
        {
            get
            {
                return this.Model.ColumnCount;
            }
        }

IRawElementProviderSimple IGridProvider.GetItem(int row, int column)
        {
            if (row < this.Model.RowCount amp;amp; column < this.Model.ColumnCount)
            {
                var cellPeer = this.GetOrCreateCellPeer(row, column);
                if (cellPeer != null)
                {
                    var item = this.ProviderFromPeer(cellPeer);
                    return item;
                }
            }
            return null;
        }
int IGridProvider.RowCount
        {
            get
            {
                return this.Model.RowCount;
            }
        }
}
  

Моя проблема в том, что он правильно распознается в тестовом скрипте Winium, только если inspect.exe открыт. Если inspect.exe не открывается, Winium выдает исключение «Элемент не найден».

Ниже приведен мой тестовый скрипт,

 
try
{
    var grid = driver.FindElementById("grid");
    var cell = grid.FindElement(By.Id("6,1"));
    if (cell.Text != "Movie Poster")
        Assert.Fail("Cell value is not Movie Poster");
    driver.Close();
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message.ToString());
}
  

Сведения об исключении,

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

Пожалуйста, предложите мне какое-либо решение для этого.

Комментарии:

1. Всем привет, есть ли какое-либо решение?