Ключи отправки не работают с объектной моделью страницы

Я только начинаю экспериментировать с объектными моделями страниц, используя Protractor в неугловом приложении. Я не новичок, но далеко не эксперт, так что простите меня, если я ошибаюсь. Я исследовал и пробовал предложения в течение нескольких дней без везения. У меня есть этот элемент-

<input type="text" class="form-control" name="form_component_data[AgentsSettings][agent][chat_welcome_msg]" id="agentssettings-agent-chat_welcome_msg" value="How can I help">

В моем POM у меня есть

var txtWelcomemessage = element(by.css("input[name='form_component_data[AgentsSettings][agent][chat_welcome_msg]']"));

    this.clearWelcomemessage = function(){
    txtWelcomemessage.clear();
    };

    this.clearWelcomemessage = function(){
    txtWelcomemessage.clear();
    };

    this.setWelcomemessage = function(){
    txtWelcomemessage.sendKeys();
      };

В моем тестовом сценарии у меня есть

settings.clearWelcomemessage();
browser.sleep('5000');

settings.setWelcomemessage('Hey, Hey, Hey');
browser.sleep('5000');

Очистить сообщение работает, я вижу курсор в поле после очистки сообщения, но отправить ключи ничего не делает и ошибок нет.

Однако, когда я ввожу приведенный ниже код непосредственно в тестовый скрипт, сообщение исчезает, а клавиши отправки работают отлично.

driver.findElement(by.css("input[name='form_component_data[AgentsSettings][agent] 
[chat_welcome_msg]']")).click();
browser.sleep('3500')
driver.findElement(by.css("input[name='form_component_data[AgentsSettings][agent] 
[chat_welcome_msg]']")).sendKeys('Hey, Hey, Hey');

Это третье поле, с которым я пока работаю в приложении. Первые два поля работают с POM без проблем. Я не уверен, что отличается об этом. Я могу использовать это как обходной путь, но мне просто интересно, что мне не хватает в объекте страницы.


person Devy16    schedule 06.07.2021    source источник
comment
Вы действительно await выполняете функции? settings.clearWelcomemessage() и browser.sleep() равны async. Пожалуйста, попробуйте добавить операторы console.log() между каждым действием и проверьте, действительно ли работают сны.   -  person Silvan Bregy    schedule 08.07.2021
comment
@SilvanBregy Если предположить, что я сделал это правильно, похоже, что происходит сон. Это то, что я использовал. settings.clearWelcomemessage(); browser.sleep('5000').then(console.log('Сообщение удалено')); settings.setWelcomemessage('Привет. Чем могу помочь?'); browser.sleep('5000').then(console.log('Введено приветственное сообщение'));   -  person Devy16    schedule 08.07.2021


Ответы (1)


Если ваш реальный код выглядит так:


settings.clearWelcomemessage();
browser.sleep('5000');

settings.setWelcomemessage('Hey, Hey, Hey');
browser.sleep('5000');

Тогда это не сработает, потому что все эти операции являются asynchronius функциями. Значит, что они не выполняются линейными. Другие языки программирования обычно ждут завершения функции, прежде чем перейти к следующей строке, но в случае асинхронных операций в js/nodejs это не так.

Пожалуйста, попробуйте правильно ждать каждую из выполняемых функций::

settings.clearWelcomemessage().then(() => {
    console.log('cleared welcome messgae! ')
    return browser.sleep('5000').then(() => {
        console.log('slept 5000')
        return settings.setWelcomemessage('Hey, Hey, Hey').then(() => {
            console.log('welcome message set!')
            return browser.sleep('5000').then(() => {
                console.log('second sleap done!')
            })
        })
    })
}).catch(err => console.error('error occured!', err))


Вы также должны настроить сами функции. Они выполняют async операций, и вы всегда должны возвращать результат, поскольку они возвращают Promise объект. Документы

Редактировать:

Собственно, добавьте параметр в sendKeys() . Без него ключи бы не высылались..

this.clearWelcomemessage = function(){
        return txtWelcomemessage.clear();
    };

    this.clearWelcomemessage = function(){
        return txtWelcomemessage.clear();
    };

    // add message parameter. Or no message will be sent :) 
    this.setWelcomemessage = function(message){
        return txtWelcomemessage.sendKeys(message);
      };

Если это решит проблему, вы должны узнать о promises соотв. async & await и т.д.

Если вы знаете об операциях async и о том, как они работают, измените свой код в вопросе, так как это не исходный код.

person Silvan Bregy    schedule 08.07.2021
comment
Я обновил код, и он работает нормально, но клавиши отправки по-прежнему ничего не делают. Странно то, что он не провалил тест. Я не могу найти никакой информации о том, почему он думает, что ключи были отправлены. Я также читаю документацию, которую вы предоставили. Спасибо - person Devy16; 08.07.2021
comment
Ну, я полагаю, вы забыли отправить на самом деле ключи? пока не замечал. я обновил свой ответ - person Silvan Bregy; 09.07.2021
comment
Вы также можете взглянуть на этот ответ => stackoverflow.com/questions/50970567/ - person Silvan Bregy; 09.07.2021
comment
Ааа. Да, функция в объекте страницы изначально была пустой. Вот чего не хватало и почему это не работало. Спасибо за помощь. - person Devy16; 09.07.2021