我正在尝试消除脚本中的错误,该脚本会自动登录到https://account.booking.com/sign-in
function clickButton (){
const msg = document.querySelector(".bui-form__error");
const button = document.querySelector(".bui-button");
if (msg && msg.id !== "loginname-error" ) {
console.log(msg.textContent);
} else if (button) {
button.click();
} else {
console.log("Not yet...");
return;
}
}
setInterval(clickButton, 200);
在大多数情况下,这可以正常工作。尽管Chrome会自动填写用户名字段,但有时会显示登录名错误,出于我们的目的,我们可以安全地忽略该错误-但是,有时由于某些原因,这会导致页面对脚本无响应。用户在页面上执行的几乎所有操作都会导致脚本继续执行-按下F12打开Dom检查器,在页面上的任意位置单击,甚至在控制台上运行命令(如“ a = document.querySelector...
”一样简单)所有这些都会使脚本正常运行。
我尝试遵循previous answers,实现triggerMouseEvent
并运行mouseover,mousedown,mouseup和click。这与仅使用click()
的行为没有什么不同。由于单击页面上的其他位置可以解决此问题,因此我尝试在其他元素上使用此类单击事件,然后再次在按钮上使用它们。这与仅使用click()
的行为也没有什么不同。我看到的Tampermonkey脚本“在……之后工作”的唯一结果是页面重新加载的AJAX问题,而不是用户与窗口的交互。
在点击事件之后放置console.log("click")
表示到达点击事件就很好。使用triggerMouseEvent
,我已如下记录dispatchEvent
:
function triggerMouseEvent (node, eventType) {
var clickEvent = document.createEvent ('MouseEvents');
clickEvent.initEvent (eventType, true, true);
console.log(node.dispatchEvent (clickEvent));
}
这将按预期返回“ true
”。
我试图在每次点击之间发送如下键盘事件:
function pressf12(){
var event = new KeyboardEvent("pressF12");
event.keyCode = 123;
event.which = 123;
event.altKey = false;
event.ctrlKey = false;
event.shiftKey= false;
event.target = window;
window.dispatchEvent(event);
}
这也不起作用。对于导致问题的原因以及解决该问题的方法,我完全没有想法。
这是加载页面后控制台上显示的内容,如果可能相关的话:
[仅报告]拒绝执行内联事件处理程序,因为它 违反以下内容安全策略指令:“ script-src saa.booking.com * .bstatic.com bstatic.com google-analytics.com'self' 'nonce-6B8EKlfK9vqB8Uy'“。要么是'unsafe-inline'关键字,要么是一个哈希 ('sha256 -...')或现时('nonce -...')才能启用内联 执行。
content_script @ VM1347:61(匿名)@ VM1347:71
和
登录?op_token = ...:38 POST https://account.booking.com/navigation_times?sid=&pid=...&nts=…== 3&lang = zh-CN&ref_action = Signin_Index&aid = ...&stype =&route =&ua =&ch =&lt = 净:: ERR_BLOCKED_BY_CLIENT 回调@登录?op_token = ...:38 包装器@ error_catcher:756 setTimeout(异步)
win.setTimeout @ error_catcher:666 回调@登录吗?op_token = ...:38加载(异步)
nav_timing @登录?op_token = ...:38 (匿名)@登录?op_token = ...:38
这是屏幕截图:
用户单击页面后,不再显示其他消息。即使我将时间间隔增加到5000,在页面加载好并且这两个消息都单独显示之后,从脚本中单击也无济于事。
我想到这可能是由Chrome设置,插件等引起的,但它同时出现在我自己的多台计算机以及其他用户的计算机上。即使是这样,也需要一些解决方法。
我还想到这可能与TM的沙箱有关。尝试@grant none
,@grant unsafeWindow
并按照this answer内联插入脚本都具有相同的问题行为。内联插入脚本确实会在控制台中带来更多的unsafe-inline错误。
答案 0 :(得分:0)
注册一个虚拟帐户后,我在Chrome中使用Tampermonkey和Firefox使用Greasemonkey尝试了您的脚本。由于setInterval延迟为200,因此它们不起作用。您需要将setInterval延迟增加到1000,它将起作用。
答案 1 :(得分:0)
您是否尝试过使用window.onload
?
例如:
window.onload = () => {
// do stuff...
};
您也可以尝试使用addEventListener
:
window.addEventListener("load", () => {
// do stuff...
});
如果这不起作用,您可以尝试使用以下方法触发点击事件:
document.querySelector("<selector>").click();
祝你好运。