Команды‎ > ‎

EVAL

Отправлено 25 мая 2020 г., 14:57 пользователем Норрин Радд   [ обновлено 25 мая 2020 г., 20:31 ]

Команда iMacros EVAL

Команда EVAL позволяет использовать возможности JavaScript в работе iim макроса. Также команда может быть использована для простого анализа и обработки извлеченных данных.

Чаще всего к данной команде обращаются, когда использование встроенного функционала iMacros проще, чем написание кода на js или использование чистого js невозможно, но в целом на JS можно реализовать более сложные проекты.

Примеры использования:

  • Определить, если дата «старше 40 дней»;
  • Сравнить, например, обменный курс выше/ниже определенного значения;
  • Сделать небольшие преобразования строки. Извлеченный текст следующий: «US$33.33», можно удалить «US$» и получить только число перед сохранением с помощью SAVEAS TYPE=EXTRACT.

Работает в: iMacros Browser icon Internet Explorer icon Mozilla Firefox icon Google Chorme icon

Синтаксис:

SET !VAR1 EVAL("[JavaScript код]")
TAG ... CONTENT=EVAL("[JavaScript код]")

Доступен начиная с iMacros V7.5 и более поздних, дополнение iMacros для Firefox 7.4.0.1 и выше.

Параметры:

  • Строка в двойных кавычках содержит JavaScript код для выполнения.
  • Функция MacroError (errorMsg). Кроме стандартных JavaScript функций (в IE и iMacros Browser, JScript 8.0), команда EVAL имеет встроенную функцию вывода ошибок: MacroError(). MacroError принимает значение в качестве аргумента и, если выдает ошибку и iMacros error -1340, где текст ошибки является аргумент строки errorMsg. Используйте эту функцию, если вы хотите условно остановить макрос, как это делается в примере 3 ниже.

Примечания:

  • Необходимо явно вернуть окончательное значение, объявив его в конце JavaScript.
    Правильно:
    SET myVal EVAL("var x = 1; x;")
    'myVal = 1

    Неправильно:

    SET myVal EVAL("var x = 1;")
    'myVal = null
  • Можно вызвать специальную функцию MacroError (errorMsg) в Javascript, чтобы cгенерировать iMacros ошибку.
  • В спец символах нужно дублировать обратный слеш, например, \d правильно записать \\d.
  • Двойные кавычки должны быть экранированы, внешние кавычки не экранируются, так как содержат в себе Javascript код.
  • EVAL в iMacros Browser и плагине для IE использует Microsoft’s JScript 8.0 JScript .NET, framework version 3.5), есть ограничения безопасности. Как следствие, методы DOM/GUI как «compatMode()» или «alert()» не доступны. Для DOM/GUI доступа можно использовать URL GOTO с Javascript кодом (возможно данная проблема уже исправлена разработчиками).
  • iMacros для Firefox’s EVAL использует javascript встроенный в Firefox.

Примеры:

1. Случайное время задержки. Подождать случайно выбранное время (от 1 до 10 секунд), после загрузки страницы:

SET !VAR1 EVAL("var randomNumber=Math.floor(Math.random()*10 + 1); randomNumber;")
URL GOTO=http://imacroshelp.ru
' ждать от 1 до 10 секунд
WAIT SECONDS={{!VAR1}}

2. Сгенерировать случайное число в определенном диапазона:

SET randomNumber EVAL("var min = 50; var max = 100; var randomNumber = Math.floor(Math.random() * (max - min + 1)) + min; randomNumber;")

3. Получение и сравнение валют. Сохранить результат.

Сохранить EUR-ставку в долларах USD, только если она выше определенного порога (1.3 USD). Если ставка ниже, остановить макрос и выдать сообщение об ошибке:

URL GOTO=http://www.xe.com/ucc/convert/?Amount=1&From=EUR&To=USD
SET !EXTRACT_TEST_POPUP NO
TAG POS=1 TYPE=TD ATTR=TXT:*<SP>USD&&WIDTH:46%&&ALIGN:left EXTRACT=TXT
SET !VAR1 EVAL("var s = \"{{!EXTRACT}}\"; s.replace(\"USD\",\"\"); var d = parseFloat(s); if(d < 1.3){MacroError(\"Euro меньше 1.3 USD.\");} else {d};")
SET !EXTRACT NULL
SET !EXTRACT {{!VAR1}}
SAVEAS TYPE=EXTRACT FOLDER=* FILE=EuroRate.csv

4. Получение и сравнение даты/времени.

Проверить: последнее сообщение старше нескольких часов (12 часов):

CLEAR
URL GOTO=http://www.readwriteweb.com/
SET !EXTRACT_TEST_POPUP NO
TAG POS=1 TYPE=DIV ATTR=CLASS:submeta EXTRACT=TXT
SET !VAR1 EVAL("var h = 12; var s = \"{{!EXTRACT}}\"; var re = /\\w+\\s\\d{1,2},\\s\\d{4}\\s+\\d{1,2}\\:\\d{2}\\s[A|P]M/; var postDateStr = re.exec(s); var today = new Date(); var postAge = today.getTime() - Date.parse(postDateStr); var hInMilli = h*60*60*1000; if(postAge > hInMilli){MacroError(\"Сообщение старше 12 часов\");}")

5. Получить вчерашнюю дату.

Ввести текст с вчерашней датой в ISO-формате (гггг-мм-дд), месяц меняется, високосный год, и так далее. Для сегодняшней даты можно использовать команду !NOW, но ее не получится преобразовать чтобы получить вчерашнее число, EVAL решает эту проблему:

... CONTENT=EVAL("var d = new Date(); d.setDate(d.getDate() - 1); var year = d.getFullYear(); var month = d.getMonth() + 1; var day = d.getDate(); year + '-' + month + '-' + day;")

6. Получить завтрашнюю дату.

Создайте переменную с завтрашней датой в формате дд/мм/гггг:

SET tomorrow EVAL("var today = new Date(); var tomorrow = new Date(); tomorrow.setDate(today.getDate() + 1); var day = tomorrow.getDate().toString(); if (day.length < 2) {day = \"0\" + day;} var month = (tomorrow.getMonth() + 1).toString(); if (month.length < 2) {month = \"0\" + month;} var year = tomorrow.getFullYear().toString(); var dateString = day + \"/\" + month + \"/\" + year; dateString;")
PROMPT {{tomorrow}}

7. Редактировать извлеченный текст.

Преобразование текста в строку верхнего регистра:

VERSION BUILD=7400919 RECORDER=FX
TAB T=1
URL GOTO=http://android-developers.blogspot.com/2011/09/preparing-for-handsets.html
SET !EXTRACT_TEST_POPUP NO
TAG POS=1 TYPE=P ATTR=TXT:Early<SP>this<SP>year,* EXTRACT=TXT
SET !VAR1 EVAL("var s=\"{{!EXTRACT}}\"; s.toUpperCase()")
PROMPT {{!VAR1}}

Удалить первые и последние пробелы:

SET !EXTRACT "    Эта строка имеет в начале и в конце пробелы     "
' Отображается значение в кавычках со всеми пробелами
PROMPT {{!EXTRACT}}
SET trimmedValue EVAL("\"{{!EXTRACT}}\".replace(/^\\s*|\\s*$/g, \"\");")
PROMPT "{{trimmedValue}} - без пробелов!"

8. DemoEval.iim:

URL GOTO=http://www.iopus.com/imacros/demo/v7/eval.htm
SET !VAR1 EVAL("Math.floor(Math.random()*5 + 1);")
WAIT SECONDS={{!VAR1}}
SET !EXTRACT_TEST_POPUP NO
TAG POS=1 TYPE=B ATTR=TXT:* EXTRACT=TXT
SET !VAR2 EVAL("var h = 20; var s = \"{{!EXTRACT}}\"; var today = new Date(); var postAge = today.getTime() - Date.parse(s); var hInMilli = h*60*60*1000; if(postAge > hInMilli){MacroError(\"Разница во времени более 20 часов\");}else null")
SET !EXTRACT NULL
TAG POS=1 TYPE=INPUT:TEXT FORM=ID:form1 ATTR=NAME:textfield EXTRACT=TXT
SET !VAR2 EVAL("var s=\"{{!EXTRACT}}\"; var d = parseFloat(s); if((d > 99)&&(d < 101))d; else MacroError(\"Значение не в заданных пределах\");")


 

Comments