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

Мой пользовательский элемент управления 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 && 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());
}

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

enter image description here

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

...