【问题标题】:Accessing anchor with href/Javascript使用 href/Javascript 访问锚点
【发布时间】:2012-05-19 22:13:34
【问题描述】:

在一个系统上测试 CasperJS,该系统有一个带有附加到 javascript 的 href 的锚点。照常做

casper.then(function() {
this.evaluate(function() {
//      document.querySelector('a[id="CLASS_SRCH_WRK2_SSR_PB_CLASS_SRCH"]').click();    // works in FF
//  window.onload=submitAction_win0(document.win0,'CLASS_SRCH_WRK2_SSR_PB_CLASS_SRCH');

      //eval("submitAction_win0(document.win0,'CLASS_SRCH_WRK2_SSR_PB_CLASS_SRCH_1');");
//submitAction_win0(document.win0,'CLASS_SRCH_WRK2_SSR_PB_CLASS_SRCH');
//  window.onload=submitAction_win0(document.win0,'CLASS_SRCH_WRK2_SSR_PB_CLASS_SRCH');

//      this.click('a[id="CLASS_SRCH_WRK2_SSR_PB_CLASS_SRCH"]');
//      click('a[id="CLASS_SRCH_WRK2_SSR_PB_CLASS_SRCH"]');
//      self.click('a[id="CLASS_SRCH_WRK2_SSR_PB_CLASS_SRCH"]');
//      this.this.click('a[id="CLASS_SRCH_WRK2_SSR_PB_CLASS_SRCH"]');
..

});

});

上述方法均无效。项目的 Git 存储库表明 Casper 有一个 CasperUtils/ClientUtils 库,该库似乎有一个 __utils__,它有一个 click 方法,这是调用 href="javascript:foo()" 元素的方法。

但是,我似乎无法弄清楚如何运行它。

如果有人使用过 CasperJS,并且有关于如何实现的代码示例,我们将不胜感激!

理想情况下,最终结果应该是这样的:

casper.then(function() {
  e=document.querySelector("id['foo']");
  CasperUtilsSomething.click(e);
});

或者,如果你有一个指向我可以运行的测试代码用例的指针,那会让我们看看应该如何实现它。

【问题讨论】:

  • 在使用此类库之前,您最好阅读一些教程。
  • 安德烈亚斯。你好。谢谢回复。我试图阅读我能找到的关于如何实现这一点的所有内容。您是否对指导如何实现这一点的教程有任何了解。我找不到任何内容,包括来自 youtube、GIT 存储库、支持论坛、邮件列表档案等。还有其他你能想到的地方吗?我只是把这里作为最后一个问题。
  • "tom" (a.k.a bruce),帮自己一个忙,完成本教程 ejohn.org/apps/learn — 这样您可能会更了解这里发生的事情
  • 您好 Niko 感谢您的指点。我不确定这是一个“理解javascript:问题。不要误会我的意思,更多的javascript理解显然会有所帮助,但我倾向于认为这是对casper / phantom问题的理解。我们得到了同样的事情在 Selenium/Java 中运行/运行几个小时,而无需“学习”java!这里似乎还缺少其他东西。但是谢谢,我们将查看教程.

标签: javascript phantomjs href casperjs


【解决方案1】:

看起来这里的问题是对函数范围的混淆。这是使用 PhantomJS(CasperJS 建立在其之上)的棘手问题 - 有两个完全独立的范围,其中一个在 PhantomJS 上下文中运行并可以访问 casper 对象,以及“沙盒”范围远程代码在其中运行 - 例如,在 casper.evaluate() 中运行的任何东西都在远程上下文的沙箱中运行,无法访问 casper 对象或其方法。

所以尝试在casper.evaluate() 中调用this.click() 将会失败——您正在运行的函数无法访问casper 实例,而this 将引用浏览器中的window 对象.

通常,您这样做的方式是:

casper.then(function() {
    casper.click('#CLASS_SRCH_WRK2_SSR_PB_CLASS_SRCH');
    casper.evaluate(function() {
        // some function that needs to run after clicking
    });
});

另请注意,据我所知,您通常无法在 casper.evaluate() 中运行任何 window.onload 代码 - 窗口的 load 事件在您运行代码时已经触发。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-21
    • 2010-09-08
    相关资源
    最近更新 更多