javascript - Tampermonkey 脚本点击事件在用户与窗口交互之前什么都不做
问题描述
我正在尝试解决自动登录到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...
' 一样简单)都以某种方式踢出脚本正常运行。
我试图遵循以前的答案,实现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=en-us&ref_action=Signin_Index&aid=...&stype=&route= &ua=&ch=<= net::ERR_BLOCKED_BY_CLIENT 回调@登录?op_token=...:38 包装器@error_catcher:756 setTimeout (async)
win.setTimeout @error_catcher:666 回调@登录?op_token=... :38 加载(异步)
nav_timing @ sign-in?op_token=...:38(匿名)@sign-in?op_token=...:38
这是一个屏幕截图:
用户单击页面后不会显示更多消息。即使我将间隔增加到 5000,在页面加载并且这两条消息都自己显示之后,来自脚本的点击什么也不做。
我想到这可能是由 Chrome 设置、插件等引起的,但它既发生在我自己的多台计算机上,也发生在其他用户的计算机上。即使是这种情况,也需要一些解决方法。
我还想到它可能与 TM 的沙箱有关。尝试@grant none
,@grant unsafeWindow
并根据此答案内联插入脚本都具有相同的问题行为。插入脚本内联确实会在控制台中产生更多的不安全内联错误。
解决方案
在注册了一个虚拟帐户后,我在 Chrome 中使用 Tampermonkey 和 Firefox 中使用 Greasemonkey 尝试了你的脚本。setInterval 延迟为 200 时,它们不起作用。您需要将 setInterval 延迟增加到 1000,它会起作用。
推荐阅读
- angularjs - Angularjs - 使用“角度方式”在新选项卡中打开图像
- abap - 选择不明确/无效的列运行时错误
- android - 如何在没有引号的情况下写入数据库,java
- python - 更改其他 DataFrame 中的 DataFrame 行的值?
- javascript - ng-model 属性在数组中未定义
- windows - 从 vb.net 启用/禁用麦克风播放?
- regex - 通用布料尺寸(S,M,L)正则表达式的问题
- c# - RxUI IViewFor
失败,要求 IActivationForViewFetcher - office-js - 如何将文本块添加到 Word 文档并监视对它的更改?
- c# - 如何在不同的解决方案之间共享 ac# 共享项目?