gpt4 book ai didi

javascript - PhantomJS 按钮点击和表单提交

转载 作者:行者123 更新时间:2023-11-28 05:59:55 27 4
gpt4 key购买 nike

我对 PhantomJS 还很陌生,所以我只是试图偶然发现一些实际示例(文档感觉对这些示例有点了解)。

我尝试的一件事是向虚假的 PollDaddy 民意调查提交选票,但我很挣扎。使用下面的脚本,我可以从第一个屏幕截图中看出我的选项按钮被单击/选择。但为什么我的答案没有提交?尽管我的代码在第二个 evaluate 中的 VOTE 按钮上执行了 click 事件,但第二个屏幕截图看起来与第一个屏幕截图相同。有人知道为什么吗?知道如何让它发挥作用吗?

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

//******* BEGIN LOGGING METHODS *******
// http://phantomjs.org/api/webpage/handler/on-url-changed.html
page.onUrlChanged = function(targetUrl) {
console.log('New URL: ' + targetUrl);
};

// http://phantomjs.org/api/webpage/handler/on-console-message.html
page.onConsoleMessage = function(msg, lineNum, sourceId) {
console.log('CONSOLE: ' + msg + ' (from line #' + lineNum + ' in "' + sourceId + '")');
};

// http://phantomjs.org/api/webpage/handler/on-error.html
page.onError = function(msg, trace) {
var msgStack = ['ERROR: ' + msg];
if (trace && trace.length) {
msgStack.push('TRACE:');
trace.forEach(function(t) {
msgStack.push(' -> ' + t.file + ': ' + t.line + (t.function ? ' (in function "' + t.function +'")' : ''));
});
}
console.error(msgStack.join('\n'));
};

// http://phantomjs.org/api/webpage/handler/on-resource-error.html
page.onResourceError = function(resourceError) {
console.log('Unable to load resource (#' + resourceError.id + ' URL:' + resourceError.url + ')');
console.log('Error code: ' + resourceError.errorCode + '. Description: ' + resourceError.errorString);
};

// http://phantomjs.org/api/webpage/handler/on-resource-timeout.html
page.onResourceTimeout = function(request) {
console.log('Response Timeout (#' + request.id + '): ' + JSON.stringify(request));
};
//******* END LOGGING METHODS *******

page.open('https://polldaddy.com/poll/9424638/', function(status) {
console.log('Status: ' + status);

//make selection
var myselection = page.evaluate(function() {
var ev = document.createEvent("MouseEvent");
ev.initMouseEvent("click", true, true, window, null,0, 0, 0, 0, false, false, false, false, 0, null);

//radio button for Curly has id=PDI_answer42988707
var myselection = document.querySelector("#PDI_answer42988707");
(myselection).dispatchEvent(ev);
return document.title;
});
//screen capture the selection
page.render('selection.png');
console.log(myselection);

//click the Vote button
var dovote = page.evaluate(function() {
var ev = document.createEvent("MouseEvent");
ev.initMouseEvent("click", true, true, window, null,0, 0, 0, 0, false, false, false, false, 0, null);

//get a handle to the vote button
var votebutton = document.querySelector("a.vote-button");
//click the vote button
(votebutton).dispatchEvent(ev);
return document.title;
});
//delay, then take screenshot...
setTimeout(
function(){
page.render('voted.png');
console.log(dovote);
}
,2000
);

});

我正在 Linux Mint 上使用 PhantomJS 1.9.0 执行脚本。执行参数如下,以克服任何 SSL 握手失败:

phantomjs --ignore-ssl-errors=true --ssl-protocol=any myscript.js

我还尝试在命令行上设置 --cookies-file--local-storage-path,但这也没有帮助。

我从上面所有控制台日志记录中得到的输出是这样的:

New URL: https://polldaddy.com/poll/9424638/  <-- from urlChange
CONSOLE: JQMIGRATE: Logging is active (from line # in "") <-- from onConsoleMessage
Status: success
Who is your favorite Stooge (poll 9424638) | Polldaddy.com
Who is your favorite Stooge (poll 9424638) | Polldaddy.com

我无用的民意调查在这里:https://polldaddy.com/poll/9424638/ ,您将从我的脚本中看到我正在尝试堆叠 Curly 的结果。

最佳答案

如果您查看 polldaddy 页面中包含的 JavaScript,您会发现带有以下检查的投票函数:

if (event.pageX) {
eventX = event.pageX;
eventY = event.pageY;
} else {
eventX = event.clientX;
eventY = event.clientY;
}

...

if (eventX == 0 && eventY == 0) {
return false
}

基本上,他们正在查看事件位置,如果 x 和 y 位置都等于 0,则短路。

如果您更改创建的鼠标事件,使 clientX 或 clientY 值不为 0,则您的脚本应该可以工作。

关于javascript - PhantomJS 按钮点击和表单提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37369308/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com