代码之家  ›  专栏  ›  技术社区  ›  theCrabNebula

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

  •  0
  • theCrabNebula  · 技术社区  · 6 年前

    我一直在焦躁不安地寻找一种自动选择包含特定单词的调查表单按钮的方法。我在谷歌Chrome中使用了Tampermonkey。在这种情况下,我想自动选择按钮,其中包含单词“male”。

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

    enter image description here

    所以对于这个问题:“你的性别是什么?”,我想自动选择“male”。我已经浏览了所有StackOverflow问题,我发现这些问题可能会有所帮助,但没有任何结果。我选择了一种基于标签的方法,并使用“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”按钮。这可以在以下网站的第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();
    });
    

    同样,什么也没有。

    有几个与我类似的问题分散在stackoverflow中,但是没有一个解决方案在这里起作用,或者我正在使用的代码已经过时了。我非常感谢你的帮助。事先谢谢。

    3 回复  |  直到 6 年前
        1
  •  1
  •   d-h-e    6 年前

    我已经在dev控制台中尝试了以下方法,它可以工作。 希望它有帮助

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

    标签有一个可以使用的ID。使用这些ID时,不需要在文本内容中搜索男性。

    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
    );
    
        2
  •  1
  •   Merhat Pandzharov    6 年前

    试试看这个是否有效

    $( ".SingleAnswer span" ).each(function( index ) {
           if($( this ).text().includes("Male")) {
               $( this ).click()
           }
    });
    
        3
  •  1
  •   Saraband    6 年前

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

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