5

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

TypeError:“未定义”不是函数(评估“elm.dispatchEvent(事件)”)

我也试图从 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);
}
4

2 回答 2

1

代码有两个问题。第一个 DOM 元素不能从page.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]);
    });
}
于 2015-01-13T22:39:20.887 回答
-1

只需插入 Jquery 并执行

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

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

也许设置等待几秒钟,这足以让异步帖子回来。

于 2014-06-20T02:51:11.727 回答