PhantomJs щелкает ссылки или запускает функции на странице - PullRequest
7 голосов
/ 16 марта 2012

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

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

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

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

Я загрузил страницу, загрузил 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);

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

Ответы [ 2 ]

3 голосов
/ 21 марта 2012

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

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

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

var elementOffset = page.evaluate(function() {
   return $('#swatch_1').offset(); 
});
page.sendEvent('click', elementOffset.left + 1, elementOffset.top + 1);
1 голос
/ 09 августа 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...