Как активировать ссылки javascript с помощью zombie.js - PullRequest
4 голосов
/ 22 января 2012

Я пытаюсь получить get zombie.js, чтобы активировать ссылку, которая использует javascript. Страница, на которой я тестирую это:

 <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>

Сценарий, который я использую:

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

Я получаю сообщение об ошибке:

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)

Когда я использую

browser.evaluate("go()")

это работает. Чего мне не хватает?

Ответы [ 3 ]

6 голосов
/ 26 января 2012

Zombie.js не обрабатывает ссылки с "javascript:" на href (на момент написания этой статьи).

Я исправил это, добавив 3 строки в исходный код.Найдите /node_modules/zombie/lib/zombie/history.coffee и добавьте 3 строки с комментариями к FIX (помните, что в .coffee вы должны соблюдать отступы, т. Е. Используйте 2 пробела):

# 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Вероятно, следует распаковать zombie.js на github.com и поместить его в запрос на извлечение, но до тех пор вы можете использовать этот фрагмент или сделать этот запрос передо мной.

0 голосов
/ 22 января 2012

API zombie.js говорит, что в качестве первого параметра для browser.clickLink() используется селектор CSS или текст ссылки.Так что ваш код должен работать.

Но попробуйте добавить идентификатор в ссылку, если у вас есть контроль над страницей, и с помощью селектора CSS

browser.clickLink('#thelink', function(e, browser, status) {
  var temp = browser.text("div#test123");
  console.log("content:", temp);
});
0 голосов
/ 22 января 2012

Ну, похоже, он не понимает javascript:code hrefs. Возможно, вы можете получить URL, удалить раздел javascript: и оценить его?

Отказ от ответственности: я еще не использовал zombie.js.

...