当我使用示例here时,我发现同一页面上的一系列hashbang链接(动态创建不同的内容)仅在第一次生成内容时。对于所有其他结果,将使用第一个链接中的this.getHTML()
。
E.g。当我加载http://test.localhost/
并找到:
http://test.localhost/#!/page1
http://test.localhost/#!/page2
http://test.localhost/#!/page3
每次迭代都使用#!/page1
的内容。当我以相反的顺序添加列表时,每次迭代都使用#!/page3
的内容。这就像第一次完美运行一样,但CasperJS或PhantomJS在内部检测到散列更改而不是新URL,不加载onHashChange
功能,并忽略它。
如何让CasperJS重新加载每个URL,即使哈希值发生变化,就好像它是第一次打开一样?
我正在使用与Grunt job一起自动出现的PhantomJS 1.9.18。
答案 0 :(得分:1)
这可能是PhantomJS 1.x中的错误(无保证)。如果您不想将PhantomJS更新到版本2,您可能希望每次迭代都使用"一个干净的平板"根据你的观察判断。您似乎按顺序打开了这些页面:
casper.thenOpen(url[0], function(){ /* do something*/ });
casper.thenOpen(url[1], function(){ /* do something*/ });
casper.thenOpen(url[2], function(){ /* do something*/ });
解决此问题的一种方法可能是在这些调用之间加载完全不同的页面:
casper.thenOpen(url[0], function(){ /* do something*/ });
casper.thenOpen("http://example.com");
casper.thenOpen(url[1], function(){ /* do something*/ });
casper.thenOpen("http://example.com");
casper.thenOpen(url[2], function(){ /* do something*/ });
http://example.com非常适合这种情况,因为它总是在线且非常小,但这仍会产生不必要的请求。另一种方法是将当前页面重置为" about:blank"在你完成它之后:
casper.thenOpen(url[0], function(){ /* do something*/ });
casper.then(function(){ this.page.content = ""; });
casper.thenOpen(url[1], function(){ /* do something*/ });
casper.then(function(){ this.page.content = ""; });
casper.thenOpen(url[2], function(){ /* do something*/ });
page.content = ''
清空页面内容并更改当前网址,以便下次打开操作可以清理。
答案 1 :(得分:0)
我遇到了与PhantomJS非常相似的情况。这让我非常疯狂。花了很长时间才弄明白,但我的“小”黑客是:
return client
.url('about:blank') // Weee
.url('http://www.foo.com/#meow')
.waitForElementVisible('body', 1000)