Транспортиру не удается найти Angular
Я не могу заставить Transractor понять, что Angular загружен и запущен. Когда он открывает Chrome, мое приложение полностью загружается в браузере, поэтому я знаю, что Angular загружен и работает правильно.
Файл конфигурации:
exports.config = {
seleniumServerJar: 'C:/Dev/PrismWeb/selenium/selenium-server-standalone-2.35.0.jar',
seleniumPort: null,
chromeDriver: 'C:/Dev/PrismWeb/selenium/chromedriver.exe',
seleniumArgs: [],
seleniumAddress: null,
allScriptsTimeout: 110000,
specs: ['c:/dev/prismweb/test/e2e/*.js'],
capabilities: {'browserName': 'chrome'},
baseUrl: 'http://localhost:8080',
rootElement: 'html',
jasmineNodeOpts: {
onComplete: null,
isVerbose: true,
showColors: true,
includeStackTrace: true,
defaultTimeoutInterval: 30000
}
};
У меня есть только один тест, который я пытаюсь запустить, и он терпит неудачу, потому что Protractor не может найти Angular.
Тест:
describe('homepage loads: ', function(){
var ptor;
ptor = protractor.getInstance();
beforeEach(function(){
ptor.get('/');
});
it('should load the prism homepage: ', function(){
var usernameField = ptor.findElement(protractor.By.id("username"));
//expect(usernameField).toBeDefined();
});
});
Это ошибка, которую я получаю:
UnknownError: ошибка javascript: Angular не определен (сеанс info: chrome = 30.0.1599.69) (Информация о драйвере: chromedriver = 2.2, платформа = Windows NT 6.1 SP1 x86_64) (ВНИМАНИЕ: сервер не предоставил никакой информации о стеке) Длительность команды или таймаут: 19 миллисекунд. Информация о сборке: версия: "2.35.0", версия: 'c916b9d', время: '2013-08-12 15:42:01' Системная информация: os.name: 'Windows 7 ', os.arch:' amd64 ', os.version:' 6.1 ', java.version:' 1.7.0_21 ' ID сессии: 1ef7dcd7c5fc9c4e9e1dede050002adf Информация о драйвере: org.openqa.selenium.chrome.ChromeDriver Capabilities [{platform = XP, acceptSslCerts = true, javascriptEnabled = true, browserName = chrome, chrome = {chromedriverVersion = 2.2}, rotatable = false, locationContextEnabled = true, version = 30.0.1599.69, cssSelectorsEnabled = true, databaseEnabled = true, handleAlerts = true, browserConnectionEnabled = false, webStorageEnabled = true, nativeEvents = true, applicationCacheEnabled = false, takesScreenshot = истина}]
Я попытался переместить атрибут ng-app в тег body (и соответственно изменить конфигурацию), но я получил ту же ошибку. У нас также есть атрибут ng-controller в теге html, и я попытался переместить его в тело и оставив атрибут ng-app отдельно в теге html, но результат был таким же. Кто-нибудь знает, почему это не удается?
EDIT:
Всего несколько заметок, которые могут помочь. Я обновил вышеприведенный тест, включив в него усилия по ручной загрузке. Тег script для Angular, а все модули расположены в нижней части страницы, прямо перед закрывающим тегом BODY. В теге HTML по-прежнему есть атрибут ng-app = "myApp" плюс атрибут ng-controller = "baseController". Если я попытаюсь загрузить приложение вручную в тесте, я получаю следующее:
ReferenceError: angular is not defined
Еще одна вещь, которая меня волнует, заключается в том, что для одного из модулей, которые мы используем, требуется "$" для сопоставления с jQuery, поэтому мы сопоставляем его следующим образом:
<script type="text/javascript">
var $jq=jQuery.noConflict();
var $=jQuery.noConflict();
</script>
Где включено ng-приложение:
<!DOCTYPE html>
<html ng-app="prismApp" ng-controller="baseController">
<head>
Ответы
Ответ 1
Я не слишком уверен в том, что вы делаете beforeEach()
внутри a, it()
, но в стороне, вы пробовали подождать некоторое время?
Очевидно, под этим я подразумеваю либо a ptor.waitForAngular()
, либо ptor.wait()
?
Попробуйте ptor.sleep(10000)
после вашего ptor.get()
просто посмотреть, есть ли это время.
Изменить: также посмотрите транспортир api и как работает wait()
:
ptor.wait(function () {
// Return a condition. Code will continue to run once it is true
}, 10000); // Only do this for 10 seconds
Изменить: Попробуйте ptor.driver.get('my-page');
вместо ptor.get('my-page');
Редактировать: Транспортир теперь предоставляет browser
как глобальный, поэтому вы можете просто использовать browser.get('index.html#/foo')
или browser.wait()
и т.д.
Ответ 2
Попробуйте включить это в тестовый файл:
browser.ignoreSynchronization = true;
Он отключает вашу тестовую синхронизацию с помощью angular и заставляет ее работать.
Ответ 3
Используете ли вы ng-app для загрузки вашего приложения Angular? Или вы вручную загружаете приложение?
Я вижу, что в вашем конфигурационном файле rootElement
установлено значение 'html'.
По умолчанию транспортитор предполагает, что корень приложения будет на теге body. Если тег <html>
не находится там, где Angular загрузочные файлы в вашем приложении, попробуйте изменить корневой элемент в файле конфигурации на Angular первые загрузочные файлы (если это вручную или хотя используется директива ng-app). Это действительно помогает с проблемами времени и ускоряет выполнение каретки.