How to activate javascript links with zombie.js

5.5k Views Asked by At

I am trying to get get zombie.js to activate a link that uses javascript. The page I am testing it on is:

 <html>
  <body>
  <div id="test123">
  START_TEXT
  </div>
  <a href="javascript:go()">GO</a><br/>
  <script type="text/javascript">
  go = function() {
  var el = document.getElementById("test123");
  el.innerHTML = "CHANGED";
  }
  </script>
  </body>
  </html>

The Script I am using is:

var zombie = require("zombie");
var browser = new zombie.Browser;

browser.visit( "http://localhost:8000/testpage.html",
        function() {
                browser.clickLink("GO", function(e, browser, status) {
                        var temp = browser.text("div#test123");
                        console.log("content:", temp);
                  });
});

I get the error message:

node.js:201
        throw e; // process.nextTick error, or 'error' event on first tick
              ^
Error: Cannot load resource: javascript:go()
    at History._resource (/home/julian/temp/node_modules/zombie/lib/zombie/history.coffee:75:15)
    at History._pageChanged (/home/julian/temp/node_modules/zombie/lib/zombie/history.coffee:60:21)
    at History._assign (/home/julian/temp/node_modules/zombie/lib/zombie/history.coffee:213:19)
    at Object.location (/home/julian/temp/node_modules/zombie/lib/zombie/history.coffee:51:24)
    at Object.click (/home/julian/temp/node_modules/zombie/lib/zombie/jsdom_patches.coffee:31:59)
    at Object.dispatchEvent (/home/julian/temp/node_modules/zombie/node_modules/jsdom/lib/jsdom/level2/html.js:480:47)
    at /home/julian/temp/node_modules/zombie/lib/zombie/eventloop.coffee:130:16
    at EventLoop.perform (/home/julian/temp/node_modules/zombie/lib/zombie/eventloop.coffee:121:7)
    at EventLoop.dispatch (/home/julian/temp/node_modules/zombie/lib/zombie/eventloop.coffee:129:19)
    at Browser.dispatchEvent (/home/julian/temp/node_modules/zombie/lib/zombie/browser.coffee:220:30)

When I use

browser.evaluate("go()")

it works. What am I missing?

3

There are 3 best solutions below

0
On BEST ANSWER

Well it doesn't seem to understand javascript:code hrefs. Perhaps you can get the url, remove the javascript:-section and evaluate it?

Disclaimer: I haven't used zombie.js myself yet.

2
On

The zombie.js API says it takes a CSS selector or the link text as the first parameter for browser.clickLink(). So your code should work.

But try adding an id to the link, if you have control over the page, and using a CSS selector

browser.clickLink('#thelink', function(e, browser, status) {
  var temp = browser.text("div#test123");
  console.log("content:", temp);
});
0
On

Zombie.js doesn't handle links with "javascript:" on href (at the time of this writing).

I fixed it by adding 3 lines to the source code. Look for /node_modules/zombie/lib/zombie/history.coffee and add the 3 lines commented with FIX (beware that in .coffee you must respect indentation, ie. use 2 spaces):

# Location uses this to move to a new URL.
_assign: (url)->
  url = @_resolve(url)

  # FIX: support for javascript: protocol href
  if url.indexOf("javascript:")==0
    @_browser.evaluate(url.substr("javascript:".length))
    return

  was = @_stack[@_index]?.url # before we destroy stack
  @_stack = @_stack[0..@_index]
  @_stack[++@_index] = new Entry(this, url)
  @_pageChanged was

I probably should fork zombie.js on github.com and put this into a Pull Request, but until then you are welcome to do use this snippet, or make that pull request before me.