硒发送键未发送所有字符

2022-09-03 16:11:05

我正在使用Java,Selenium和Chrome进行测试自动化。我们的开发人员最近将我们的UI从AngularJS升级到Angular2(不确定这是否重要)。但从那时起,sendKeys正在将不完整的字符输入到文本字段中。下面是一个示例:

    public void enterCustomerDetails()
    {   
        txtFirstName.sendKeys("Joh201605130947AM");
        txtSurname.sendKeys("Doe201605130947AM");
        txtEmail.sendKeys("johndoe@gmail.com");
    }

我也尝试过使用 executeScript。它不起作用。它可以输入完整的字符,但表单认为该字段为 null。

public void forceSendKeys(WebElement element, String text)
{
    if (element != null)
        ((JavascriptExecutor) this.webDriver).executeScript("arguments[0].value=arguments[1]", element, text);
}

public void enterCustomerDetails()
        {   
            forceSendKeys(txtFirstName, "Joh201605130947AM");
            forceSendKeys(txtSurname, "Doe201605130947AM");
            forceSendKeys(txtEmail, "johndoe@gmail.com");
        }

我还尝试在.sendKeys之前使用.click()并增加睡眠时间。他们也不起作用。

我从这篇文章中得到了一个想法,输入字符1×1:如何在硒网络驱动程序的文本字段中逐个输入字符?

它有效,但这意味着我必须将所有代码从sendKeys重写到新函数:

    public void sendChar(WebElement element, String value)
{
    element.clear();

    for (int i = 0; i < value.length(); i++){
        char c = value.charAt(i);
        String s = new StringBuilder().append(c).toString();
        element.sendKeys(s);
    }       
}

public void enterCustomerDetails()
    {
        sendChar(txtFirstName, "Joh201605130947AM");
        sendChar(txtSurname, "Doe201605130947AM");      
        sendChar(txtEmail, "johndoe@gmail.com");
    }

如果你们知道更好的方法,请帮忙!:)


答案 1

我假设这是由这个Angular2问题引起的 https://github.com/angular/angular/issues/5808

当输入事件到达得太快时,Angular 无法处理它们。

作为一种解决方法,您需要发送单个字符,每个字符之间有很小的延迟。


答案 2

我在使用NightwatchJS(使用硒)进行集成测试时偶然发现了这个错误。

所以我写这篇文章是为了将来来这里的人。

我为Nightwatch编写了这个扩展命令

exports.command = function (selector, value, using) {
    var self = this;
    self.elements(using || 'css selector', selector, function (elems) {
        elems.value.forEach(function (element) {
            for (var c of value.split('')) {
                self.elementIdValue(element.ELEMENT, c);
            }
        });
    });
    return this;
};

可以这样使用:

var username = 'integration@test.com';
browser.setValueSlow('input[ngcontrol=username]', username); //Works with ng2!

这个问题也在NightwatchJS的github上进行了讨论