Заполните и отправьте текстовое поле программно в javascript

Я пытаюсь автоматизировать отправку ответов на мои сообщения Steemit, используя простой JS или JQuery.

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

Как я могу правильно запускать события keydown / keypress / keyup в текстовой области, чтобы имитировать "классическое" взаимодействие пользователя для отправки ответа?

Спасибо


Пример цели: https://steemit.com/usa/@gaottantacinque/happy-4th-of-july

В консоли Dev Tools:

function nap (durationMs) {
  new Promise(resolve => setTimeout(() => resolve(), durationMs))
}

async function replyToPost() {
  var replyBtn = document.getElementsByClassName("PostFull__reply")[0]
    .getElementsByTagName('a')[0];
  replyBtn.click();
  await nap(1000);
  var textarea = document.getElementsByTagName('textarea')[0];
  const msg = 'My programmatically generated comment goes here';
  textarea.focus();
  textarea.click();
  textarea.value = msg; // textarea.innerHTML = msg; textarea.innerText = msg;
  await nap(100);
  var postReplyBtn = document.querySelectorAll('[type=submit]')[1];
  // postReplyBtn.disabled = false;
  postReplyBtn.click();
}

replyToPost();

Заметки: Этот код заполняет текстовое поле, но кнопка по-прежнему неактивна. Просто вручную щелкнув текстовое поле и набрав что-нибудь, вместо этого активируется кнопка.

Кроме того, значение textarea, вставленное программно, исчезает после щелчка, например, на фоне, но не при обычном вводе.

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

Heretic Monkey 06.07.2018 22:39

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

Gabe 06.07.2018 22:40

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

Heretic Monkey 06.07.2018 22:41

Стим-боты в порядке: steemit.com/steem/@earthnation/…

Gabe 06.07.2018 22:42

@HereticMonkey нашел решение. Это ошибка в ReactJs.

Gabe 07.07.2018 06:57
Поведение ключевого слова "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) для оценки ваших знаний,...
3
5
1 454
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Попробовав все, я обнаружил, что проблема, похоже, связана с ошибкой в ​​React при запуске onchange для текстовых полей.

Подробнее об ошибке

Есть обходной путь ..

Решение:

function setNativeValue(element, value) {
  const valueSetter = Object.getOwnPropertyDescriptor(element, 'value').set;
  const prototype = Object.getPrototypeOf(element);
  const prototypeValueSetter = Object.getOwnPropertyDescriptor(prototype, 'value').set;

  if (valueSetter && valueSetter !== prototypeValueSetter) {
    prototypeValueSetter.call(element, value);
  } else {
    valueSetter.call(element, value);
  }
}

var textarea = document.getElementsByTagName('textarea')[0];
setNativeValue(textarea, 'My automated comment here');
textarea.dispatchEvent(new Event('input', { bubbles: true }));

в некоторых случаях это может не сработать, как и для меня, но вот общее решение:

 const textarea = document.getElementsByTagName('textarea')[0]
function setNativeValue(element, value) {
  const { set: valueSetter } = Object.getOwnPropertyDescriptor(element, 'value') || {}
  const prototype = Object.getPrototypeOf(element)
  const { set: prototypeValueSetter } = Object.getOwnPropertyDescriptor(prototype, 'value') || {}

  if (prototypeValueSetter && valueSetter !== prototypeValueSetter) {
    prototypeValueSetter.call(element, value)
  } else if (valueSetter) {
    valueSetter.call(element, value)
  } else {
    throw new Error('The given element does not have a value setter')
  }
}
setNativeValue(textarea, 'some text')
textarea.dispatchEvent(new Event('input', { bubbles: true }))

я также хочу поблагодарить предыдущего человека, который писал об этом ... это действительно помогло ОЧЕНЬ

вот где я это нашел:

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