Javascript 自动单击多个按钮并添加WaitFork元素

Javascript 自动单击多个按钮并添加WaitFork元素,javascript,greasemonkey,autofill,userscripts,tampermonkey,Javascript,Greasemonkey,Autofill,Userscripts,Tampermonkey,我一直在寻找一种方法来自动选择包含不同网站中特定单词的调查表单按钮。我使用谷歌浏览器中的Tampermonkey来实现这一点。在这种情况下,我想自动选择带有“男性”和“先生”字样的按钮 下面是我所说的按钮类型的示例(包括CSS/HTML): 我目前在Tampermonkey中使用以下代码来实现按压效果: // ==UserScript== // @name Male Test 3 // @namespace http://tampermonkey.net/ // @ver

我一直在寻找一种方法来自动选择包含不同网站中特定单词的调查表单按钮。我使用谷歌浏览器中的Tampermonkey来实现这一点。在这种情况下,我想自动选择带有“男性”和“先生”字样的按钮

下面是我所说的按钮类型的示例(包括CSS/HTML):

我目前在Tampermonkey中使用以下代码来实现按压效果:

// ==UserScript==
// @name         Male Test 3
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       You
// @match        https://tasupport.co1.qualtrics.com/jfe/form/SV_0qez6NHJGoCAmMt
// @match        https://tasupport.co1.qualtrics.com/jfe2/form/SV_0qez6NHJGoCAmMt/next?rand=775440350&tid=1&t=1547858208474
// @require     http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js
// @require     https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant       GM_addStyle
// ==/UserScript==

const fire = () => Array.from(document.querySelectorAll('label > span')).find(e => e.textContent === 'Male').parentElement.click();

waitForKeyElements (
    "label",
    fire
);
上面的脚本在上面的站点页面加载时成功地选择了“男性”,但我不确定如何同时点击多个按钮。我还想自动选择“先生”,这是页面上的另一个按钮。所以最终,我希望脚本在页面加载时选择男性和男性。幸运的是,它们都在一个“标签”内,所以我认为Waitfork可能没问题

不幸的是,JavaSript不是我的舵手,我很难找到正确的语法来实现这一点。这似乎是一个很容易解决的问题

我试过像
find(e=>e.textContent==='Male','Mr.')
之类的方法,但都没有用


基本上,我所需要做的就是将“Mr.”的文本和已经指定的“Male.”一起包含在内。任何和所有的帮助都将非常棒。

您可以创建一个函数,在给定要查找的
文本的情况下,
查找相应的元素并单击其父元素。一旦
waitforkyelments
触发,用
Male
Mr调用该函数。

const findAndClickParent = text => [...document.querySelectorAll('label > span')]
  .find(e => e.textContent === text)
  .parentElement
  .click();

waitForKeyElements (
  "label",
  () => {
    findAndClickParent('Male');
    findAndClickParent('Mr.');
  }
);
如果希望提高效率,可以在回调触发时创建这些匹配元素的对象(假设不关心重叠),并每次访问相应的属性,例如:

waitForKeyElements (
  "label",
  () => {
    const parentsByTextContent = Array.prototype.reduce.call(
      document.querySelectorAll('label > span'),
      (a, e) => {
        a[e.textContent] = e.parentElement;
        return a;
      },
      {}
    );
    parentsByTextContent['Male'].click();
    parentsByTextContent['Mr.'].click();
  }
);

工作得很好。非常感谢你。还将尝试第二种方法