Автоматическое заполнение формы

В лицее хотели учиться 200 детей. Но школа набирала только 75 учеников. На указанном сайте шёл обратный отсчёт. Обратный отсчёт перед открытием формы для поступления в школу В назначенное время открывалась форма и родители начинали её заполнять. Форма появлялась частями — какая-то информация подгружалась с другой страницы.

Вид формы для подачи заявки в школу
Те, кто не уложился в 1,5 минуты, оказались за бортом. Подробнее о том, как сейчас поступают в школы.

Первое, что пришло на ум: по клику на кнопку копировать информацию в буфер обмена, тем самым сокращая время на выделение текста [инструмент сделала, чтобы любой мог воспользоваться — не нужно уметь программировать].

Редактор JavaScript Mozilla Firefox

Если нажать одновременно Shift F4, появится окошко, куда можно написать любой JavaScript и выполнить его, нажав кнопку "Запустить". Например, вот так можно вывести на экране сообщение

alert("Моё сообщение");
Простой редактор JavaScript в Mozilla Firefox

Скрипт автоматического заполнения полей формы

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

// данные заявителя
requestAnimationFrame(step00);
var razstart = null; function step00(timestamp) {
  var raz = Array.prototype.slice.call(document.querySelectorAll('input[type="text"], input:not([type])')).filter(function(a) {return a.offsetHeight > '5'});  // если текстовые поля больше 5px
  if (!razstart) razstart = timestamp;
  if (raz.length < 5) {  // пока таких полей не станет больше 5, повторять функцию (надёжнее чем задержка setTimeout и setInterval)
    requestAnimationFrame(step00);
  } else {  // когда таких полей станет больше 5, заполнить их
    raz[0].value = 'Иванова';
    raz[1].value = 'Наталья';
    raz[2].value = 'Ивановна';
    raz[3].value = '0000';
    raz[4].value = '000000';
    raz[5].value = 'ОТДЕЛОМ УФМС РОССИИ ПО ...';
    raz[6].value = '01.01.2009';
    for (var i = 0; i < 7; i++) {  // эмулировать (имитировать) действия посетителя
      raz[i].dispatchEvent(new Event("change"));
      raz[i].dispatchEvent(new Event("change"));
      raz[i].dispatchEvent(new Event("keydown"));
      raz[i].dispatchEvent(new Event("keyup"));
    }
    requestAnimationFrame(step01);  // запустить следующую функцию
  }
}

// данные о ребёнке
var razstart = null; function step01(timestamp) {
  var raz = Array.prototype.slice.call(document.querySelectorAll('input[type="text"], input:not([type])')).filter(function(a) {return (a.offsetHeight > '5') && (a.value != 'Наталья') && (a.value != 'Ивановна') && (a.value != '0000') && (a.value != '000000') && (a.value != 'ОТДЕЛОМ УФМС РОССИИ ПО ...') && (a.value != '01.01.2009')});  // если текстовые поля больше 5px и в них не встречается ранее заполненный текст (искл. фамилия)
  if (!razstart) razstart = timestamp;
  if (raz.length < 3) {
    requestAnimationFrame(step01);
  } else {
    raz[1].value = 'Иванов';
    raz[2].value = 'Иван';
    raz[3].value = 'Иванович';
    raz[4].value = '01.01.2009';
    raz[5].value = 'город Самара';
    raz[6].value = 'III-ЕР';
    raz[7].value = '000000';
    for (var i = 1; i < 8; i++) {
      raz[i].dispatchEvent(new Event("change"));
      raz[i].dispatchEvent(new Event("change"));
      raz[i].dispatchEvent(new Event("keydown"));
      raz[i].dispatchEvent(new Event("keyup"));
    }
    requestAnimationFrame(step02);
  }
}

// адрес регистрации
var razstart = null; function step02(timestamp) {
  var raz = Array.prototype.slice.call(document.querySelectorAll('input[type="text"], input:not([type])')).filter(function(a) {return (a.offsetHeight > '5') && (a.value != 'Иванова') && (a.value != 'Наталья') && (a.value != 'Ивановна') && (a.value != '0000') && (a.value != '000000') && (a.value != 'ОТДЕЛОМ УФМС РОССИИ ПО ...') && (a.value != '01.01.2009') && (a.value != 'Иванов') && (a.value != 'Иван') && (a.value != 'Иванович') && (a.value != '01.01.2009') && (a.value != 'город Самара') && (a.value != 'III-ЕР') && (a.value != '000000')});
  if (!razstart) razstart = timestamp;
  if (raz.length < 3) {
    requestAnimationFrame(step02);
  } else {
    raz[0].value = 'Самарская область';
    raz[2].value = 'Самара';
    raz[3].value = 'Улица';
    raz[4].value = '0';
    raz[5].value = '0';
    for (var i = 0; i < 6; i++) {
      raz[i].dispatchEvent(new Event("change"));
      raz[i].dispatchEvent(new Event("change"));
      raz[i].dispatchEvent(new Event("keydown"));
      raz[i].dispatchEvent(new Event("keyup"));
    }
    Array.prototype.slice.call(document.querySelectorAll('button')).filter(function(a) {return (a.offsetHeight > '5') && (a.innerHTML.indexOf('егистрац') != -1)})[0].dispatchEvent(new Event("click"));  // эмулировать нажатие на кнопку больше 5px и содержащую текст 'егистрац'
    requestAnimationFrame(step03);
    requestAnimationFrame(step04);
    requestAnimationFrame(step05);
  }
}

// контактные данные
var razstart = null; function step03(timestamp) {
  var raz = Array.prototype.slice.call(document.querySelectorAll('button')).filter(function(a) {return (a.offsetHeight > '5') && (a.innerHTML.indexOf('mail') != -1)});
  if (!razstart) razstart = timestamp;
  if (raz.length == 0) {
    requestAnimationFrame(step03);
  } else {
    raz[0].dispatchEvent(new Event("click"));
    var razI = Array.prototype.slice.call(document.querySelectorAll('input[type="email"]')).filter(function(a) {return (a.offsetHeight > '5') && (a.value == '')})[0];
    razI.value = 'n.mitra@yandex.ru';
    razI.dispatchEvent(new Event("change"));
    razI.dispatchEvent(new Event("change"));
  }
}

// кнопка "Загрузить данные по требуемым свойствам"
var razstart = null; function step04(timestamp) {
  var raz = Array.prototype.slice.call(document.querySelectorAll('button')).filter(function(a) {return (a.offsetHeight > '5') && (a.innerHTML.indexOf('агруз') != -1)});
  if (!razstart) razstart = timestamp;
  if (raz.length == 0) {
    requestAnimationFrame(step04);
  } else {
    raz[0].dispatchEvent(new Event("click"));
  }
}

// флажок "Я даю согласие на обработку персональных данных"
var razstart = null; function step05(timestamp) {
  var raz = Array.prototype.slice.call(document.querySelectorAll('input[type="checkbox"]')).filter(function(a) {return a.offsetHeight > '5'});
  if (!razstart) razstart = timestamp; if (raz.length == 0) {
    requestAnimationFrame(step05);
  } else {
    raz[0].checked = true;  // поставить галку
    raz[0].dispatchEvent(new Event("click"));  // эмулировать клик
    raz[0].dispatchEvent(new Event("click"));
  }
}

С выпадающими списками на сайте что-то перемудрили, я решила не искушать судьбу :)

в f t
наверх ↑

5 комментариев:

Космо Мизраил Горыныч
Вот это хардкор с записью .-.
полторы минуты... ужас
NMitra
Никогда бы не подумала, что мне пригодятся знания JS. В наиболее популярные школы родители нанимают программистов. Одна мама рассказала, что они всем отделом набирали текст в час иск для ребёнка руководителя :)
Космо Мизраил Горыныч
Это ужасно. Так и дискриминация скоро пойдёт по навыкам ПК или найму программистов.
Николай Беспалов
НАТАЛЬЯ!СПАСИБО ЗА СКРИПТ!
NMitra
Для читателей ничего не жалко :)