如何在selenium webdriver的文本字段中逐个输入字符?

时间:2014-06-30 14:44:19

标签: java selenium selenium-webdriver

如何在selenium webdriver的文本字段中逐个输入字符?我使用了以下代码,但它无法正常工作

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

有人可以建议如何解决这个问题吗?

6 个答案:

答案 0 :(得分:7)

以下是我使用Selenium Webdriver(Java)逐个字符发送的方法。这样在后端,我在每个字母处按下验证字符是否存在于输入中。正常element.sendKeys()对我来说效果不好5次 - 最后一个字母丢失了,我想Selenium Webdriver有些问题,我不知道。尝试下面的代码,它可以100%的时间用于我。

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

如您所见,我获得了键入所需的值,在for循环中,我获取每个字符,将其转换为字符串并将其发送到文本框。此外,我搜索了xpath,您可以将其更改为id,classname或任何您想要的内容。

答案 1 :(得分:6)

sendKeys()确实按顺序输入字符,但它有时可以足够快地运行以被视为复制/粘贴操作。但是,它实际上是为了模拟用户通过键入输入文本。根据{{​​1}} JavaDoc:

  

/ **使用此方法模拟键入元素,可以设置其值。 * /

如果你想减慢速度,可以创建一个接受WebElement和String args的方法,将String转换为sendKeys(),然后使用for循环并输入.sendKeys中数组的每个索引( )后跟charsequence[]。但是,这似乎非常低效,因为Thread.sleep()将字符串识别为sendKeys()(String 在Java中是一个charsequence[])。添加charsequence[]只会不必要地减慢您的测试速度。

老实说,Thread.sleep()符合您描述的需求。这是在键盘上模拟用户的最佳方式,它只是非常快。

答案 2 :(得分:3)

.chord()将同时按下所有键。不太适合现场输入。

.sendKeys()方法将接受String。只需传递您的输入并随身携带。

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

答案 3 :(得分:1)

当我要逐个字母键入字符串时,我在测试中使用了此功能。

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) {
    }
}

答案 4 :(得分:1)

我创建了一个 Java Selenium 代码的 Python 函数。 在下面找到附件并根据您要使用的元素进行调整:

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)

答案 5 :(得分:0)

如果您想使sendKeys更人性化,我使用了类似的方法:

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

它以100ms的延迟发送密钥,但平均只有100ms。它创建平均时间为100ms和标准差的正态分布。偏差15毫秒。