Сделайте 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)