发送键不适用于页面对象模型

Send keys not working with Page Object Model

我刚开始在非 angular 应用程序上使用量角器试验页面对象模型。我不是新手,但离专家还差得远,所以如果我的措辞有误,请原谅我。我一直在研究和尝试几天没有运气的建议。 我有这个元素-

<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 没有任何问题。我不确定这个有什么不同。我可以使用它作为解决方法,但我只是想知道我在页面对象中缺少什么。

如果你的真实代码是这样的:


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 操作,你应该总是 return 结果,因为它们 return 一个 Promise 对象。 Docs

编辑:

实际上,给 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 resp。 async & await

如果您了解 async 操作及其工作原理,请调整问题中的代码,因为它不是原始代码..