使CasperJS完全重载片段(hashbang)链接

时间:2015-09-30 11:33:38

标签: phantomjs casperjs hashbang

当我使用示例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。

2 个答案:

答案 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)