如何在Selenium WebDriver中逐个输入字符到文本字段?我已经使用了以下代码,但它不起作用。
getDriver().findElement(By.id("PhoneNumber")).sendKeys(Keys.chord("9876544322"));
有人能提供解决这个问题的建议吗?
getDriver().findElement(By.id("PhoneNumber")).sendKeys(Keys.chord("9876544322"));
有人能提供解决这个问题的建议吗?
以下是我使用Selenium Webdriver(Java语言)逐个字符发送文本的方法。这种方法可以在后端验证每次按下的字符是否存在于输入框中。普通的element.sendKeys()
对我来说有2次在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或任何您想要的内容。
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);
}
}
sendKeys()
方法按顺序输入字符,但有时候运行速度非常快,会被看作是复制/粘贴操作。但实际上,它旨在通过键入来模拟用户输入文本。根据sendKeys()
JavaDoc的说明:
如果您想要减慢它的速度,可以编写一个接受WebElement和String参数的方法,将String转换为/** 使用此方法模拟输入元素中的内容,这可能会设置其值。*/
charsequence[]
,然后使用for循环并在每个数组索引处输入.sendKeys(),然后加上Thread.sleep()
。不过,这种方式效率极低,因为sendKeys()
将String识别为charsequence[]
(在Java中,String 是一个charsequence[]
)。添加Thread.sleep()
只会使测试变得毫无意义。sendKeys()
适合您所描述的需求。它是模拟用户键盘输入的最佳方式,只是速度非常快。我将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)
.chord()会同时按下所有按键。不太适合于字段输入。
.sendKeys()方法将接受一个字符串。只需将您的输入作为参数传递,然后尝试使用它。
driver.findElement(By.id("element")).sendKeys("Field Input Text");
当我想逐个字母地输入字符串时,在我的测试中,我使用这个函数。
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) {
}
}
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();
}
}
sendKeys()
:getDriver().findElement(By.id("PhoneNumber")).sendKeys("9876544322");
? - alecxe