'How to enter characters one by one in to a text field in selenium webdriver?

How to enter characters one by one in to a text field in selenium webdriver? I have used the below code but it's not working

getDriver().findElement(By.id("PhoneNumber")).sendKeys(Keys.chord("9876544322"));

Can anybody suggest how to resolve this?



Solution 1:[1]

Here is how I am sending character by character using Selenium Webdriver (in Java). This way in the back-end, I verify at each letter press if the character exists in the input. Normal element.sendKeys() is not working well for me 2 out of 5 times - the last letter is missing, I guess something is buggy with Selenium Webdriver, I don't know. Try the code below, it works 100% of the time for me.

public void TypeInField(String xpath, String value){
    String val = value; 
    WebElement element = driver.findElement(By.xpath(xpath));
    element.clear();

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

As you see, I get the value needed to be typed and in the for loop, I take each character, convert it to string and send it to textbox. Also, I have a search for xpath, you can change that to id, or classname, or whatever you want.

Solution 2:[2]

If you want to make your sendKeys more human like, I've used something like this:

private static void sendHumanKeys(WebElement element, String text) {
    Random r = new Random();
    for(int i = 0; i < text.length(); i++) {
        try {
            Thread.sleep((int)(r.nextGaussian() * 15 + 100));
        } catch(InterruptedException e) {}
        String s = new StringBuilder().append(text.charAt(i)).toString();
        element.sendKeys(s);
    }
}

It sends the keys with a 100ms delay, but only an average of 100ms. It creates a normal distribution with average 100ms and std. deviation 15ms.

Solution 3:[3]

sendKeys() does enter characters in sequence, but it can at times run quickly enough to be perceived as a copy/paste action. Though, it is in fact intended to simulate a user entering text by typing. Per the sendKeys() JavaDoc:

/** Use this method to simulate typing into an element, which may set its value. */

If you wanted to slow it down, you could make a method that accepts WebElement and String args, convert the String to charsequence[], then use a for loop and enter each index of the array in the .sendKeys() followed by a Thread.sleep(). This seems horribly inefficient, though, as sendKeys() recognizes Strings as charsequence[] (String is a charsequence[] in Java). Adding the Thread.sleep() will only slow your test needlessly.

Honestly, sendKeys() fits your described needs. It's the best way to simulate a user at a keyboard, it just does it really fast.

Solution 4:[4]

.chord() will press all keys simultaneously. Not very well suited for field input.

The .sendKeys() method will accept a String. Simply pass your input as such and have a go with it.

driver.findElement(By.id("element")).sendKeys("Field Input Text");

Solution 5:[5]

I use this function in my test when I want to type a string letter by letter.

public void typeOnLetterByLetter(WebElement webElement, String value, long waitBetweenLetters, ChronoUnit unitTime) {
    clear(webElement);
    Arrays.asList(value.toCharArray()).forEach(letter -> {
        typeOn(webElement, String.valueOf(letter));
        pause(waitBetweenLetters, unitTime);
    });
}

private void pause(long time, ChronoUnit unitTime) {
    try {
        Thread.sleep(Duration.of(time, unitTime).toMillis());
    } catch (InterruptedException ignore) {
    }
}

Solution 6:[6]

I created a Python function of the Java Selenium code. Find attached below and tweak based on the elements you want to use:

def TypeInField(xpath, myValue):
    val = myValue
    elem = driver.find_element_by_xpath(xpath)
    c = ""
    for i in range(0, len(val)):
      c += val[i]
      elem.send_keys(c)
      time.sleep(3)
    elem.send_keys(Keys.ENTER)

Solution 7:[7]

Here is how I did it in C#

    public void TypeInFieldCharByChar(IWebElement element,string text)
    {
        var strBuilder = new StringBuilder();

        for (int i = 0; i < text.Length; i++)
        {
            Thread.Sleep(100);
            strBuilder.Append(text[i]);
            element.SendKeys(strBuilder.ToString());
            strBuilder.Clear();
        }
    }

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Dmitry Shvedov
Solution 2 Raghav
Solution 3 Dmitry Shvedov
Solution 4 tim-slifer
Solution 5 Zeeshan Adil
Solution 6 Asante Michael
Solution 7 Svetlana