Phantomjs 从evaluate方法访问CasperJS变量

Phantomjs 从evaluate方法访问CasperJS变量,phantomjs,casperjs,Phantomjs,Casperjs,我正试图浏览一个网站。我有一个网站,它有一个选择元素,所以在选择元素后,另一个选择框会动态出现,依此类推 我可以使用waitForSelector方法,但我现在不知道动态元素的id,也可以使用wait等待几秒钟 但是,对于动态加载的内容,页面将发送一个ajax请求。我使用函数onResourceRequest和onResourceReceived来保持计数,这样每当请求资源时,我都会增加计数,在事件reource.received或onResourceError发生后,我可以减少计数并检查计数是

我正试图浏览一个网站。我有一个网站,它有一个选择元素,所以在选择元素后,另一个选择框会动态出现,依此类推

我可以使用waitForSelector方法,但我现在不知道动态元素的id,也可以使用wait等待几秒钟

但是,对于动态加载的内容,页面将发送一个ajax请求。我使用函数onResourceRequest和onResourceReceived来保持计数,这样每当请求资源时,我都会增加计数,在事件reource.received或onResourceError发生后,我可以减少计数并检查计数是否为0,我将向前移动或等待请求完成

但是我使用evaluate方法刮取页面,并且我递增和递减计数的变量在CasperJS上下文中。我应该如何从evaluate函数访问CasperJS中声明的变量,以便检查所有请求是否已完成。

由于evaluate是沙盒式的,所以不能直接访问外部定义的变量。有多种方法可以将数据从页面上下文控制台消息、警报、page.onCallback、evaluate result传递出去,但只有一种方法可以将数据传递进来,即直接将其作为参数传递给evaluate

问题是你如何传递它,这样你的脚本才有意义

每次都通过 无论何时在页面上下文中执行需要该变量的操作,都可以传入该变量。当您在使用这些信息之前做了大量异步工作时,这可能无法按预期工作,因为此时这些信息可能会过时

主动将其放入页面上下文中 每当该计数发生变化时,您可以将该信息放入页面上下文中的全局范围中:

//在'reource.received'和'onResourceError'事件中执行此操作 casper.evaluatefunctioncount{ 窗口。\u myCount=计数; },计数; 然后,每当您需要在页面上下文中使用该信息时,您只需访问它,因为它已经在窗口中

您可以或多或少地自由嵌套步骤,例如waitForSelector:

casper.waitForSelectorselector1,函数{ var dynamicId=this.evaluatefunction{ ... 返回达尼德; }; this.waitForSelector+dynamicId; }; 卡斯珀函数{ //这仅在找到上一个“+dynamicId”时执行 };