使用href / Javascript访问锚点

时间:2012-05-19 22:13:34

标签: javascript phantomjs href casperjs

在具有附加到javascript的href的锚点的系统上测试CasperJS。做通常的

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 repos表明Casper有一个CasperUtils / ClientUtils库,它似乎有一个__utils__,它有一个click方法,可以调用href="javascript:foo()"个元素。

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

因此,尝试在this.click()内调用casper.evaluate()将失败 - 您正在运行的功能无法访问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
    });
});

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