2

PhantomJS (v1.5) と cli の javascript の両方を使用してテストを実行しています。テストは fedora/centos で実行されています。

このテストは、querySelector から html(type) 要素を返す際にエラー (ユーザーまたはその他) と思われるものを示しています。

2 つの項目がテストされます。1 つ目は入力、2 つ目はアンカーです

id=ICType の入力は正しく機能します。アンカーは、期待していた htmlAnchorType ではない href/content を返します。

私は、返された htmlAnchorElement で一種の foo.click() を実行できるようにしたいと考えています。これにより、選択したアンカーの href javascript が呼び出されます。ただし、返されるのが href コンテンツのみである場合、これは問題のようです..

ネットを見ても、私が間違ったことを思いついたわけではありません。

感想/コメント????

ありがとう

running on fedora
 phantomjs  foo.js

foo.js

String.prototype.trim = function() {
    return this.replace(/^\s+|\s+$/g,"");
}

//
var page = require('webpage').create();
var searchUrl = 'https://courses.osu.edu/psc/hcosuct/EMPLOYEE/HRMS/c/COMMUNITY_ACCESS.CLASS_SEARCH.GBL';

page.onConsoleMessage = function(msg) {
    console.log(msg);
};

phantom.loadState = false;

page.onLoadFinished = function(status) { 
    console.log('called with state ' + phantom.loadState);
    if (status !== "success") {
        console.log("Unable to access network");
    } else {
        if (!phantom.loadState) {
            page.evaluate(function() {
                    var aa1;


                    /*
                        we test two items, one is an input, which succeeds, the other is the anchor, 
                    which fails

                        the querySelector should return an element htmlelement(type)..
                        for the ancho, it simply returns the href content... wth!!!
                    */

                    var sub="ICType";
                    var t1 = document.querySelector("[id^='ICType']");

                    console.log(t1);        //<<< this will be htmlelement. which is correct..
                    console.log("after ictype");

                    /*
                        the complete id for the anchor
                        var sub="CLASS_SRCH_WRK2_SSR_PB_SRCH$56$";

                        for testing, use a subset without the $.. doesn't make a difference..
                    */  
                    sub="CLASS_SRCH_WRK2_SSR_PB_SRCH";
                    t1 = document.querySelector("[id^='CLASS_SRCH_WRK2_SSR_PB_SRCH']");

                    console.log(t1);    // <<< this should be htmlelement.. but is the href content.. WHY??????
                    console.log("test complete");

                    /*
                        -- IF the test ever generates the actual/correct htmlelemtent for the anchor
                        --the goal will be to then do a foo.click() to then run/invoke the 
                        --underlying javascript for the anchor/href which is

                            <a class="SSSBUTTON_CONFIRMLINK" 
                        href="javascript:submitAction_win0(document.win0,'CLASS_SRCH_WRK2_SSR_PB_SRCH$56$');" 
                            tabindex="32" id="CLASS_SRCH_WRK2_SSR_PB_SRCH$56$" 
                        name="CLASS_SRCH_WRK2_SSR_PB_SRCH$56$">
                    */

                //window.setTimeout(function () {
                //submitAction_win0(document.win0,'CLASS_SRCH_WRK2_SSR_PB_SRCH$56$');
                //}, 2000);
            });
            phantom.loadState = true;
        } else {
            console.log(page.content);
            phantom.exit();
        }
    }
}

page.open(encodeURI(searchUrl));
4

1 に答える 1

1

これはおそらく少し遅れていますが、ファントム js でアンカーに click() がないことが判明しました

EDIT これはセレクタの問題ではありません。実際、セレクターは適切に機能しています。href だけでなく、要素を返します。click() 関数の呼び出しに対する応答の欠如は、仕様の一部です... http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-2651361 <a>タグが実行されませんクリックが呼び出されたときのデフォルトの動作。

console.log(el)セレクターの混乱は、ファントムコンテキストでのオブジェクトインスペクターの可用性の欠如と、a (el は<a>タグ要素) が実際にhref を「役立つ」ようにログアウトするという事実から生じると思います- href 文字列のみという誤った印象を与えますセレクターから返されました。

そのため、click() 関数を直接呼び出すことは認められませんが、アンカーのデフォルトの onClick イベント ハンドラーを起動することはできます (以下で詳しく説明します)。

編集終了

同じ問題に関する他のいくつかの投稿がありますが、他のブラウザーに関しては..JavaScriptでクリックをシミュレートする方法は? -そして修正は、自分でコピーして貼り付けたイベントを作成することです...

var evt = document.createEvent("MouseEvents");
evt.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
t1.dispatchEvent(evt);
于 2013-01-29T00:07:03.190 に答える