【问题标题】:Fill and submit textarea programmatically in javascript在 javascript 中以编程方式填写和提交 textarea
【发布时间】:2018-12-15 09:55:01
【问题描述】:

我正在尝试使用纯 JS 或 Jquery 自动提交对我的 Steemit 帖子的回复。

我使用了下面的 javascript 代码,但该按钮仍处于禁用状态,因此不允许发布回复/评论。

如何正确触发 textarea 上的 keydown / keypress / keyup 事件,以模拟用户“经典”交互以发送回复?

谢谢


目标示例:https://steemit.com/usa/@gaottantacinque/happy-4th-of-july

在开发工具控制台中:

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 值在单击背景后会消失,但在正常输入时不会消失。

【问题讨论】:

  • 您可能应该确保阅读该网站的服务条款,以确保您可以使用机器人;他们以编程方式难以做到这一点可能是有原因的......
  • 我会仔细检查,但我认为这没有任何问题。有大量的机器人,社区鼓励使用它们..
  • 在这种情况下,以前曾询问过以编程方式触发事件:Triggering a keydown event programmatically in vanilla Javascript 看看这是否适合您。
  • Steem 机器人正常:steemit.com/steem/@earthnation/…
  • @HereticMonkey 找到了解决方案。这是 ReactJs 中的一个错误。

标签: javascript html reactjs automation steemit


【解决方案1】:

在尝试了所有之后,我发现问题似乎是 React 中触发 textareas 的 onchange 的错误。

More info on the bug

有一个解决方法..

解决方案:

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 }));

【讨论】:

    【解决方案2】:

    这可能不适用于某些情况,因为它不适合我,但这里有一个通用的解决方案:

     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 }))
    

    我还要感谢之前发帖的人......这真的很有帮助

    here is where i found it:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-16
      • 1970-01-01
      • 2010-11-22
      • 1970-01-01
      相关资源
      最近更新 更多