2016-12-06 118 views
0

我的问题:我有一个方法来填充字段,但问题是硒没有发送完整的字符串到字段,所以我的断言在验证时失败。硒 - send_keys()发送不完整的字符串

我的代码:

var webdriver = require('selenium-webdriver'); 
var casual = require('casual'); 
var expect = require('chai').expect; 
var By = webdriver.By; 

exports.addPropuesta = function (driver) { 

var first_name = casual.first_name; 

driver.findElement(By.xpath("//a[contains(text(),'Añadir Propuesta Test')]")).click(); 

name_field = driver.findElement(By.name('nombre')); 
name_field.sendKeys(first_name); 

driver.findElement(By.css("Input[type='submit']")).click(); 

driver.findElement(By.css('.table')).getText().then(function(table_content){ 

    expect(table_content).to.include(first_name); 

    }); 
}; 

回答

2

看起来这是一个常见的问题。 [0]

在尝试变通办法之前,请确保在发送密钥时输入字段已准备好接收输入。在调用SendKeys之前,您也可以尝试清除该字段。我假设你看到你的字符串被截断,而不是字符丢失或者前缀有一些工件(比如占位符文本或来自先前测试的剩余输入)。

一些解决方法,如果没有工作:

  1. 设置的,而不是调用SetKeys使用JavaScript输入字段的值。在我这样做的一些网站上,输入值实际上不会被识别,除非我也触发输入更改的事件。

    C#中的示例。希望唯一需要改变的是使ExecuteScript成为executeScript。

    driver.ExecuteScript("var exampleInput = document.getElementById('exampleInput'); exampleInput.value = '" + testInputValue + "'; exampleInput.dispatchEvent(new Event('change'));"); 
    

    您当然可以将其分成两行,一个设置值,第二个分派事件。

  2. 单独发送每个密钥。这是我从这个问题的线索中看到的一个解决方法。

    for (var i = 0; i < first_name.length; i++) { 
        name_field.sendKeys(first_name.charAt(i)); 
    } 
    

[0] https://sqa.stackexchange.com/questions/10450/selenium-sendkeys-not-completing-data-entry-before-moving-to-next-field
https://github.com/angular/protractor/issues/3196
https://github.com/angular/protractor/issues/2019
等等,等等更多的线程可以通过一个简单的搜索中找到 “的webdriver的SendKeys不会等待所有键”,如果你想寻找其他可能的解决方案来解决您的问题。

+0

我试着用executeScript,但发生同样的问题。 – RFtests

1

我在之前的版本中遇到过这个问题,并提交了一个错误报告。它已经被修复了,但也许它又被打破了?在任何情况下,当我们在protractor chat channel上讨论这个时,都提出了以下建议:正常使用sendKeys,然后验证结果。如果结果未通过健全性检查,则一次输入一个字符。

/** 
* A Typescript version that can be used as a mixin. 
* Make some minor modifications to use as a class. 
* @param data {string} The string to enter in the input element 
*/ 
export class SendKeys { 
    inputEl: ElementFinder; 

    sendKeys(data: string) { 
     var el = this.inputEl; 
     // click on the input before sending data. This helps the focus and action situations. 
     el.click(); 

     el.clear(); 
     el.sendKeys(data); 

     // Verify whether or not hte whole data value was sent. 
     // If not, send data one character at a time, which works. 
     // See: https://github.com/angular/protractor/issues/3196 
     el.getAttribute('value').then(function (insertedValue) { 
      if (insertedValue !== data) { 
       // Failed, must send characters one at a time 
       el.clear(); 
       for (let i=0; i < data.lenght; i++) { 
        el.sendKeys(data.charAt(i)); 
       } 
      } 
     }); 
    } 
} 

-

/** 
* The Javascript version: 
* @param el {ElementFinder} The input element reference 
* @param data {string} The string to enter in the input element 
*/ 
export function sendKeys(el, data) { 
     var el = this.inputEl; 
     // click on the input before sending data. This helps the focus and action situations. 
     el.click(); 

     el.clear(); 
     el.sendKeys(data); 

     // Verify whether or not hte whole data value was sent. 
     // If not, send data one character at a time, which works. 
     // See: https://github.com/angular/protractor/issues/3196 
     el.getAttribute('value').then(function (insertedValue) { 
      if (insertedValue !== data) { 
       // Failed, must send characters one at a time 
       el.clear(); 
       for (let i=0; i < data.lenght; i++) { 
        el.sendKeys(data.charAt(i)); 
       } 
      } 
     }); 
    } 
0

我对这个问题是每个send_keys

实例前添加driver.sleep(1)分辨率:

driver.sleep(1000); 
driver.findElement(By.name('rut')).sendKeys(rut_text); 

driver.findElement(By.name('dv')).sendKeys(dv); 

driver.sleep(1000); 
driver.findElement(By.name('nombre')).sendKeys(first_name); 

driver.sleep(1000); 
driver.findElement(By.name('apellido_paterno')).sendKeys(apellido_paterno_field); 

driver.sleep(1000); 
driver.findElement(By.name('apellido_materno')).sendKeys(apellido_materno); 

driver.sleep(1000); 
driver.findElement(By.name('celular')).sendKeys(phone_number); 

driver.sleep(1000); 
driver.findElement(By.name('email')).sendKeys(email); 

我试图解决加execute_scriptclear但我没有解决。