Selenium - send_keys()发送不完整的字符串

时间:2016-12-06 00:23:30

标签: javascript node.js selenium selenium-webdriver

我的问题:我有一个填充字段的方法,但问题是selenium没有将完整的字符串发送到字段,因此我的断言在验证时失败。

我的代码:

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);

    });
};

3 个答案:

答案 0 :(得分:3)

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

在尝试解决方法之前,作为完整性检查,确保输入字段已准备好在您发送密钥时接收输入。您也可以在调用SendKeys之前尝试清除该字段。我假设你看到你的字符串被截断,而不是字符丢失或者带有一些工件的前缀(比如占位符文本或之前测试的剩余输入)。

如果不起作用,可以采取一些解决方法:

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

    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));
    }
    
  3. [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
    通过简单的搜索&#34;可以找到更多的线程.webdriver sendkeys不会等待所有的键&#34;等等。如果你想为你的问题寻找其他可能的解决方案。

答案 1 :(得分: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));
               }
           }
       });
    }

答案 2 :(得分:-1)

我对此问题的解决方法是在每个driver.sleep(1)

之前添加send_keys

示例:

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但未解决的问题。