Как создать сценарий автозаполнения JavaScript для форм в Electron WebView, который обходит проблемы проверки?

Я работаю над приложением Electron с компонентом WebView, который отображает различные веб-сайты. Моя цель — разработать сценарий автозаполнения, похожий на менеджер паролей для форм на этих веб-сайтах.

Хотя сценарий успешно заполняет поля формы, я столкнулся с проблемой проверки формы при ее отправке. Несмотря на мои попытки обойти проверку путем отправки событий, в некоторых случаях проверка все равно не удалась.

Например, при выполнении следующего скрипта на консоли страницы входа в Dropbox (https://www.dropbox.com/login) поле ввода обновляется, но при нажатии «продолжить» возникают ошибки проверки:

setInterval(() => {
     const element = document.querySelector('form input');
     if (!element || element.value !== "") return;
     console.info('element founded')
     element.value = "[email protected]";
     element.dispatchEvent(new Event("input", { bubbles: true }));
     element.dispatchEvent(new Event("change", { bubbles: true }));
}, 1000);

В моем приложении Electron я попытался выполнить сценарий в WebView, используя метод «executeJavascript», но получил тот же результат, что и выполнение на консоли:

const webview = webviewRef.current
webview.executeJavaScript(`
setInterval(() => {
  const element = document.querySelector('form input');
  if (!element || element.value !== "") return;
  console.info('element founded')
  element.value = "[email protected]";
  element.dispatchEvent(new Event("input", { bubbles: true }));
  element.dispatchEvent(new Event("change", { bubbles: true }));
}, 1000);`)

Скрипт успешно работает в веб-расширении Chrome, где я добавил его в "скрипты контента" (вы можете проверить здесь).

Существует ли надежный метод эффективной имитации пользовательского ввода для обхода проверки формы в WebView приложения Electron? Будем очень признательны за любые идеи или альтернативные подходы. Спасибо!

Редактировать 1:

Также пытался эмулировать пользовательский ввод и события фокуса/размытия, но получил те же результаты:

  const element = document.querySelector('form input');
  console.info('element founded')
  const textToType = "[email protected]";
          
  // Simulate focus event
  element.focus();
  element.dispatchEvent(new Event('focus', { bubbles: true }));
      
  let index = 0;
  const typingInterval = setInterval(() => {
    const char = textToType[index];
    element.value += char; // Simulate typing by appending one character at a time
    element.dispatchEvent(new Event('input', { bubbles: true })); // Dispatch input event
    element.dispatchEvent(new Event("change", { bubbles: true }));
    index++;
      
    if (index === textToType.length) {
      clearInterval(typingInterval); // Stop when all characters are typed
      
      // Simulate blur event after typing
      element.blur();
      element.dispatchEvent(new Event('blur', { bubbles: true }));
    }
  }, 100);

чтобы сделать его очень точным, вы можете добавить некоторую симуляцию набора текста ... в любом случае, самое первое, что бросается в глаза, - это отсутствие событий, связанных с фокусом. Особенно событие blur, которое часто проверяется для подтверждения человеческого взаимодействия. Поэтому, прежде чем делать что-либо еще, попробуйте добавить его после изменения значения ввода.

Diego D 02.05.2024 16:39

@DiegoD Я пробовал запускать события фокусировки и размытия, а также имитировать набор текста, но результат был тот же! Я добавил код, который пробовал, к своему вопросу.

Nicodemos Fernandes Souza 08.05.2024 14:01
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
89
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я попытался сам увидеть, что пошло не так в этом сценарии, и цель была достигнута путем вызова исходного установщика value (из HTMLInputElement) вместо использования конкретного установщика.

Для полноты картины я получил исходный установщик свойства value с помощью статического метода объекта getOwnPropertyDescriptor, который:

возвращает объект, описывающий конфигурацию определенного свойства на заданном объекте

такой объект представляет собой запись, имеющую атрибуты, включая set, которая содержит функцию установки.

Затем я вызвал такую ​​функцию для конкретного объекта входного элемента, используя его метод call, который

вызывает эту функцию с заданным значением и предоставленными аргументами индивидуально.

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

const textToType = "[email protected]";      
var element = document.querySelector('form input');

//gets the value property setter from the original HTMLInputElement
var originalValueSetter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, 'value').set;

//invokes the original setter over the specific element
originalValueSetter.call(element, textToType);

//fires the change event on the input element
element.dispatchEvent(new Event('change', { bubbles: true }));

//clicks the continue button...
document.querySelector('button.email-submit-button').click();

Другие вопросы по теме