如何在selenium webdriver的文本字段中逐个输入字符?我使用了以下代码,但它无法正常工作
getDriver().findElement(By.id("PhoneNumber")).sendKeys(Keys.chord("9876544322"));
有人可以建议如何解决这个问题吗?
答案 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毫秒。