2014-12-17 1 views
1

Попытка очистить веб-страницу с помощью CasperJS. Веб-страница проверяет, является ли браузер IE 6/7.CasperJS не может установить window.navigator объект

Передача userAgent с casperjs не соответствует его условиям. UserAgent прошло: Mozilla/4.0 (совместимый; MSIE 6.0; Windows NT 5.1) Ниже приводится проверка делается на странице, чтобы определить браузер

agt = navigator.userAgent.toLowerCase(); 
browserType = navigator.appName; 

if(((browserType.indexOf("xplorer") != -1) 
    && (agt.indexOf("msie 6.") != -1)) 
    || ((browserType.indexOf("xplorer") != -1) 
    && (agt.indexOf("msie 7.") != -1))) 
{ 

} 
else 
{ 
    alert("This "+ browserType + " Version is not supported by this application. Please use Internet Explorer 6.x or Internet Explorer 7.x."); 
    window.close(); 
} 

Ниже отладочная информация из casperjs.

[info] [remote] [alert] Эта версия Netscape не поддерживается этим применением on. Используйте Internet Explorer 6.x или Internet Explorer 7.x.

[предупреждение] [фантом] Загрузка ресурсов не удалось со статусом = сбой (HTTP 200): HTTP: //

Есть указатели по настройке window.navigator объекта перед страница перенаправления?

+0

Также следите за проектом TrifleJS (http://triflejs.org/). Он еще не работает с CasperJS (именно поэтому я не отправляю это как ответ!), Но это одна из их целей. (Он может эмулировать IE7, поэтому может быть вашим лучшим выбором, если вы не привязаны к CasperJS.) –

ответ

3

Свойства navigator доступны только для чтения, поэтому вы не можете их установить, и PhantomJS не предоставляет возможности его установки.

Решение состоит в том, чтобы сделать прокси-сервер объекта navigator. Старый navigator остается в фоновом режиме, но его заменяет новый, который ведет себя одинаково, но с appName «Internet Explorer». Весь этот процесс начальной загрузки может быть вызван из обратного вызова page.initialized.

casper.on('page.initialized', function(){ 
    this.evaluate(function(){ 
     (function(oldNav){ 
      var newNav = {}; 
      [].forEach.call(Object.getOwnPropertyNames(navigator), function(prop){ 
       if (prop === 'appName') { 
        Object.defineProperty(newNav, prop, { 
         enumerable: false, 
         configurable: false, 
         writable: false, 
         value: 'Internet Explorer' 
        }); 
       } else { 
        Object.defineProperty(newNav, prop, { 
         enumerable: false, 
         configurable: false, 
         get: function(){ 
          return oldNav[prop]; 
         } 
        }); 
       } 
      }); 
      window.navigator = newNav; 
     })(window.navigator); 
    }); 
}); 

То же самое касается ванили PhantomJS с обработчиком page.onInitialized событий.

Работа с обнаружением браузера не гарантирует, что страница работает или выглядит хорошо на PhantomJS. Существует некоторая причина, что некоторые страницы оптимизированы для IE, и причина в том, что некоторые проприетарные функции, которые используются там, которых нет в других браузерах.