XPath not working to click a button from a Greasemonkey script












1















I would like to open a link that contains the word google. It looks like this:



 <input class="submit" style="background: #409999; border-radius: 10px;" value="open" onclick="Open('143615', '1', 'https://www.google.de/');" type="submit">




I tried this Greasemonkey code:



var snapResults = document.evaluate("//input[contains(@onclick, 'test')]",document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);

for (var i = snapResults.snapshotLength - 1; i >= 0; i--) {
var elm = snapResults.snapshotItem(i);
// do stuff with elm

if (elm) //open the window, which contains "test"
{
elm.singleNodeValue.click(); //there is no effect ...
alert(i+". element opend");
}
else
{
alert(i+". Not found.");
}
}


It has no effect. I would like to open the window via Greasemonkey (click event ?)



When I use alert(elm.href); it says it is "undefined". But the XPath works when I try it in FirePath.










share|improve this question





























    1















    I would like to open a link that contains the word google. It looks like this:



     <input class="submit" style="background: #409999; border-radius: 10px;" value="open" onclick="Open('143615', '1', 'https://www.google.de/');" type="submit">




    I tried this Greasemonkey code:



    var snapResults = document.evaluate("//input[contains(@onclick, 'test')]",document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);

    for (var i = snapResults.snapshotLength - 1; i >= 0; i--) {
    var elm = snapResults.snapshotItem(i);
    // do stuff with elm

    if (elm) //open the window, which contains "test"
    {
    elm.singleNodeValue.click(); //there is no effect ...
    alert(i+". element opend");
    }
    else
    {
    alert(i+". Not found.");
    }
    }


    It has no effect. I would like to open the window via Greasemonkey (click event ?)



    When I use alert(elm.href); it says it is "undefined". But the XPath works when I try it in FirePath.










    share|improve this question



























      1












      1








      1


      1






      I would like to open a link that contains the word google. It looks like this:



       <input class="submit" style="background: #409999; border-radius: 10px;" value="open" onclick="Open('143615', '1', 'https://www.google.de/');" type="submit">




      I tried this Greasemonkey code:



      var snapResults = document.evaluate("//input[contains(@onclick, 'test')]",document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);

      for (var i = snapResults.snapshotLength - 1; i >= 0; i--) {
      var elm = snapResults.snapshotItem(i);
      // do stuff with elm

      if (elm) //open the window, which contains "test"
      {
      elm.singleNodeValue.click(); //there is no effect ...
      alert(i+". element opend");
      }
      else
      {
      alert(i+". Not found.");
      }
      }


      It has no effect. I would like to open the window via Greasemonkey (click event ?)



      When I use alert(elm.href); it says it is "undefined". But the XPath works when I try it in FirePath.










      share|improve this question
















      I would like to open a link that contains the word google. It looks like this:



       <input class="submit" style="background: #409999; border-radius: 10px;" value="open" onclick="Open('143615', '1', 'https://www.google.de/');" type="submit">




      I tried this Greasemonkey code:



      var snapResults = document.evaluate("//input[contains(@onclick, 'test')]",document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);

      for (var i = snapResults.snapshotLength - 1; i >= 0; i--) {
      var elm = snapResults.snapshotItem(i);
      // do stuff with elm

      if (elm) //open the window, which contains "test"
      {
      elm.singleNodeValue.click(); //there is no effect ...
      alert(i+". element opend");
      }
      else
      {
      alert(i+". Not found.");
      }
      }


      It has no effect. I would like to open the window via Greasemonkey (click event ?)



      When I use alert(elm.href); it says it is "undefined". But the XPath works when I try it in FirePath.







      javascript button xpath click greasemonkey






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Sep 24 '13 at 15:10









      Brock Adams

      69.6k15156218




      69.6k15156218










      asked Sep 24 '13 at 13:27









      Jasmin SchmidtJasmin Schmidt

      153




      153
























          1 Answer
          1






          active

          oldest

          votes


















          1














          You say the XPath works, but elm.href is undefined in the GM script. This suggests that the <input> is added via AJAX.



          Your script needs to use AJAX-aware techniques. Something like:



          // ==UserScript==
          // @name _Clicking "Open" buttons
          // @include http://YOUR_SERVER.COM/YOUR_PATH/*
          // @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==
          /*- The @grant directive is needed to work around a design change
          introduced in GM 1.0. It restores the sandbox.
          */
          waitForKeyElements ("input.submit[onclick*='open']", clickOpenBtn);

          function clickOpenBtn (jNode) {
          triggerMouseEvent (jNode[0], "click");
          }

          function triggerMouseEvent (node, eventType) {
          var clickEvent = document.createEvent ('MouseEvents');
          clickEvent.initEvent (eventType, true, true);
          node.dispatchEvent (clickEvent);
          }





          share|improve this answer

























            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f18982976%2fxpath-not-working-to-click-a-button-from-a-greasemonkey-script%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            1














            You say the XPath works, but elm.href is undefined in the GM script. This suggests that the <input> is added via AJAX.



            Your script needs to use AJAX-aware techniques. Something like:



            // ==UserScript==
            // @name _Clicking "Open" buttons
            // @include http://YOUR_SERVER.COM/YOUR_PATH/*
            // @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==
            /*- The @grant directive is needed to work around a design change
            introduced in GM 1.0. It restores the sandbox.
            */
            waitForKeyElements ("input.submit[onclick*='open']", clickOpenBtn);

            function clickOpenBtn (jNode) {
            triggerMouseEvent (jNode[0], "click");
            }

            function triggerMouseEvent (node, eventType) {
            var clickEvent = document.createEvent ('MouseEvents');
            clickEvent.initEvent (eventType, true, true);
            node.dispatchEvent (clickEvent);
            }





            share|improve this answer






























              1














              You say the XPath works, but elm.href is undefined in the GM script. This suggests that the <input> is added via AJAX.



              Your script needs to use AJAX-aware techniques. Something like:



              // ==UserScript==
              // @name _Clicking "Open" buttons
              // @include http://YOUR_SERVER.COM/YOUR_PATH/*
              // @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==
              /*- The @grant directive is needed to work around a design change
              introduced in GM 1.0. It restores the sandbox.
              */
              waitForKeyElements ("input.submit[onclick*='open']", clickOpenBtn);

              function clickOpenBtn (jNode) {
              triggerMouseEvent (jNode[0], "click");
              }

              function triggerMouseEvent (node, eventType) {
              var clickEvent = document.createEvent ('MouseEvents');
              clickEvent.initEvent (eventType, true, true);
              node.dispatchEvent (clickEvent);
              }





              share|improve this answer




























                1












                1








                1







                You say the XPath works, but elm.href is undefined in the GM script. This suggests that the <input> is added via AJAX.



                Your script needs to use AJAX-aware techniques. Something like:



                // ==UserScript==
                // @name _Clicking "Open" buttons
                // @include http://YOUR_SERVER.COM/YOUR_PATH/*
                // @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==
                /*- The @grant directive is needed to work around a design change
                introduced in GM 1.0. It restores the sandbox.
                */
                waitForKeyElements ("input.submit[onclick*='open']", clickOpenBtn);

                function clickOpenBtn (jNode) {
                triggerMouseEvent (jNode[0], "click");
                }

                function triggerMouseEvent (node, eventType) {
                var clickEvent = document.createEvent ('MouseEvents');
                clickEvent.initEvent (eventType, true, true);
                node.dispatchEvent (clickEvent);
                }





                share|improve this answer















                You say the XPath works, but elm.href is undefined in the GM script. This suggests that the <input> is added via AJAX.



                Your script needs to use AJAX-aware techniques. Something like:



                // ==UserScript==
                // @name _Clicking "Open" buttons
                // @include http://YOUR_SERVER.COM/YOUR_PATH/*
                // @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==
                /*- The @grant directive is needed to work around a design change
                introduced in GM 1.0. It restores the sandbox.
                */
                waitForKeyElements ("input.submit[onclick*='open']", clickOpenBtn);

                function clickOpenBtn (jNode) {
                triggerMouseEvent (jNode[0], "click");
                }

                function triggerMouseEvent (node, eventType) {
                var clickEvent = document.createEvent ('MouseEvents');
                clickEvent.initEvent (eventType, true, true);
                node.dispatchEvent (clickEvent);
                }






                share|improve this answer














                share|improve this answer



                share|improve this answer








                edited May 23 '17 at 12:20









                Community

                11




                11










                answered Sep 24 '13 at 15:04









                Brock AdamsBrock Adams

                69.6k15156218




                69.6k15156218
































                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f18982976%2fxpath-not-working-to-click-a-button-from-a-greasemonkey-script%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    Wiesbaden

                    Marschland

                    Dieringhausen