Как правильно объявить переменные класса (элементы управления CUIT) - PullRequest
0 голосов
/ 11 января 2019

Я настраиваю кодированные тесты пользовательского интерфейса для приложения WPF и хочу использовать подход с кодом, а не метод записи и генерации кода. Я хотел бы использовать объекты страницы с помощью кода, и мне нужно объявить переменные управления (кнопки, вкладки и т. Д.) В объектах страницы, которые будут использоваться несколькими функциями.

Я попытался объявить переменную в классе и добавить свойства в конструктор (pendingButton1) и создание функции, которая возвращает управление и присваивание переменной в классе (pendingButton2), но ни одна из них не работает.

Это работает, когда я объявляю переменную (или создаю переменную по функции) внутри функции, в которой я хочу использовать переменную (pendingButton3 и 4).

public partial class Press : Header
{
    WpfToggleButton pendingButton1 = new WpfToggleButton(_wpfWindow);
    WpfToggleButton pendingButton2 = Controls.Press.getPendingButton(_wpfWindow);

    public Press(WpfWindow wpfWindow):base(wpfWindow)
    {
        this.pendingButton1.SearchProperties[WpfControl.PropertyNames.AutomationId] = "Tab1Button";
    }

    public void clickPendingButton() {
        WpfToggleButton pendingButton3 = new WpfToggleButton(_wpfWindow);
        pendingButton3.SearchProperties[WpfControl.PropertyNames.AutomationId] = "Tab1Button";

        WpfToggleButton pendingButton4 = Controls.Press.getPendingButton(_wpfWindow);

        Mouse.Click(pendingButton1); //UITestControlNotFoundException
        Mouse.Click(pendingButton2); //UITestControlNotFoundException
        Mouse.Click(pendingButton3); //This works
        Mouse.Click(pendingButton4); //This works
    }
}

Я бы хотел, чтобы это работало, когда я объявляю pendingButton вне функции clickPendingButton (), поскольку она используется во многих других функциях.

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Вспомогательная функция Controls.getWpfButton () возвращает только свойства кнопки, а не «реальной» кнопки. Он должен использоваться в конструкторе, а затем может использоваться в любом месте класса. Я бы не сказал, что это лучшая практика, но она работает для меня.

Press.cs

public partial class Press : SharedElements
    {
        private WpfButton pendingButton;

    public Press(WpfWindow wpfWindow):base(wpfWindow)
        {
            pendingTab = Controls.getWpfButton(_wpfWindow, "Tab1Button");
        }

    public void clickPendingButton() {
        Mouse.Click(pendingButton);
    }
}

Controls.cs

internal static WpfButton getWpfButton(WpfWindow wpfWindow, string AutomationId)
    {
        WpfButton button = new WpfButton(wpfWindow);
        button.SearchProperties[WpfControl.PropertyNames.AutomationId] = AutomationId;
        return button;
    }
0 голосов
/ 12 января 2019

То, что вы хотите, похоже, представляет собой именно тот код сортировки, который генерирует инструмент Coded UI для записи и создания. Он создает множество фрагментов кода со структурой следующего стиля:

public WpfToggleButton PendingButton
{
    get
    {
        if ((this.mPendingButton == null))
        {
            this.mPendingButton = new WpfToggleButton( ... as needed ...);
            this.mPendingButton.SearchProperties[ ... as needed ...] = ... as needed ...;
        }

        return this.mPendingButton;
    }
}

private WpfToggleButton mPendingButton;

Этот код объявляет кнопку как свойство класса PendingButton с частным вспомогательным полем, которое имеет начальное значение по умолчанию null. При первом использовании этого свойства код get выполняет требуемый поиск и сохраняет найденный элемент управления в приватном поле. Это значение затем возвращается при каждом последующем использовании свойства. Обратите внимание, что присвоение null вспомогательному полю может быть выполнено, чтобы вызвать новый поиск, как показано в этого Q & A .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...