7

我刚刚习惯了 PhantomJs,到目前为止它真的很酷。

我正在尝试抓取一个网站并获取有关该网站上产品的数据。每个产品页面都以可见产品的默认颜色加载。当您单击颜色样本时,它会通过运行函数来交换新颜色。每个可点击的色样元素如下所示:

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

getColor 更新该颜色的缩略图和价格。每个可用颜色(swatch_0、swatch_1 等)的 id 递增,传递给 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);

我得到相同的输出。任何帮助表示赞赏。

4

2 回答 2

3

如果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);
于 2012-03-20T23:51:34.560 回答
1

几个月来这里没有太多活动,但我最近一直在处理这些东西,也许这是你问题的答案

如果 jquery 已经作为您正在运行的页面的一部分加载,那么注入 jquery 将不起作用,您将获得您描述的行为(我也遇到过这种情况)。

因此,当您注入 jquery 代码时,您应该首先确保它不是上下文的一部分

于 2012-08-09T17:16:46.697 回答