Закодированные тесты пользовательского интерфейса не работают

Я пытался ввести дженерики в наш код автоматизации, поэтому я пытаюсь привести WpfControl к универсальному типу T, где T ограничен типом WpfControl.

return control as T;

T всегда будет дочерним элементом WpfControl, но когда я привожу элемент управления типа WpfControl к общему типу, он возвращает null. Я также пытался передать управление точному дочернему типу, например, что-то вроде:

var childControl = control as WpfTabList;

Это по-прежнему возвращает null. Кто-нибудь испытывает подобные проблемы?

См. этот класс WpfControl.


person stephen mulryan    schedule 06.12.2012    source источник
comment
Если все так, как вы описываете, то должно работать. Я подозреваю, что вам чего-то не хватает. Могу предложить вам: а) выполнить отладчик и посмотреть, какой тип управления используется во время выполнения, и б) опубликовать более полный код.   -  person Martin Eden    schedule 31.01.2013
comment
Также проверьте, что элемент управления не равен нулю! Это поймало меня раньше.   -  person Martin Eden    schedule 31.01.2013
comment
где строка, которая вызывает конструктор - можете добавить пожалуйста. (control = new....) вы, вероятно, решите это самостоятельно, когда найдете эту строку;) (но если нет - я все еще здесь)   -  person G.Y    schedule 06.10.2013
comment
вы также должны отображать или регистрировать control.GetType().ToString(), чтобы убедиться, что это именно тот тип, который вы ожидаете...   -  person C.B.    schedule 06.12.2013


Ответы (2)


некоторые рекомендации:

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

public T GetControl<T>(...) where T : WpfControl

в вашем предположении и реализации есть несоответствие, вы пытаетесь сопоставить WpfControl с WpfTabList, что неверно в случаях, когда дочерний элемент управления не является TabList.

person Yaugen Vlasau    schedule 08.01.2014

Это определенно работает. У меня есть целый их набор на моем github.

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

Вот несколько выдержек, чтобы показать, как это может выглядеть.

public static T Find<T>(this UITestControl parent) where T : UITestControl, new()
    {
        return new T() { Container = parent };
    }

public static IEnumerable<T> FindAll<T>(this UITestControl parent) where T : UITestControl, new()
    {
        return parent.Find<T>().FindAllAsType();
    }

private static IEnumerable<T> FindAllAsType<T>(this T current) where T : UITestControl, new()
    {
        if (typeof(T).IsSubclassOf(typeof(HtmlControl)))
        {
            return current.FindMatchingControls().Select(x => new T().ExtendFrom(x));
        }
        return current.FindMatchingControls().OfType<T>();
    }

private static IEnumerable<U> FindAllCastTo<T, U>(this T current) where T : UITestControl
    {
        return current.FindMatchingControls().Cast<U>();
    }

Наиболее вероятным случаем является то, что тип элемента управления не соответствует тому, к которому вы пытаетесь его привести, или имеет значение null.

person MPavlak    schedule 13.05.2016