Способ автоматически нажать кнопку, которая содержит определенный текст? - PullRequest
0 голосов
/ 18 января 2019

Я без устали искал способ автоматического выбора кнопки формы опроса, содержащей определенное слово. Я использую Tampermonkey в Google Chrome. В этом случае я хотел бы автоматически выбирать кнопки со словом «мужской» в них.

Вот пример типа кнопки, о которой я говорю (включая CSS / HTML):

enter image description here

Итак, на вопрос: «Какого вы пола?», Я бы хотел автоматически выбрать «Мужской». Я перебираю все вопросы, связанные с переполнением стека, которые могут быть полезны, но безрезультатно. Я выбрал метод на основе меток и использовал «textContent», чтобы можно было распознать текст в вопросе формы.

Вот код, с которым я сейчас работаю (из Как я могу автоматически выбрать переключатель с 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(); 
    }
}

К сожалению, код не работает, и кнопка «Мужской» не выбрана при загрузке страницы. Это можно проверить на 2-й странице следующего веб-сайта: https://tasupport.co1.qualtrics.com/jfe/form/SV_0qez6NHJGoCAmMt (откуда взялся приведенный выше снимок экрана).

Я также попробовал следующее с jQuery ( Как автоматически нажать эту кнопку с помощью тампона? ):

// ==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 ]

0 голосов
/ 18 января 2019

Я попробовал следующее в консоли разработчика, и оно работает. Надеюсь, это поможет

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

У ярлыка есть идентификатор, который вы можете использовать. Вам не нужно искать в textContent для мужчины, когда вы используете эти 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
);
0 голосов
/ 18 января 2019

Нет элемента кнопки. Элемент, слушающий событие нажатия пользователя, на самом деле является скрытым вводом:

<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()
    }
}
0 голосов
/ 18 января 2019

Попробуйте, если это работает

$( ".SingleAnswer span" ).each(function( index ) {
       if($( this ).text().includes("Male")) {
           $( this ).click()
       }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...