2

私はcasperjsを初めて使用します。これまでに学んだ限り、マウスアクションをトリガーできるクリックメソッドは2つだけです:

  • click()セレクターが必要です
  • clickLabel()タグ間に「ラベル」が必要

私が現在扱っているWebサイトには動的な「タブ」があり、各タブをクリックするとJavaScriptの送信がトリガーされ、「pic」要素を除いて、各タブに関連付けられた「クラス」、「id」、または「ラベル」はありません:

<a href="javascript:submitTab('search6')" tabindex="6">
    <img src="image6off.gif" name="imag6" height="6" hspace="0" vspace="0" border="0" onmouseover="nbGroup('over','imag6','image6on.gif','image6on.gif',1);" onmouseout="nbGroup('out');" onclick="nbGroup('down','group1','imag6','image6off.gif',1); submitTab('search6')" alt="New Search">
</a>

使おうとしましclickLabel()たが失敗しました。

はい、XPath を使用できますが、問題はタブの数が各レコードの利用可能な情報に応じて動的であるため、この場合、「新しい検索」はこのレコードのタブ 6 である可能性がありますが、別のタブではタブ 4、別のタブではタブ 8 です。さらに別の。

はい、使用可能なすべてのタブをループする「ループ」を作成することもできますが、

waitForResource()

「image6on.gif」を使用して、どの画像またはタブをクリックするかをプログラムに伝えることができるので、どうやら、このWebサイトでは、それぞれの異なるjavascript送信タブプログラムが1つの「画像#」に一意に関連付けられていることがわかりました。 on/off.gif"

この種の状況に対処するために、casperjs の貢献者がこのメソッドを簡単に実装できることを願っています。

4

2 に答える 2

3

tabindexこれがあなたが望むものかどうかは完全にはわかりませんが、次の属性に基づいてタブを取得できます。

casper.click("a[tabindex='6']");

編集:以下のコメントに基づいて、私がまとめたハック:

casper.thenEvaluate(function() {
  var attr = document.querySelector('img[alt="New Search"]').parentNode.getAttribute('tabindex');
  __utils__.click('a[tabindex="' + attr + '"]');
});

casper.thenEvaluate()リモートページで JavaScript を実行できます。

__utils__使用できる追加の関数セットとして読み込まれた各ページに挿入されます。

于 2013-08-15T00:58:22.733 に答える
2

私は CasperJS の貢献者ではありません。私の観点からすると、clickLabel機能はすでに多すぎます。ほとんどの場合、正確な文字列の一致を妨げる何かがあるため、実際に使用したことを思い出せません。

そうです、CasperJS に新しいクリック関数を追加することは有効な引数です。私の意見では、それを行うには、提供されている XPath 機能を使用する方がよいでしょう。使用する関数を作成することもできます。

casper.clickByImg = function(imgRes){
    var x = require('casper').selectXPath;
    this.click(x("//a/img[contains(@href,"+imgRes+")]/.."));
    return this;
};

参照: 最小限のオーバーヘッド。

より多くのオーバーヘッドを伴う正規表現で画像を照合することもできます。

casper.clickByImgRegexp = function(regexp){
    var hrefs = this.getElementsAttribute("a > img", "href");
    for(var i = 0; i < hrefs.length; i++) {
        if (hrefs[i].match(regexp)) {
            this.clickByImg(hrefs[i]);
            break;
        }
    }
    return this;
};
于 2014-06-15T13:47:17.317 に答える