使用 href/Javascript 访问锚点

Accessing anchor with href/Javascript

本文关键字:访问 Javascript href 使用      更新时间:2023-09-26

在一个系统上测试 CasperJS,该系统有一个锚点,并将 href 附加到 javascript。做平常的事

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__,该方法是调用href="javascript:foo()"元素的方式。

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

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

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

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

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

看起来这里的问题是围绕函数范围的混淆。这是使用 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事件已经触发。