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, пока не появится интегрированное в фреймворк решение.