Сделайте CasperJS полностью перезагрузить ссылки фрагмента (hashbang)

Когда я использую приведенный здесь пример, я обнаруживаю, что диапазон ссылок хеш-бэнга на одной странице (который динамически создает разный контент) генерирует контент только в первый раз. Для всех остальных результатов this.getHTML() с первой ссылки используется.

Например, когда я загружаю http://test.localhost/ и он находит:

http://test.localhost/#!/page1
http://test.localhost/#!/page2
http://test.localhost/#!/page3

Каждая итерация использует содержимое #!/page1, Когда я добавляю список в обратном порядке, каждая итерация использует содержимое #!/page3, Как будто все работает отлично с первого раза, но CasperJS или PhantomJS внутренне обнаруживает изменение хэша вместо нового URL, не загружает onHashChange функциональность, и игнорирует это.

Как сделать так, чтобы CasperJS загружал каждый URL заново, даже если хеш изменяется, как если бы он был открыт в первый раз?

Я использую PhantomJS 1.9.18, который поставляется автоматически с заданием Grunt.

2 ответа

Это может быть ошибка в 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 = ''очищает содержимое страницы, а также изменяет текущий URL, чтобы можно было очистить следующую операцию открытия.

Я столкнулся с ситуацией, очень похожей на PhantomJS. Это сводило меня с ума. Потребовалось целое время, чтобы понять, но мой "маленький" хакер был:

return client
  .url('about:blank') // Weee
  .url('http://www.foo.com/#meow')
  .waitForElementVisible('body', 1000)
Другие вопросы по тегам