web-dev-qa-db-fra.com

Sélénium sendKeys n'envoient pas tous les caractères

J'utilise Java, Selenium et Chrome pour l'automatisation des tests. Nos développeurs ont récemment mis à niveau notre interface utilisateur d'AngularJS vers Angular2 (je ne sais pas si cela importe). Mais depuis lors, sendKeys saisit des caractères incomplets dans le champ de texte. Voici un exemple:

    public void enterCustomerDetails()
    {   
        txtFirstName.sendKeys("Joh201605130947AM");
        txtSurname.sendKeys("Doe201605130947AM");
        txtEmail.sendKeys("[email protected]");
    }

J'ai également essayé d'utiliser executeScript. Ça n'a pas marché. Il peut entrer des caractères complets mais le formulaire pense que le champ est nul.

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, "[email protected]");
        }

J'ai également essayé d'utiliser .click () avant .sendKeys et d'ajouter du temps de sommeil. Ils n'ont pas fonctionné aussi.

J'ai eu une idée pour entrer les caractères 1 par 1 de ce post: Comment entrer les caractères un par un dans un champ de texte dans le pilote Web Selenium?

Cela a fonctionné mais cela signifie que je dois réécrire tous mes codes de sendKeys vers la nouvelle fonction:

    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, "[email protected]");
    }

Si vous connaissez mieux, aidez-moi! :)

14
Larica B

Je suppose que cela est dû à ce problème Angular2 https://github.com/angular/angular/issues/5808

Angular ne peut pas traiter les événements d'entrée lorsqu'ils arrivent trop vite.

Pour contourner ce problème, vous devez envoyer des caractères uniques avec un petit délai entre chacun.

2

Je suis tombé sur cette erreur lors des tests d'intégration avec NightwatchJS (qui utilise Selenium).

J'écris donc ceci pour les gens qui viendront ici à l'avenir.

J'ai écrit cette commande d'extension pour 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;
};

Qui peut être utilisé de cette manière:

var username = '[email protected]';
browser.setValueSlow('input[ngcontrol=username]', username); //Works with ng2!

Ce problème a également été discuté sur le github de NightwatchJS ici

1
Arg0n

J'obtenais aussi cette erreur dans Java, Selenium. Vous pouvez également obtenir cette erreur lors de l'écriture de vos codes - "sendKeys (CharSequence) du type Webelement fait référence au type manquant charSequence"

J'ai essayé de varier le temps d'attente et même de taper des caractères supplémentaires avant les personnages principaux, cela n'a pas fonctionné.

L'astuce simple que j'ai utilisée était de changer la version du compilateur Java de JRE 9 à JRE 10.

0
Seunara

En utilisant

  • Chrome 78.0.3904.70,
  • Vaadin Flow Framework 14.1.3,
  • Sélénium 3.141.59
  • et OpenJDK 11.0.5

le comportement se produit également et est encore pire: je vois que le caractère est tapé et soudainement il disparaît. Une solution de contournement doit être persistante et essayez à nouveau. Et encore. Jusqu'à ce que le caractère soit finalement tapé.

    // Type in every single character
    for (int i = 0; i < textToType.length(); i++) {
        boolean typingCharacterWasSuccessful = false;
        // If typing was not successful before, just type again
        while (!typingCharacterWasSuccessful) {
            // Type in the character
            char singleCharacterToType = textToType.charAt(i);
            htmlTextfeld.sendKeys(Character.toString(singleCharacterToType));
            // Wait a little. Maybe alternatively/additionally wait.until(...)
            Thread.sleep(200);
            // Check typed in string.
            String inputValueAfterTyping = htmlTextfeld.getAttribute("value");
            if (inputValueAfterTyping.length() > i + 1) {
                // Alternatively: delete everything and start all over
                throw new Exception("Input value too long. Maybe character typed in twice!?");
            }
            // Typing was successful if the value in the input field is as expected (up to now)
            typingCharacterWasSuccessful
                    = inputValueAfterTyping.equals(textToType.substring(0, i + 1));
        }
    }
0
S. Doe

j'ai eu le même problème, si vous le voyez attentivement, Selenium change les caractères, certains chiffres effectuent un retour arrière ou d'autres symboles, je lis que cela se produit lorsque vous utilisez Selenium avec vncserver, j'ai changé pour Firefox .... et cela a fonctionné.

si ce n'est pas votre problème, envoyez peut-être les données en plusieurs parties:

input1="Joh201605130947AM"
txtFirstName.sendKeys(input1[0:7])
txtFirstName.sendKeys(input1[8:end])

Cela est dû à un bogue dans les applications Angular. La solution consiste à mettre une fonction de veille.

public void setText(By element, String text) {
    sleep(100); // Angular version < 2 apps require this sleep due to a bug
    driver.findElement(element).clear();
    driver.findElement(element).sendKeys(text);
}
0
batuarslan