События щелчка скрипта Tampermonkey ничего не делают, пока пользователь не взаимодействует с окном - PullRequest
3 голосов
/ 10 июня 2019

Я пытаюсь исправить ошибку в скрипте, который автоматически регистрируется на 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=&lt= net :: ERR_BLOCKED_BY_CLIENT обратный вызов@ вход? op_token = ...: 38 обертка @ error_catcher: 756 setTimeout (async)
win.setTimeout @ error_catcher: 666 обратный вызов @ вход? op_token = ...: 38 загрузка (асинхронная)
nav_timing @ вход? op_token = ...: 38 (анонимный) @ вход? op_token = ...: 38

Вот скриншот:

Больше никаких сообщений не отображается после того, как пользователь нажимает на страницу.Даже если я увеличу интервал до 5000, задолго до того, как страница загрузится и оба эти сообщения будут отображаться самостоятельно, щелчки из скрипта ничего не сделают.

Мне пришла в голову мысль, что это может быть вызванонастройками Chrome, аддонами и т. п., но это происходит как на нескольких моих компьютерах, так и на компьютерах других пользователей.Даже в этом случае понадобится обходной путь.

Мне также пришло в голову, что это может быть как-то связано с песочницей ТМ.Попытка @grant none, @grant unsafeWindow и вставка скрипта в соответствии с этим ответом имеют одинаковое поведение проблемы.Вставка встроенного скрипта дает больше небезопасной встроенной ошибки в консоли.

Ответы [ 2 ]

0 голосов
/ 11 июня 2019

Вы пробовали использовать window.onload?

Например:

window.onload = () => {
  // do stuff...
};

Вы также можете попробовать использовать addEventListener:

window.addEventListener("load", () => {
  // do stuff...
});

Если это не сработает, вы можете попробовать вызвать событие щелчка, используя:

document.querySelector("<selector>").click();

Удачи.

0 голосов
/ 10 июня 2019

Я попробовал ваш скрипт как в Chrome с Tampermonkey, так и в Firefox с Greasemonkey после регистрации фиктивного аккаунта. С задержкой setInterval 200 они не работали. Вам нужно увеличить задержку setInterval до 1000, и она будет работать.

...