7

私は PhantomJs に慣れてきたばかりで、今のところ本当にクールです。

サイトをクロールして、サイト上の製品に関するデータを取得しようとしています。各製品ページは、製品のデフォルトの色が表示された状態で読み込まれます。色見本をクリックすると、関数を実行して新しい色を入れ替えます。クリック可能な各色見本要素は次のようになります。

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

getColor は、その色のサムネイルと価格を更新します。id は使用可能な色 (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);

そして、同じ出力が得られます。どんな助けでも大歓迎です。

4

2 に答える 2

3

ここにあるように、onclickハンドラーが HTML で直接指定されている場合は、Javascript で直接呼び出すことができます。

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

PhantomJSpageメソッドsendEvent()を使用して、ネイティブのクリック イベントを発行することもできると思います。しかし、マウスの x、y 位置を使用して PhantomJS コンテキストからこれを呼び出す必要があるため、これは少し複雑に見えます。テストされていないコード:

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 に答える