2

我正在使用 cli 中的 PhantomJS (v1.5) 和 javascript 运行测试。测试在 fedora/centos 上运行。

该测试说明了从 querySelector 返回 html(type) 元素时出现的错误(用户或其他错误)。

测试了两个项目,第一个是输入,第二个是anchor

带有 id=ICType 的输入正常工作,锚返回一个 href/content,它不是我期望的 htmlAnchorType。

我希望能够在返回的 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

这可能有点晚了,但事实证明锚在 phantom js 中没有 click()

编辑 这不是选择器的问题。选择器实际上工作正常 - 它确实返回元素,而不仅仅是 href。对调用 click() 函数没有响应是规范的一部分... http://www.w3.org/TR/DOM-Level-2-HTML/html.html#ID-2651361 <a>标签不执行调用它们时的默认行为。

我认为选择器混淆是由于在幻象上下文中缺乏对象检查器的可用性,以及 a console.log(el)(其中 el 是<a>标签元素)实际上“有用地”注销 href 的事实 - 给人的错误印象是只有 href 字符串由选择器返回。

因此,虽然不支持直接调用 click() 函数,但您仍然可以触发锚点的默认 onClick 事件处理程序,详情如下 - 这被记录为在其他线程中工作,我自己的项目,并在上面的 tom 代码上进行了测试。

结束编辑

还有一些其他关于同一问题的帖子,但关于其他浏览器,例如..如何使用 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 回答