Иногда возникает необходимость вызвать метод или обратиться к какому-то свойству нескольких элементов управления в цикле, однако при этом данное свойство или метод присутствуют не у всех элементов. Для решения подобной задачи лучше всего подходит метод aqObject.IsSupported.
Предположим, мы получили все дочерние объекты приложения Calculator Plus и хотим вывести в лог значения свойства wText каждого из них. Наш скрипт будет выглядеть примерно так:
function testIsSupported()
{
var pCalc = Sys.Process('CalcPlus');
var wCalc = pCalc.Window('SciCalc', '*');
var children = wCalc.FindAllChildren('Name', '*');
children = VBArray(children).toArray();
for(var idx in children)
{
Log.Message(children[idx].wText);
}
}
В результате в логе мы увидим кучу ошибок, так как свойство wText определено только для текстового поля.

Теперь немного изменим наш цикл таким образом, чтобы проверять доступность свойства wText перед тем, как обращаться к нему:
for(var idx in children)
{
if(aqObject.IsSupported(children[idx], 'wText'))
{
Log.Message(children[idx].wText);
}
}
Метод aqObject.IsSupported принимает 2 параметра:
- объект, для которого будет выполнена проверка
- имя свойства или метода (строка)
и возвращает true или false.
Если теперь запустить этот код, то в логе у нас не будет ни одной ошибки.
Стоит отметить, что в подобных случаях (когда мы программно отсеиваем какие-то объекты) имеет смысл помещать в лог информацию о том, какие именно объекты были пропущены, так как в случае возникновения ошибок в дальнейшей работе теста может оказаться, что какие-то элементы были отсеяны, хотя не должны были (это может быть ошибкой приложения или нашего скрипта). То есть по логам мы должны иметь возможность точно восстановить логику работы скрипта. Для этого изменим нашу функцию следующим образом (здесь приведена только та часть, которая была изменена, первые 4 строки остаются неизменными):
var skipped = '';
for(var idx in children)
{
if(aqObject.IsSupported(children[idx], 'wText'))
{
Log.Message(children[idx].wText);
}
else
{
skipped += children[idx].FullName + '\n';
}
}
if(skipped.length > 0)
{
Log.Message('List of the skipped controls', skipped);
}
В результате работы получившейся функции мы получим лог без ошибок, в котором в том числе будет приведен список всех пропущенных элементов управления:

Аналогичным образом выполняется проверка доступности у объекта методов.