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

Когда я использую пример здесь, я обнаруживаю, что диапазон 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.


person Redsandro    schedule 30.09.2015    source источник
comment
Какую версию PhantomJS вы используете? Вы пробовали PhantomJS 2 (возможно, потребуется установить CasperJS из git)?   -  person Artjom B.    schedule 30.09.2015
comment
1.9.18 автоматически устанавливается вместе с заданием Grunt. Я не хочу менять то, что мне дает апстрим. Поэтому, если вы говорите, что это проблема более старой версии, я ищу обходной путь.   -  person Redsandro    schedule 01.10.2015


Ответы (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, чтобы следующая открытая операция может быть чистой.

person Artjom B.    schedule 01.10.2015
comment
Спасибо, проголосовал. Ждем, каким будет мое окончательное решение. - person Redsandro; 01.10.2015

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

return client
  .url('about:blank') // Weee
  .url('http://www.foo.com/#meow')
  .waitForElementVisible('body', 1000)
person Bill Criswell    schedule 27.09.2017