Я работаю над приложением 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);
@DiegoD Я пробовал запускать события фокусировки и размытия, а также имитировать набор текста, но результат был тот же! Я добавил код, который пробовал, к своему вопросу.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я попытался сам увидеть, что пошло не так в этом сценарии, и цель была достигнута путем вызова исходного установщика 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();
чтобы сделать его очень точным, вы можете добавить некоторую симуляцию набора текста ... в любом случае, самое первое, что бросается в глаза, - это отсутствие событий, связанных с фокусом. Особенно событие
blur, которое часто проверяется для подтверждения человеческого взаимодействия. Поэтому, прежде чем делать что-либо еще, попробуйте добавить его после изменения значения ввода.