【问题标题】:Way to automatically click button that contains certain text?自动单击包含某些文本的按钮的方法?
【发布时间】:2019-01-18 11:07:17
【问题描述】:

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

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

所以对于“你的性别是什么?”这个问题,我想自动选择“男性”。我一直在处理所有我能找到的可能有帮助的 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(); 
    }
}

很遗憾,代码不起作用,并且在页面加载时未选择“男性”按钮。这可以在以下网站的第二页进行测试: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 中散布着一些类似的问题,但似乎没有一个解决方案在这里有效,或者我正在使用的代码可能已经过时了。我将不胜感激。提前致谢。

【问题讨论】:

    标签: javascript greasemonkey autofill userscripts tampermonkey


    【解决方案1】:

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

    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 网址。

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

    【讨论】:

    • 这也适用于我的控制台!谢谢你。不幸的是,它似乎不适用于 Tampermonkey 中的页面加载。你知道为什么会这样吗?
    • 我认为它可能是 AJAX 驱动的,所以我试图找到处理动态加载的解决方案。
    • 是的,你是对的。 AJAX 请求是问题所在。我已经编辑了我的帖子。希望对你有用
    • 第一个代码也可以。 (不是 jQuery - 普通 JavaScript)const fire = () =&gt; Array.from(document.querySelectorAll('label &gt; span')).find(e =&gt; e.textContent === 'Male').parentElement.click()
    • 如果你知道所有网站都有&lt;label&gt;元素,你也可以使用label作为waitForKeyElements。这不是最佳的,但它会起作用。 waitForKeyElements(“标签”,火);
    【解决方案2】:

    试试看是否可行

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

    【讨论】:

    • 感谢您的回复。我在控制台中尝试过,但一直收到错误:Uncaught TypeError: Cannot read property 'each' of null at :1:26
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2022-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-31
      • 2017-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多