猿问

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并运行鼠标悬停、鼠标按下、鼠标按下和点击。这与简单地使用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



函数式编程
浏览 243回答 2
2回答

侃侃无极

注册一个虚拟帐户后,我在 Chrome 中使用 Tampermonkey 和 Firefox 中使用了 Greasemonkey 尝试了您的脚本。setInterval 延迟为 200,它们不起作用。您需要将 setInterval 延迟增加到 1000 并且它会起作用。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答