Как я могу обойти требование нажатия клавиш в текстовом поле javascript? - PullRequest
0 голосов
/ 10 октября 2019

Здравствуйте и спасибо за чтение.

Итак, я пытаюсь автоматически войти в эту форму, используя Chrome.

https://app.patientaccess.com/login

Я использую свое собственное расширение Chrome длясделай это. Это просто файл javascript, который автоматически заполняет поля. Я использую его для целого ряда веб-сайтов.

Например, это моя функция для заполнения текстового поля:

function fld(param, val){try{document.querySelectorAll(param)[0].value = val} catch(e){}}

И я называю это так:

fld("input[id='loginForm-email']", "mail@myemail.com")

Для большинства сайтов это работает. Но для веб-сайта «Доступ к пациенту» выше это не так, и я думаю, что причина в том, что текстовое поле пароля требует физического нажатия клавиши (или прослушивания события изменения или чего-то еще).

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

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

Итак, мой вопрос: как я могу заставить мой автоматический вход в JavaScript работать на этом сайте?

Я не думаю, что скрипт может использовать события нажатия клавиш для ввода в текстовое поле, но это нормально, потому что яможет заполнить текстовое поле программно (используя функцию fld выше). Но как я могу убедить страницу, что я ввел текст в поле пароля, чтобы она позволяла мне отправить форму?

Я использую JavaScript, как я сказал, и я могу включить jQuery, если необходимо.

Спасибо.

1 Ответ

1 голос
/ 10 октября 2019

После долгих проб и ошибок я смог решить эту проблему с помощью JavaScript, используя следующее:

var fireOnThis = document.querySelectorAll("[type='text']")[0]
const changeEvent = new Event('input', { bubbles: true, cancelable: true });
fireOnThis.dispatchEvent(changeEvent);

Это работает абсолютно красиво. Я превратил это в функцию, и все, что я делаю, это запускаю эту функцию после автоматического заполнения текстового поля (оно не работает до заполнения поля, должно быть после).

Я пробовал много других решенийна других сайтах и ​​ни один не работал, но этот работает. Whee!

Я получил концепцию от Chrome Extension под названием Form Filler . Я попробовал расширение в форме, которую я пытался автоматизировать, и, к моему удивлению, оно заполнило форму без проблем. Поэтому я посмотрел на исходный код , чтобы выяснить, как он это сделал, и обнаружил следующее:

['input', 'click', 'change', 'blur'].forEach(event => {
  const changeEvent = new Event(event, { bubbles: true, cancelable: true });
  element.dispatchEvent(changeEvent);
});

Поэтому я просто преобразовал это в код в своем ответе, и это сработало. ,Так что следует отдать должное Хуссейну Шаббиру, разработчику Form Filler.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...