Robot Framework, использующий FlaUILibraray XPath, не может быть найден

Робот-разработчик, вступающий в мир автоматизации приложений Windows, пишет простую демонстрацию с использованием библиотеки FlaUI.

Test Case FLA
    FlaUILibrary.Launch Application    notepad.exe
    FlaUILibrary.Attach Application By Name    Notepad
    FlaUILibrary.Set Text To Textbox    Name="Text Editor"    Robot Automation POC
    FlaUILibrary.Click    Name=Edit

Не удалось выполнить проверку "Установить текст в текстовое поле": FlaUiError: элемент из XPath 'Name="Text Editor"' не найден

Та же ошибка, когда я использую XPath "AutomationId=15"

Я использую Automation Spy для проверки элементов графического интерфейса. Спасибо.

2 ответа

Спецификация XPath более сложна во FlaUI ...

FlaUILibrary.Set Text To Textbox    /Window[@Name='Untitled - Notepad']/Document[@Name='Text Editor']    Robot Automation POC
FlaUILibrary.Click    /Window[@Name='Untitled - Notepad']/MenuBar/MenuItem[@Name='Edit']

Как цитирует сам г-н Ремер (см. также ссылку ниже его объяснения):

Возвращаемый XPath FlaUInspect не совсем правильный (и далеко не эффективный), это только отправная точка.
Я должен документировать это лучше. чтобы поставить больше фигурных скобок вокруг него. В вашем примере, вероятно: Вместо:/Window/Pane/Pane[1]/Table/Pane[1]/Pane/Pane[1] вы должны использовать:(((/Window/Pane)/Pane[1]/Table)/Pane[1]/Pane)/Pane[1] или что-то в этом роде. > Синтаксис XPath не так прост в использовании.[https://github.com/FlaUI/FlaUI/issues/195#issuecomment-443718720]

Вчера я придумал это быстрое решение, которое вовсе не является пуленепробиваемым, но, по крайней мере, дает вам возможность использовать такие пути, как:

/Custom/Custom/Custom/Text или /Custom/Custom/Text[0] и т. д.

          public static AutomationElement GetElementByXPath(string xPath)
    {
        AutomationElement automationElement = ExtendedFramework.window.FindFirstByXPath("/"); //Find top Element
        //string xpath1 = FlaUI.Core.Debug.GetXPathToElement(ExtendedFramework.window);

        string elementPattern = "/";

        string[] getElements = Regex.Split(xPath, elementPattern, RegexOptions.IgnoreCase);
        foreach(string element in getElements)
        {
            if (string.IsNullOrEmpty(element)) continue;
            string elementSplitPattern = @"(\[\d\])";
            string[] elements = Regex.Split(element, elementSplitPattern);
            AutomationElement[] automationElements = automationElement.FindAllChildren().Where(x=>x.ControlType.ToString() == elements[0]).ToArray();
            if (elements.Length > 1)
            {
                int index = int.Parse(elements[1].Trim(']').Trim('['));
                automationElement = automationElements[index];
            }
            else
            {
                automationElement = automationElements[0];
            }
        }

        return automationElement;
    }

Я поместил это в расширение в свою структуру, и пока это работает как шарм. И даже добавление чего-то вроде дополнительных свойств в скобках не должно иметь большого значения.

как в комментарии здесь раньше было замечено: TypeOfElementName[@Name='Untitled - Notepad']

и т. д.

PS: Если что-то по-прежнему не так (прямо сейчас там нет реальной проверки ошибок), не стесняйтесь указывать на это. Я обновлю здесь, когда это будет иметь смысл. И его можно было бы легко превратить в «каркас» процессора XPath, соответственно класс для FlaUI, пока не появится интегрированное в фреймворк решение.

Другие вопросы по тегам