PhantomJS无法单击现有元素

时间:2014-06-20 02:46:45

标签: javascript jquery click phantomjs dispatchevent

我在Windows 8.1上使用PhantomJS 1.9.7,输入用户名和密码后我会点击“登录”按钮。我可以写用户名和密码但是,当我想让PhantomJS点击按钮时,它可以找到该元素,但无法点击它。 我在以前的帖子中发现我需要创建事件并使用" dispatchEvent"。我做到了但是我得到了如下错误:

  

TypeError:' undefined'不是一个函数(评估' elm.dispatchEvent(event)')

我也试图从EventListener获得帮助,但我得到了相同的错误。

如何点击元素?

var page = require('webpage').create();

page.open('URL', function() {
    var submitButton = enterUserAndPassAndLogin();      
    click(submitButton);
    phantom.exit();
});

function enterUserAndPassAndLogin() {
    var element = page.evaluate(function()  {
        document.querySelector('input[name="username"]').value = "*******";
        document.querySelector('input[name="password"]').value = "*******";
        return document.getElementsByTagName("Button");
    });
    return element;
}

function click(elm) {
    var event = document.createEvent("MouseEvent");
    event.initMouseEvent("click", true, true, window,
        0, 0, 0, 0, 0, false, false, false, false, 0, null);
    elm.dispatchEvent(event);
}

2 个答案:

答案 0 :(得分:0)

代码有两个问题。第一个DOM元素不能从页面上下文(page.evaluate)传递到外部。来自docs

的对应行
  

注意:evaluate函数的参数和返回值必须是一个简单的原始对象。经验法则:如果它可以通过JSON序列化,那就没关系了。

     

闭包,函数,DOM节点等不起作用!

所以submitButton[null]。由于返回了一个数组,因此错误消息不会显示实际问题。由于DOM元素无法传递到外部,因此点击必须在page.evaluate内进行。

由于page.evaluate是沙箱,因此必须在页面上下文中定义click函数。无法直接访问外部的变量和函数。

可能的脚本是:

var page = require('webpage').create();

page.open('URL', function() {
    enterUserAndPassAndLogin();
    setTimeout(function(){
        // wait a little to maybe see the click result
        phantom.exit();
    }, 1000);
});

function enterUserAndPassAndLogin() {
    page.evaluate(function()  {
        function click(elm) {
            var event = document.createEvent("MouseEvent");
            event.initMouseEvent("click", true, true, window,
                0, 0, 0, 0, 0, false, false, false, false, 0, null);
            elm.dispatchEvent(event);
        }
        document.querySelector('input[name="username"]').value = "*******";
        document.querySelector('input[name="password"]').value = "*******";
        click(document.getElementsByTagName("Button")[0]);
    });
}

答案 1 :(得分:-1)

只需插入Jquery并执行

$(selector).trigger('click');

注意,如果页面使用异步帖子,则页面加载事件不会触发,但是它正在加载"你必须等待回应。

可能会等待几秒钟,这样就足以让异步帖回来了。