PhantomJs щелкает ссылки или запускает функции на странице

Я только привыкаю к ​​PhantomJs, и пока это действительно круто.

Я пытаюсь просканировать сайт и получить данные о продуктах на сайте. Каждая страница продукта загружается с видимым цветом продукта по умолчанию. Когда вы нажимаете на образец цвета, он заменяет новый цвет, запуская функцию. Каждый кликабельный элемент образца цвета выглядит следующим образом:

<input type="image" id="swatch_0" onclick="pPage.getColor(0);" src="http://www.site.com/img50067.jpg">

getColor обновляет миниатюру и цену для этого цвета. Идентификатор увеличивается для каждого доступного цвета (swatch_0, swatch_1 и т. д.), а также увеличивается аргумент, передаваемый в getColor. Я хочу перебирать каждый цвет с помощью PhantomJ и извлекать соответствующие данные для каждого.

Я загрузил страницу, загрузил jQuery и могу получить данные для изначально загруженного цвета, но, похоже, ничто не позволяет мне выполнять события щелчка.

вот что я пытаюсь:

page.evalaute(function){
  var selection = $('#confirmText').text(); // name of the color
  var price = $('#priceText').text();       // price for that color

  console.log('Price is: ' + price);
  console.log('Selection is: ' + selection);
  console.log($('#swatch_1'));

  $('#swatch_1').trigger("click");

  selection = $('#selectionConfirmText').text();
  price = $('#priceText').text();
  console.log('Price is: ' + price);
  console.log('Selection is: ' + selection);

}

Это дает мне:

console> Price is: $19.95
console> Selection is: blue
console> [Object Object]
console> TypeError: 'undefined' is not and object  // repeating until I manually exit

никакой другой код не запускается. Я также пытался запустить событие без jQuery следующим образом:

var evt = document.createEvent("MouseEvents");
evt.initMouseEvent("click", true, true, window,
0, 0, 0, 0, 0, false, false, false, false, 0, null);
var cb = document.getElementById("swatch_1"); 
cb.dispatchEvent(evt);

И запуск функции напрямую:

pPage.getColor(1);

И я получаю тот же результат. Любая помощь приветствуется.


person Jeff Ryan    schedule 16.03.2012    source источник


Ответы (2)


Если обработчик onclick указан непосредственно в HTML, как у вас здесь, вы можете вызвать его напрямую с помощью Javascript:

$(function() {
    $('#swatch_0')[0].onclick(); 
});

Я считаю, что вы также можете использовать page метод sendEvent() PhantomJS для создания собственного события клика. Но похоже, что это немного сложно, так как вам нужно вызывать это из контекста PhantomJS с положением мыши x,y. Непроверенный код:

var elementOffset = page.evaluate(function() {
   return $('#swatch_1').offset(); 
});
page.sendEvent('click', elementOffset.left + 1, elementOffset.top + 1);
person nrabinowitz    schedule 20.03.2012
comment
Вы уверены, что onClick является событием jQuery? Я не могу найти документацию об этом. Насколько я понимаю, .click() привяжет событие к элементу, но вам все равно придется щелкнуть по нему. Я не пробовал sendEvent. Это выглядит многообещающе. Для этого конкретного проекта я решил пойти другим путем. Я использую iMacros для очистки данных страницы. Он использует настоящий браузер, поэтому Ajax и Javascript не проблема. Спасибо! - person Jeff Ryan; 21.03.2012
comment
onclick не является событием jQuery — это собственный метод элемента DOM (поэтому в моем примере используется $(...)[0].onclick[0] получает фактический элемент DOM, а не объект jQuery). Во многих случаях это не сработает, но сработает, если в HTML-разметку включено onclick. - person nrabinowitz; 21.03.2012
comment
Кстати, вы также можете рассмотреть Selenium для такого рода парсинга на основе браузера. Это неплохо, также использует настоящий браузер и имеет привязки для кучи других языков. - person nrabinowitz; 21.03.2012

здесь не так много активности в течение нескольких месяцев, но в последнее время я работаю с этим материалом, и, возможно, это ответ на ваш вопрос

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

Поэтому, когда вы вводите код jquery, вы должны сначала убедиться, что он еще не является частью контекста.

person Alan Kaiser    schedule 09.08.2012