Элемент iframe транспортира не найден / не виден

#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.) Переключение контекстов фреймов на основе индексов, а не локаторов.