#javascript #angularjs #iframe #protractor
#javascript #angularjs #iframe #транспортир
Вопрос:
Я пишу тест e2e с помощью транспортира, который требует доступа к элементу iframe в приложении Angular 2.
Я полагаю, что я успешно переключился на iframe, но по какой-то причине элемент, который я хочу выбрать, выдает ошибку в моем тесте либо «элемент не найден с помощью селектора идентификаторов css ….», либо «элемент не виден».
Вот мой код:
this.fillOutInfo = function(input){
this.selectBox.click().then(function(){
browser.switchTo().frame(this.selectBox)
.then(function(){
browser.findeElement(by.id('recurly-hosted-input-field')).sendKeys(input)
.then(function(){
browser.switchTo().defaultContent();
})
})
})
} //selectBox references the iframe element within the DOM
Указанный выше идентификатор явно присутствует в коде, когда я проверяю элемент, но по какой-то причине к нему не обращаются. Моя функция реализована неправильно? Я уже пробовал разные методы поиска нужного мне ввода, такие как вложенные локаторы, но ничего не сработало.
Любая помощь очень ценится!
Комментарии:
1. Есть консоль u. войдите во вложенный
then
? Как разрешить обещание в транспортире?2. Вы упомянули как
browser.findeElement
. это опечатка?3. @SudharsanSelvaraj да, извините, это опечатка в stackoverflow, а не в реальном коде
Ответ №1:
Если это не ошибка опечатки, на которую указал судхарсан селварадж, попробуйте
element.all(by.id('recurly-hosted-input-field')).count().then(function(count) {
console.log("Number of elements with same id: " count);});
это позволит вам узнать, сколько элементов существует с одинаковым идентификатором. Это случилось и со мной, поскольку я работал с неправильным элементом, который имел то же свойство locator.
Надеюсь, это поможет
Комментарии:
1. спасибо за ваш ответ здесь. Я должен был упомянуть ранее, что существует несколько фреймов, но внутри каждого есть только один тег с указанным выше идентификатором. Я знаю, что выбираю правильный iframe, потому что в первой строке я сначала нажимаю на него.
Ответ №2:
После дополнительных исследований и экспериментов я пришел к решению, которое сработало для меня. Вот он:
this.fillOutInfo = function(input){
this.selectBox.click().then(function(){
browser.ignoreSynchronization = true;
browser.switchTo().frame(0)
.then(function(){
element(by.id('recurly-hosted-input-field')).sendKeys(input)
.then(function(){
browser.switchTo().defaultContent();
})
})
})
}
Я думаю, что были две вещи: 1.) добавление синхронизации ignoreSyncronization и 2.) Переключение контекстов фреймов на основе индексов, а не локаторов.