2012-03-16 6 views
7

私はPhantomJsに慣れています。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 

いない他のコードの実行を。

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); 

直接機能を実行している:私はまた、このようにjQueryのないイベント発射しようとした

pPage.getColor(1); 

をと私は同じ出力を得ます。どんな助けもありがとうございます。

答えて

3

あなたはここでそれを持っているようonclickハンドラがHTMLで直接指定されている場合は、JavaScriptでそれを直接呼び出すことができます。

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

私はあなたにも問題にPhantomJSにpage方法sendEvent()を使用することができると信じてネイティブクリックイベント。しかし、マウスのx、yの位置でPhantomJSコンテキストから呼び出さなければならないので、これは少し複雑です。未テストコード:数ヶ月のためにここに

var elementOffset = page.evaluate(function() { 
    return $('#swatch_1').offset(); 
}); 
page.sendEvent('click', elementOffset.left + 1, elementOffset.top + 1); 
+0

の一部ではないことを確認する必要がありますのonClickは、jQueryのイベントであることを確認していますか?私はそれについてのドキュメントを見つけることができません。私の理解は、.click()はイベントを要素にバインドしますが、それでもクリックする必要があります。 私はsendEventを試していません。それは有望そうだ。この特定のプロジェクトでは、私は別のルートに行くことにしました。私はiMacrosを使ってページデータをスクラップしています。実際のブラウザを使用しているため、AjaxとJavascriptは問題ではありません。 ありがとう! –

+0

'onclick'はjQueryイベントではありません。DOM要素のネイティブメソッドです(私の例では' $(...)[0]を使用しています)。onclick' - '[0]'はjQueryオブジェクトではなく実際のDOM要素を取得します)。これは多くの状況では機能しませんが、 'onclick'がHTMLマークアップに含まれていると動作します。 – nrabinowitz

+2

BTW - この種のブラウザベースのスクレイピングのためにSeleniumを検討することもできます。それは非常に良いですし、実際のブラウザを使用して、他の言語の束のバインディングを持っています。 – nrabinowitz

1

あまり活動が、私は最近、このようなもので取り組んできたとjQueryはすでにの一部としてロードされている場合、多分これはあなたの質問

への答えはあなたが実行しているページ、次にjqueryを注入すると動作しません、あなたはあなたも(これも遭遇した)動作を取得します。

あなたはjqueryのコードを挿入するときだから、まずそれがすでにコンテキスト

関連する問題