在具有附加到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);
});
或者,如果你有一个指向我可以运行的测试代码案例的指针,那么我们就可以看到它应该如何实现。
答案 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
事件在您运行时已经被触发你的代码。