Понимание функции оценки в CasperJS

Я хочу понять, в каком случае я должен или должен использовать функцию evaluate .

Я прочитал документ API о функции evaluate CasperJS, но я не уверен, в этом случае я должен использовать эту функцию. И что означает контекст DOM? Может ли кто-нибудь привести пример?

В документации CasperJS есть довольно хорошее описание того, что casper.evaluate() .

Напомним: вы передаете функцию, которая будет выполняться в контексте DOM (вы также можете назвать ее контекстом страницы). Вы можете передать некоторые примитивы в качестве аргументов этой функции и вернуть один примитив обратно. Имейте в виду, что эта функция, которую вы передаете для evaluate должна быть автономной. Он не может использовать переменные или функции, определенные вне этой функции.


CasperJS предоставляет множество хороших функций для повседневных задач, но вы можете столкнуться с ситуацией, когда вам нужна настраиваемая функция для чего-то. evaluate в основном там, чтобы сделать

  1. Получите некоторое значение со страницы, чтобы принять меры на основе этого в вашем скрипте
  2. Манипулировать страницу каким-либо образом, кроме нажатия или заполнения формы
  3. Комбинации точек 1 и 2.

Примеры

Вам может понадобиться универсальная функция, чтобы получить checked свойство из флажка. В настоящее время CasperJS предоставляет только функцию getElementAttribute которая не будет работать в этом случае.

 function getChecked(cssSelector){ return document.querySelector(cssSelector).checked; } if (casper.evaluate(getChecked, selector)){ // do something } else { // do something else } 

В большинстве случаев это просто предпочтение тому, что вы хотите использовать. Если у вас есть список пользователей с data-uid для каждого элемента li вас есть как минимум 2 возможности для получения uids.

Casper-только:

 var uids = casper.getElementsAttribute('ul#user-list > li', 'data-uid'); 

Casper-Оценка:

 var uids = casper.evaluate(function(){ return Array.prototype.map.call(document.querySelectorAll('ul#user-list > li'), function(li){ return li["data-uid"]}); }); 

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

Удалить элементы:

 function removeSelector(cssSelector){ var elements = document.querySelectorAll(cssSelector); Array.prototype.forEach.call(elements, function(el){ el.parent.removeChild(el); }); } casper.evaluate(removeSelector, '.ad'); // if it would be that easy :) 

Изменение внешнего вида сайта через CSS:

 function applyCSS(yourCss){ var style = document.createElement("style"); style.innerHTML = yourCss; document.head.appendChild(style); } casper.evaluate(applyCSS, 'body { background-color: black; }'); // non-sense 

Корнеплоды

CasperJS построен поверх PhantomJS и, таким образом, наследует некоторые из своих причуд. Документация PhantomJS для page.evaluate() говорит следующее:

Примечание . Аргументы и возвращаемое значение функции evaluate должны быть простым примитивным объектом. Эмпирическое правило: если оно может быть сериализовано через JSON, тогда это нормально.

Замыкания, функции, узлы DOM и т. Д. Не будут работать!

Interesting Posts

Я хочу разрешить недействительные SSL-сертификаты с помощью AFNetworking

Truecrypt + Windows 7 100MB раздел поврежден

Как подавить определенное предупреждение MSBuild

Авторизация Twitter API не выполняет предварительный просмотр CORS в браузере

Почему ExitProcess необходим под Win32, когда вы можете использовать RET?

Карта Java со значениями, ограниченными параметром типа ключа

Как установить порядок банок в WebLogic?

Как работает JSF 2 ConversationScope?

Что делает оператор infix в Haskell?

Как остановить работу операционной системы Windows от использования моей квоты пропускной способности?

Android, как определить элемент в списке с помощью флажка

Работа с базой данных Access на Python на платформе, отличной от Windows (Linux или Mac)

Определение глобальной переменной для Browserify

Java: Как я могу получить доступ к полю classа по имени, хранящемуся в переменной?

Как добавить TextView в LinearLayout динамически в Android?

Давайте будем гением компьютера.