Числовое текстовое поле Управление UpDown Доступ к AutomationID с WinAppDriver - PullRequest
0 голосов
/ 30 октября 2019

Я тестировал настольное приложение (WPF). в использовании: C #, Appium, WinAppDriver. В одном меню есть несколько числовых текстовых полей. У меня проблема в том, что я не могу получить доступ к кнопке UpButton определенного текстового поля на этой странице, так как все кнопки вверх / вниз имеют одинаковый идентификатор, "PART_IncreaseButton".

Это числовое текстовое поле со встроенным управлением вверх-вниз. В одном меню их несколько. textbox

Я использую inspect.exe для идентификации объекта. Дерево в инспекторе: просмотр скриншота

Таким образом, под обычным находятся 3 элемента управления текстового поля «редактировать», «кнопка», «кнопка» с «Root_0_Blue_AutomationId» Iможет получить доступ к текстовому полю и, например, записать что-нибудь в поле.

Но если я осматриваю кнопку вверх определенного текстового поля, оно имеет ID автоматизации "Part_IncreaseButton" . и элементы управления других текстовых полей имеют тот же идентификатор. Только AutomationID rootID отличается, и идентификатор элементов управления остается неизменным, например:

Root ID (из текстового поля): "Root_0_Blue_AutomationId" UpControl ID: "Part_Increasebutton"

Идентификатор корня (второе текстовое поле, зеленый канал отличается): "Root_0_Green_AutomationId" Идентификатор UpControl: "Part_Increasebutton"

Как мне управлять им для доступа к UpControl второго текстового поля?

Ответы [ 3 ]

1 голос
/ 05 ноября 2019

Большое спасибо за поддержку.

Я сделал это следующим образом (2 шага):

Сначала найдите родительский элемент:

WindowsElementTB1 = Editor.FindElementByAccessibilityId ("Root_0_Blue_AutomationId");

, а затем найдите другие элементы управления:

AppiumWebElement TB1UpControl = TB1.FindElementByAccessibilityIreton * 101_BB) (PART ") 101B"

Нажмите UpControl:

Построитель действий = новые действия (редактор);

builder.Click (TB1UpControl) .Perform ();

С уважением!

1 голос
/ 31 октября 2019

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

Когда это происходит, для идентификации и определения местоположения отдельных элементов можно сделать 3 вещи.

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

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

0 голосов
/ 05 ноября 2019

Вот моя реализация. Я не добавил обработку ошибок для простоты. Код компилируется, но я не проверял это. Кнопки вверх / вниз и текстовое поле содержатся в объекте, поэтому он приятно отделен от вашего другого кода.

using OpenQA.Selenium.Appium;
using OpenQA.Selenium.Appium.Windows;
using System.Collections.ObjectModel;
using System.Linq;

namespace Example
{
    class SpinControl
    {
        public int Value {
            get
            {
                //call _textBox here to get the value from your control.
                return 0;
            }
        }

    private readonly AppiumWebElement _increaseButton;
    private readonly AppiumWebElement _decreaseButton;
    private readonly AppiumWebElement _textBox;

    public SpinControl(string automationID, WindowsDriver<WindowsElement> Driver)
    {
        WindowsElement customControl = Driver.FindElementByAccessibilityId(automationID);
        ReadOnlyCollection<AppiumWebElement> customControlChildren = customControl.FindElementsByXPath(".//*");

        _increaseButton = customControlChildren.First(e => e.FindElementByAccessibilityId("Part_IncreaseButton").Id == "Part_IncreaseButton");
        _decreaseButton = customControlChildren.First(e => e.FindElementByAccessibilityId("Part_DecreaseButton").Id == "Part_DecreaseButton");
        _textBox = customControlChildren.First(e => e != _increaseButton && e != _decreaseButton);
    }

    public void Increase()
    {
        //call _increaseButton here
    }

    public void Decrease()
    {
        //call _decreaseButton here
    }

    public void Input(int number)
    {
        //call _textBox here
    }
}

}

Может использоваться следующим образом:

        SpinControl sp = new SpinControl("customControlAutomationID", Driver);

        sp.Increase();
        sp.Decrease();
        sp.Input(5);
        int value = sp.Value;
...