自动单击包含某些文本的按钮的方法?

时间:2019-01-18 11:07:17

标签: javascript greasemonkey autofill userscripts tampermonkey

我一直在不停地寻找一种自动选择包含特定单词的调查表单按钮的方法。我正在Google Chrome浏览器中使用Tampermonkey。在这种情况下,我想自动选择其中带有“男性”一词的按钮。

以下是我正在谈论的按钮类型(包括CSS / HTML)的示例:

enter image description here

对于这样的问题:“您的性别是?”,我想自动选择“男性”。我一直在研究所有的stackoverflow问题,这些问题可能会有所帮助,但没有结果。我选择了一种基于标签的方法,并使用“ textContent”希望能够识别表单问题中的文本。

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

public class Program
        {
            static void Main(string[] args)
            {
                //it provide json  
                var testCont = thirdpartyapi();
                var dataList = new List<TestResponse>();
                foreach (var testData in testCont.Elements())
                {
                    var data = new TestResponse();
                    data.col1 = Convert.ToInt32(testData.Id().RollId());
                    data.col2 = testData.Data().MType().ToString();
                    dataList.Add(data);
                }

            }


            public class TestResponse
            {
                public int col1 { get; set; }
                public string col2 { get; set; }


            }
        }

不幸的是,该代码不起作用,并且在页面加载时未选择“男性”按钮。可以在以下网站的第二页上进行测试:https://tasupport.co1.qualtrics.com/jfe/form/SV_0qez6NHJGoCAmMt(上面的屏幕快照来自此位置)。

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

// ==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(); 
    }
}

再次,什么也没有。

有一些类似的问题需要解决,但是这些解决方案似乎都无法在这里工作,或者我正在使用的代码已经过时。我将不胜感激。预先感谢。

3 个答案:

答案 0 :(得分:1)

尝试一下是否可行

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

答案 1 :(得分:1)

我已经在开发控制台中尝试了以下方法,并且可以正常工作。 希望对您有帮助

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

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

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

修改

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

// ==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
);

答案 2 :(得分:1)

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

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

因此,您需要调用click元素的input方法来触发它。例如,您可以这样做:

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

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