如何使用 Greasemonkey 自动选择特定的单选按钮?

我想用 Greasemonkey 自动回答问题.我有问题和答案,但如何选择它们?

I want to automatically answer questions with Greasemonkey. I have the questions and answers, but how can select them?

这是 HTML:

<div class="vito_form_q">
    <div class="vito_form_title_min_no">
        <span id="ContentPlaceHolder1_lblquestionNo">8</span>
    </div>
    <div class="vito_form_title_min">
        <span id="ContentPlaceHolder1_lblquestion">Which sport is not playing with the ball?</span>
    </div>
    <div class="clearfloat"></div>
    <div class="meter orange nostripes"><span style="width: 100%"></span></div>
    <div class="quest">
        <table id="rbAnswer" class="q1">
        <tr><td>
            <input id="rbAnswer_0" type="radio" name="ctl00$ContentPlaceHolder1$rbAnswer" value="157"/><label for="rbAnswer_0">Handball</label>
        </td></tr>
        <tr><td>
            <input id="rbAnswer_1" type="radio" name="ctl00$ContentPlaceHolder1$rbAnswer" value="158"/><label for="rbAnswer_1">Basketball</label>
        </td></tr>
        <tr><td>
            <input id="rbAnswer_2" type="radio" name="ctl00$ContentPlaceHolder1$rbAnswer" value="159"/><label for="rbAnswer_2">Football</label>
        </td></tr>
        <tr><td>
            <input id="rbAnswer_3" type="radio" name="ctl00$ContentPlaceHolder1$rbAnswer" value="160"/><label for="rbAnswer_3">Fencing</label>
        </td></tr>


例如,对于这个问题:

    <span id="ContentPlaceHolder1_lblquestion">Which sport is not playing with the ball?</span>

选择答案:

<td>
    <input id="rbAnswer_3" type="radio" name="ctl00$ContentPlaceHolder1$rbAnswer" value="160" />
    <label for="rbAnswer_3">Fencing</label>

如何使用 Greasemonkey 做到这一点?

How can I do this with Greasemonkey?

推荐答案

制作一系列问题和答案,如下所示:

Make an array of questions and answers, like so:

var answerKey   = [
      { q: "sport is not playing with the ball", a: "Fencing" }
    , { q: "Best SciFi franchise",               a: "Star Trek" }
    , { q: "Most badass monster",                a: "Bun-Bun" }
    , { q: "Most toxic chemical in this list",   a: "Mountain Dew" }
    // etc.
];


然后将此行添加到 Greasemonkey 脚本的元数据块:

Then add this line to the Metadata Block of your Greasemonkey script:

// @require  http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js


然后,使用 jQuery 的强大功能,您的脚本可以使用以下代码检查正确的单选按钮:


Then, using the awesome power of jQuery, your script can check the right radio buttons with the following code:

(在 jsFiddle 上查看底层代码的演示.)p>

var answerKey   = [
      { q: "sport is not playing with the ball", a: "Fencing" }
    , { q: "Best SciFi franchise", a: "Star Trek" }
    , { q: "Most badass monster", a: "Bun-Bun" }
    , { q: "Most toxic chemical in this list", a: "Mountain Dew" }
    // etc.
];

//--- Loop through the question(s) on the page and answer then if possible.
var questionTxt = $("div div.vito_form_title_min span[id$='question']");

questionTxt.each ( function () {
    var bFoundAnswer    = false;
    var answerTxt       = getAnswer (this.textContent);
    if (answerTxt) {
        //--- We have the answer text, now find the matching radio button and select it.
        var ansForThisQ     = $(this).parent (). nextAll ("div.quest").find ("label");

        ansForThisQ.each ( function () {
            var zRegExp     = new RegExp (answerTxt, 'i');
            if (zRegExp.test (this.textContent) ) {
                bFoundAnswer    = true;
                var label       = $(this);
                var radioButt   = $("#" + label.prop ("for") );
                radioButt.prop  ("checked", "checked");
                label.css       ("background", "lime");
                return false;   // End loop
            }
        } );
    }
    else {
        alert ("I don't know how to answer: '" + this.textContent + "'");
        $(this).css ("background", "pink");
    }
    if ( answerTxt  &&  ! bFoundAnswer) {
        alert ("The page does not have the specified answer for the question: '" + this.textContent + "'");
        $(this).css ("background", "pink");
    }
} );

function getAnswer (questionText) {
    for (var J = answerKey.length - 1;  J >= 0;  --J) {
        var zRegExp = new RegExp (answerKey[J].q, 'i');

        if (zRegExp.test (questionText) )
            return answerKey[J].a;
    }
    return null;
}

相关文章