自动单击包含特定文本的按钮的方法?

Way to automatically click button that contains certain text?

我一直在焦躁不安地寻找一种方法来自动 select 包含特定单词的调查表按钮。我在 Google Chrome 中使用 Tampermonkey。在这种情况下,我想自动 select 带有单词 'Male' 的按钮。

这里是我所说的按钮类型的例子(包括CSS/HTML):

所以对于问题:"What is your gender?",我想自动 select 'Male.' 我已经 运行 解决了我能找到的所有 Whosebug 问题可能有帮助,但没有结果。我选择了 label-based 方法并使用 "textContent" 希望能够识别表单问题中的文本。

这是我目前正在使用的代码(来自 How can I auto-select a radio button with Greasemonkey?):

// ==UserScript==
// @name         Button Text Form Filler
// @include      https://tasupport.co1.qualtrics.com/jfe/form/SV_0qez6NHJGoCAmMt
// @version      1.0
// @description  Demonstration script to change form values
// ==/UserScript==

var labels = document.getElementsByTagName('label'); 
for (var i = 0; i < labels.length; ++i) { 
    if (labels[i].textContent == "Male") { 
        labels[i].click(); 
    }
}

不幸的是,代码不起作用,'Male' 的按钮在页面加载时未 selected。这可以在以下网站的第 2 页进行测试:https://tasupport.co1.qualtrics.com/jfe/form/SV_0qez6NHJGoCAmMt(上面的屏幕截图来自此处)。

我还用 jQuery (How do I automatically click this button with tampermonkey?) 尝试了以下操作:

// ==UserScript==
// @name         jQuery Button Test
// @version      0.1
// @require      https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js
// @include      https://tasupport.co1.qualtrics.com/jfe/form/SV_0qez6NHJGoCAmMt
// ==/UserScript==

$(document).ready(function() {
  $("button:contains('Male')").click();
});

同样,没有。

我的一些类似问题分散在 Whosebug 中,但 none 的解决方案似乎在这里有效,或者我正在使用的代码可能已过时。我将不胜感激任何帮助。提前致谢。

尝试一下是否有效

$( ".SingleAnswer span" ).each(function( index ) {
       if($( this ).text().includes("Male")) {
           $( this ).click()
       }
});

我已经在开发控制台中尝试了以下操作并且它有效。 希望对你有帮助

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

该标签有一个您可以使用的 ID。使用这些 id 时,您无需在 textContent 中搜索 Male。

document.getElementById('QID2-1-label').click()

编辑

对于 tampermonkey,您需要一些设置来处理 xhr 请求。 您需要 jQuery、waitForKeyElements.js 并且 @match 需要您的 xhr url。

// ==UserScript==
// @name         New Userscript
// @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();

// another option
// const fire = () => document.getElementById('QID2-1-label').click();

waitForKeyElements (
    "#QID2-1-label",
    fire
);

没有按钮元素。监听用户点击事件的元素其实是一个隐藏的输入:

<li class="Selection reg">
  <!-- this input -->
  <input choiceid="1" aria-labelledby="QID2-1-label" class="radio QR-QID2-1 QWatchTimer" type="radio" name="QR~QID2" id="QR~QID2~1" value="1" data-runtime-checked="runtime.Selected">

  <!-- not these elements -->
  <label for="QR~QID2~1" class="q-radio q-checked" aria-hidden="true" data-runtime-class-q-checked="runtime.Choices.1.Selected"></label>  <span class="LabelWrapper"> 
  <label for="QR~QID2~1" id="QID2-1-label" class="SingleAnswer  q-checked" data-runtime-class-q-checked="runtime.Choices.1.Selected"><span>Male</span></label></span> <div class="clear"></div>
</li>

所以需要调用input元素的click方法来触发。例如你可以这样做:

var labels = document.getElementsByTagName('label');

for (var i = 0; i < labels.length; ++i) { 
    if (labels[i].textContent == "Male") { 
        labels[i].parentElement.parentElement.firstElementChild.click()
    }
}