Через devtools нашел объект и получил его xpath,но при запуске автотеста система не видит этот объект.Может кто сталкивался с данной проблемой?

Нравится

3 комментария

Ошибка : no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id='sidebar-item-wrapper-3']"}

Pavel Khamenia, на скриншоте указан элемент @id=sidebar-item-wrapper-2', но в запросе @id=sidebar-item-wrapper-3'

 

также рекомендую искать элемент по data-item-marker, это более надежный вариант поиска элементов в системе Creatio

Показать все комментарии

На примере, обьяснен общий принцип работы с XML в TestComplete (DelphiScript).

Для понимания XML советую предварительно просмотреть:
ru.wikipedia.org/wiki/XML - короткая и понятная статья по XML
www.w3schools.com/xml/ - руководство по XML

К примеру есть XML файл (сохранен по адресу ‘C:\Test.xml’):






Из него необходимо получить значение атрибутов Login, Password, Role.

Для этого необходимо выгрузить XML-файл в объект, понятный для среды разработки, который можно обрабатывать в скрипте.
TestComplete позволяет работать с любыми XML, используя DOM XML (msdn.microsoft.com/ru-ru/library/2bcctyt8.aspx - XML документы и данные).

Пример: Функция загружает указанный XML файл, если структура XML нарушена - выдает сообщение об ошибке XML-парсера, в результате работы функция возвращает объект.

function InitializeXML(APath: WideString): OleVariant;
var File: OleVariant;
 Doc: OleVariant;
 s: OleVariant;
begin
 File := APath;
 Doc := Sys.OleObject('Msxml2.DOMDocument.6.0');
 Doc.async := false;
 Doc.load(File);
 if Doc.parseError.errorCode <> 0 then
  begin
   s := 'Reason:' + #9 + Doc.parseError.reason + #13#10 +
   'Line:' + #9 + VarToStr(Doc.parseError.line) + #13#10 +
   'Pos:' + #9 + VarToStr(Doc.parseError.linePos) + #13#10 +
   'Source:' + #9 + Doc.parseError.srcText;
   Log.Error('Cannot parse the document.', s);
   Exit;
   end;
 Result := Doc;
end;

Для получения данных из XML используем средства DOM XML и XPath.
Для этого необходимо у объекта XML-документа (либо объекта XML-ноды), вызвать функцию selectNodes(), и передать в функцию XPath-запрос.
Пример:

XMLDoc.selectNodes('//User')

Функция selectNodes - возвращает коллекцию объектов, т.е. если даже результат запроса всего одна запись, возвращается коллекция с одним объектом. НЕЛЬЗЯ прямо обращаться к нодам атрибутам, полученным из selectNodes. т.е. выражение XMLDoc.selectNodes('//User').getAttribute('Login') - ошибочно. Правильно будет XMLDoc.selectNodes('//User').item(0).getAttribute('Login');
Чтобы узнать количество элементов (item) коллекции необходимо вызвать свойство length.
Пример: XMLDoc.selectNodes('//User').length - возвращает количество нод User в XML документе.
Для обработки всех элементов коллекции, необходимо пробежаться по каждому из них обращаясь по индексу элемента, причем обработку необходимо проводить в соответствии с возвращаемым типом данных (ноды, атрибуты, текст)

Пример: Получение данных

procedure TestDOMXML();
var XMLDoc: OleVariant;
 i: Integer;
 User: WideString;
 Password: WideString;
 Role: WideString;
begin
 XMLDoc := InitializeXML('C:\Test.xml');
 for i:=0 to XMLDoc.selectNodes('//User').length-1 do
  begin
   User:= XMLDoc.selectNodes('//User/@Login').item(i).text;
   Password:= XMLDoc.selectNodes('//User/@Password').item(i).text;
   Role:= XMLDoc.selectNodes('//User/@Role').item(i).text;
   Log.Message('User: ' + User + ' Password: ' + Password + ' Role: ' + Role);
  end;
end;

возможен другой вариант цикла обработки
for i:=0 to XMLDoc.selectNodes('//User').length-1 do
  begin
   User:= XMLDoc.selectNodes('//User').item(i).getAttribute('Login').text;
   Password:= XMLDoc.selectNodes('//User').item(i).getAttribute('Login').text;
   Role:= XMLDoc.selectNodes('//User').item(i).getAttribute('Login').text;
   Log.Message('User: ' + User + ' Password: ' + Password + ' Role: ' + Role);
  end;

XPath - выражение //User/@Login - выбирает из XML все ноды User, у каждой из них выбирает указанный атрибут (Login, Password, Role). Если запрошенного атрибута нет, то возвращается Null (или если привести к строке '0')

Если есть задача получить ноды, или получить значение атрибута ноды определенного типа, условия фильтрации удобно вмещать в выражение XPath:
Пример: Получить логины пользователей, которые являются администраторами:

//User[@Role='Administrator']/@Login

такое выражение вернет коллекцию логинов пользователей, которые являются администраторами.

Нравится

Поделиться

2 комментария

привет, твоя статья мне очень помогла:) А есть пример как добавлять инфу в хмл? иль хоть линка где рпо это почитать?:)

советую обращаться к первоисточникам MSDN

Показать все комментарии
Публикация

Что такое XPath?

XPath - это синтаксисдля адресации частей XML-документа

XPath - использует пути для адресации элементов XML

XPath - является важнейшей частью стандарта XSLT

XPath - не является XML-форматом

XPath - является стандартом W3C

 

XPath - использует адресные выражения для идентификации узлов в XML-документе. Эти адресные выражения очень похожи на выражения, с которыми вы сталкиваетесь при работе с файловой системой компьютера:

w3schools/xpath/default.asp

 Пример XPath

Empire Burlesque Bob Dylan USA Columbia 10.90 1985 Hide your heart Bonnie Tyler UK CBS Records 9.90 1988 /year>

Это выражение XPath:

catalog/cd/price

определяет элементы price, дочерние относительно элементов cd, подэлементов элемента catalog

Пути адресации XPath

Выражения для Путей Адресации

Имя

Описание

Пример

Результат

/

Дочерний элемент узла

/price

элемент price

//

Узел и его дочерние элементы

//cd

элемент cd и его подэлементы

|

список дочерних элементов

price | title

элемент price и title

Оси

Оси служат для определения набора узлов относительно данного узла.

Имя

Описание

Узел

self

сам узел

 

child

Дочерние узлы

 

parent

Родительский узел

 

descendant

Потомки узла

 

descendant-or-self

Узел и его потомки

 

ancestor

Предки узла

 

ancestor-or-self

Сам узел и его предки

 

following

Все узлы после данного

 

following-sibling

Все узлы этого же уровня после данного

 

preceding

Все узлы перед данным

 

preceding-sibling

Все узлы этого же уровня перед данным

 

attribute

Узлы аттрибутов

 

namespace

Узлы пространства имен

 

 

Предикаты Путей Адресации

Предикаты - это выражения, использующиеся для построения конкретных подмножеств узлов на основе данного.

Предикаты записываются внутри квадратных скобок.

Например, child::price[price=9.90] возвращает множество узлов, где элемент price имеет значение 9.90.

Новое множество узлов содержит все узлы, для которых значение предиката верно.

Сокращения для Путей Адресации

При описании путей адресации могут использоваться сокращения.

Сокращение

Значение

 

child::

@

attribute::

.

self::

..

parent::

//

/descendant-or-self/

число

[position()='значение']

Выражения XPath

Числовые Выражения

Числовые выражения используются для выполнения арифметических операций над числами.

Оператор

Описание

Пример

Результат

+

Сложение

6 + 4

10

-

Вычитание

6 - 4

2

*

Умножение

6 * 4

24

div

Деление

8 div 4

2

mod

Остаток от деления

5 mod 2

1

Замечание: XPath всегда преобразует аргумент в число перед выполнением арифметических операций.

Операции равенства

Операции равенства используются для проверки равенства двух значений.

Оператор

Описание

Пример

Результат

=

Равно

price=9.80

'истина' (если значение price равно 9.80)

!=

Не равно

price!=9.80

'ложь'

 

Проверка по Множеству Узлов

В случае, когда тестовое значение проверяется на равенство по множеству узлов, результатом будет 'истина', если множество узлов содержит какой-либо узел со значением, которое соответствует тестовому значению.

Когда тестовое значение проверяется на неравенство по множеству узлов, результатом будет 'истина', если множество узлов содержит хотя бы один узел со значением, отличным от тестового.

В итоге множество узлов может быть равно и не равно одновременно!!!

Операции Сравнения

Эти операции используются для сравнения двух значений.

Оператор

Описание

Пример

Результат

 

Меньше

price9.80

'ложь' (если price равно 9.80)

=

Меньше или равно

price=9.80

'истина'

Больше

price>9.80

'ложь'

>=

Меньше или равно

price>=9.80

'истина'

Замечание: XPath всегда преобразует каждый аргумент в число перед выполнением сравнения.

Булевы Выражения

Оператор

Описание

Пример

Результат

or

или

price=9.80 or price=9.70

'истина' (если price равно 9.80)

and

и

price=9.80 and price=9.70

 

 

Функции XPath

Библиотека Функций XPath

Библиотека функций XPath включает набор базовых функций для преобразования данных.

Числовые Функции

Имя

Описание

Пример

Результат

round

Округляет до ближайшего целого.

round(3.14)

3

ceiling

Округляет до ближайшего целого, которое больше данного.

ceiling(3.14)

4

floor

Округляет до ближайшего целого, которое меньше данного.

floor(3.14)

3

count

Возвращает количество узлов.

count(nodeset)

количество узлов в множестве узлов

number

Преобразует аргумент в число.

number(price)

Численное значение элемента price

sum

Возвращает сумму списка чисел.

sum(/cd/price)

Суммарная цена всех CD

 

Строковые Функции

Имя

Описание

Пример

Результат

string

Преобразует аргумент в строку.

string(3.14)

'3,14'

string-length

Возвращает длину строки.

string-lenght('Beatles')

7

substring

Возвращает подстроку.

substring('Beatles',1,4)

'Beat'

substring-after

Возвращает остаток строки после второго аргумента.

substring-after('12:30',':')

'30'

substring-before

Возвращает часть строки перед вторым аргументом.

substring-before('12:30',':')

'12'

contains

Возвращает 'истину', если первая строка содержит вторую.

contains('XML','X')

'истина'

starts-with

Возвращает 'истину', если первая строка начинается второй.

starts-with('XML','X')

'истина'

concat

Возвращает конкатенацию двух строк.

concat('The',' ','Beatles')

'The Beatles'

normalize-space

Удаляет лишние пробелы в строке.

normalize-space('  The    Beatles')

'The Beatles'

translate

Заменяет символы в строке.

translate('12:30',':','.')

'12.30'

 

Булевы Функции

Имя

Описание

Пример

Результат

boolean

Преобразует аргумент к булевому типу.

boolean(3.14)

'истина', если price не равен нулю

false

Вовращает 'ложь'.

number(false())

0

true

Возвращает 'истину'.

number(true())

1

not

Возвращает отрицание.

not(false())

'истина'

Источник: www.w3schools.com/XPath/default.asp

Нравится

Поделиться

0 комментариев
Показать все комментарии