【问题标题】:How to activate javascript links with zombie.js如何使用zombie.js 激活javascript 链接
【发布时间】:2012-01-27 01:09:57
【问题描述】:

我正在尝试获取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()")

它有效。 我错过了什么?

【问题讨论】:

    标签: node.js zombie.js


    【解决方案1】:

    Zombie.js 不处理 href 上带有“javascript:”的链接(在撰写本文时)。

    我通过在源代码中添加 3 行来修复它。查找 /node_modules/zombie/lib/zombie/history.coffee 并添加用 FIX 注释的 3 行(请注意,在 .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
    

    我可能应该在 github.com 上 forkzombie.js 并将其放入 Pull Request 中,但在此之前,欢迎您使用这个 sn-p,或者在我之前提出那个 pull request。

    【讨论】:

      【解决方案2】:

      好吧,它似乎不理解javascript:code hrefs。也许您可以获取 url,删除 javascript:-section 并评估它?

      免责声明:我自己还没有使用过zombie.js。

      【讨论】:

        【解决方案3】:

        zombie.js API 表示它将 CSS 选择器或链接文本作为browser.clickLink() 的第一个参数。所以你的代码应该可以工作。

        但如果您可以控制页面并使用 CSS 选择器,请尝试向链接添加 id

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

        【讨论】:

        • 我试过了,结果是一样的。找到了链接,问题出在 javascript:go() 部分。其他链接确实有效。
        • 哦,我明白了。看起来 tuhoojabotti 的答案是正确的,看起来zombie.js 不支持那种链接。已经为这个问题打开了一个issue
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-01-27
        • 1970-01-01
        • 2017-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多