【问题标题】:Send keys not working with Page Object Model发送密钥不适用于页面对象模型
【发布时间】:2021-07-06 20:25:10
【问题描述】:

我刚刚开始在非角度应用程序上使用 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 工作,没有任何问题。我不确定这个有什么不同。我可以将其用作解决方法,但我只是想知道页面对象中缺少什么。

【问题讨论】:

  • 你真的有await的功能吗? settings.clearWelcomemessage() 和 browser.sleep() 是async。请尝试在每个操作之间添加 console.log() 语句并检查睡眠是否真的有效..
  • @SilvanBregy 假设我做对了,看起来睡眠正在发生。这是我用的。 settings.clearWelcomemessage(); browser.sleep('5000').then(console.log('Message Cleared')); settings.setWelcomemessage('嘿。我有什么可以帮忙的'); browser.sleep('5000').then(console.log('Welcome Message Entered'));

标签: protractor sendkeys pageobjects


【解决方案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 对象。 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 &amp; await

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

【讨论】:

  • 我更新了代码,它运行良好,但发送键仍然没有做任何事情。奇怪的是它没有通过测试。我找不到任何关于它为什么认为密钥被发送的信息。我也在阅读您提供的文档。谢谢
  • 好吧,我猜你忘了送钥匙了?直到现在还没有注意到。我更新了我的答案
  • 你也可以看看这个答案 => stackoverflow.com/questions/50970567/…
  • 啊。是的,页面对象中的函数一开始是空白的。这就是缺少的东西以及为什么它不起作用的原因。感谢您的帮助。
猜你喜欢
  • 2020-10-23
  • 2020-02-04
  • 1970-01-01
  • 2020-03-18
  • 2018-08-09
  • 1970-01-01
  • 2020-05-18
  • 1970-01-01
  • 2018-01-24
相关资源
最近更新 更多