1

在具有附加到 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 存储库表明 Casper 有一个 CasperUtils/ClientUtils 库,该库似乎__utils__有一个 click 方法,这是调用的方式href="javascript:foo()"元素的方法。

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

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

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

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

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

4

1 回答 1

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事件在您运行代码时已经触发。

于 2012-05-21T16:48:26.287 回答