Получить все ‹td› заголовок столбца таблицы с закодированным пользовательским интерфейсом

Мне нужно проверить функцию фильтра на столе.

Этот фильтр находится только в первой ячейке каждой строки, и я пытаюсь понять, как получить все эти значения...

Я пробовал что-то вроде

public bool CheckSearchResults(HtmlControl GridTable, string FilterTxt)
{
    List<string> Elements = new List<string>();

    foreach (HtmlCell cell in GridTable.GetChildren())
    {
        Elements.Add(cell.FilterProperties["title"]);
    }
    List<string> Results = Elements.FindAll(l => l.Contains(FilterTxt));
    return Results.Count == Elements.Count;
}

но я застреваю в цикле foreach ... может быть, есть простой способ с linq, но я не так много знаю об этом


редактировать: все ячейки, которые мне нужны, имеют один и тот же пользовательский тег html.

с этим кодом я должен получить их все, но я не знаю, как повторить

HtmlDocument Document = this.UIPageWindow.UIPageDocument;
HtmlControl GridTable = this.UIPageWindow.UIPageDocument.UIPageGridTable;
HtmlCell Cells = new HtmlCell(GridTable);
Cells.FilterProperties["custom_control"] = "firstCellOfRow";

также потому, что нет функции GetEnumerator или моделей запросов для объектов HtmlCell, которые являются частью библиотеки Microsoft.VisualStudio.TestTools.UITesting.HtmlControl -.-


edit2: я нашел эта статья и я попробовал это

public bool CheckSearchResults(string FilterTxt)
{
    HtmlDocument Document = this.UIPageWindow.UIPageDocument;
    HtmlControl GridTable = this.UIPageWindow.UIPageDocument.UIPageGridTable;

    HtmlRow rows = new HtmlRow(GridTable);
    rows.SearchProperties[HtmlRow.PropertyNames.Class] = "ui-widget-content jqgrow ui-row-ltr";

    HtmlControl cells = new HtmlControl(rows);
    cells.SearchProperties["custom_control"] = "firstCellOfRow";

    UITestControlCollection collection = cells.FindMatchingControls();

    List<string> Elements = new List<string>();

    foreach (UITestControl elem in collection)
    {
        HtmlCell cell = (HtmlCell)elem;
        Elements.Add(cell.GetProperty("Title").ToString());
    }
    List<string> Results = Elements.FindAll(l => l.Contains(FilterTxt));
    return Results.Count == Elements.Count;
}

но я получаю пустую коллекцию...


person Doc    schedule 03.02.2014    source источник


Ответы (2)


Попробуйте Cell.Title или Cell.GetProperty("Title"). SearchProperties и FilterProperties предназначены только для поиска элемента пользовательского интерфейса. Они либо приходят из UIMap, либо из кода, если вы заполняете их вручную. В противном случае ваш код должен работать.

Или вы можете использовать запрос LINQ (?), например:

var FilteredElements = 
    from Cell in UIMap...GridTable.GetChildren()
    where Cell.GetProperty("Title").ToString().Contains(FilterTxt)
    select Cell;

Вы также можете попытаться записать ячейку, добавить ее в UIMap, установить ее свойства поиска или фильтра в соответствии с вашей фильтрацией, затем вызвать UIMap...Cell.FindMatchingControls(), и он должен вернуть все совпадающие ячейки.


Проблема сейчас в том, что вы ограничиваете поиск одной строкой таблицы. HtmlControl cells = new HtmlControl(rows); здесь параметр конструктора задает контейнер ограничения поиска, а не прямой родительский элемент управления. Это должен быть GridTable, если вы хотите искать все ячейки в таблице. Лучшим решением было бы использовать рекордер для получения элемента управления ячейкой, а затем изменить его свойства поиска и фильтрации в UIMap, чтобы они соответствовали всем ячейкам, которые вы ищете. Хотя, на мой взгляд, вы должны придерживаться фильтрации с ручным кодированием. Что-то типа:

foreach(var row in GridTable.GetChildren())
{
    foreach(var cell in row.GetChildren())
    {
        //filter cell here
    }
}

Проверьте с помощью AccExplorer или регистратора правильность иерархии. Вы также должны использовать отладку, чтобы убедиться, что циклы получают правильные элементы управления, и увидеть свойства ячеек, чтобы вы знали, верна ли функция фильтра.

person kida    schedule 03.02.2014
comment
нет, не работает никак :( я отредактировал вопрос - person Doc; 03.02.2014
comment
Посмотрел отредактированный пост. HtmlCell и практически каждый класс UIControl, который использует CUIT, представляет ОДИН элемент пользовательского интерфейса. Если вы хотите получить все ячейки, которые соответствуют установленным вами критериям, вы должны использовать функцию FindMatchingControlls вашего класса ячеек (как упоминалось выше). Если это не работает, это означает, что вам придется возиться со свойствами поиска и свойствами фильтра вашего элемента управления. - person kida; 03.02.2014
comment
я пробовал FindMatchingControls безуспешно... я снова отредактировал вопрос, добавив больше деталей - person Doc; 04.02.2014
comment
Ммм, я вижу, что вы пытаетесь сделать, но это не совсем правильно :С. Вы ограничиваете поиск одной строкой, что не очень хорошо, если вы хотите получить все ячейки таблицы. И вы должны поместить всю свою фильтрацию в свойства поиска/фильтрации ячейки, чтобы функция FindMatchingControls получала все нужные вам ячейки. В любом случае отредактировал мой пост с возможным решением. - person kida; 04.02.2014
comment
Я пробовал все ваши предложения, но ничего не работает. (Рекордер довольно бесполезен) Я написал функцию для получения заголовков td путем очистки страниц html. Глупый закодированный интерфейс :D - person Doc; 04.02.2014

Я решил очистить страницы html самостоятельно

static public List<string> GetTdTitles(string htmlCode, string TdSearchPattern)
{
    HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
    doc.LoadHtml(htmlCode);
    HtmlNodeCollection collection = doc.DocumentNode.SelectNodes("//td[@" + TdSearchPattern + "]");
    List<string> Results = new List<string>();
    foreach (HtmlNode node in collection)
    {
        Results.Add(node.InnerText);
    }

    return Results;
}

Я чертовски ненавижу эти дурацкие закодированные тесты пользовательского интерфейса -.-

кстати, спасибо за помощь

person Doc    schedule 04.02.2014