带有Chrome驱动程序的Selenium sendkeys会删除字符"2"one_answers"4"。其他字符都可以。当我使用其他浏览器(IE或FF)时,一切都可以。
代码:
WebElement name = driver.findElement(localizator);
name.clear();
name.sendKeys("1234567890 abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ");
结果:输入框中充满
13567890 abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ
缺少字符2
和4
,其他字符填写正确。
我使用的是Windows 7 64位,Chrome版本29.0.1547.57米,ChromeDriver win32(v2.2.215849.dyu)-最新版本。
如果你也来自捷克共和国,我会做出一个疯狂的假设,你的键盘默认设置为捷克语。
当我的系统将捷克键盘作为默认键盘时,sendKeys
也出现了一些奇怪的问题。自从我把默认设置改为英语后,问题就消失了。
如果这没有帮助,请提供信息,如果你尝试这个会发生什么:
name.sendKeys("2");
name.sendKeys("22222222");
name.sendKeys("4");
name.sendKeys("44444444");
name.sendKeys("424242");
这是一个老问题,但仍然有效。我使用Chrome驱动程序v2.53。
看起来这些键是一个接一个地发送到浏览器的(就像一个单独的keyDown事件)。当它发生得太快时,可以观察到两个结果之一:
- 字符被移位
- 缺少个字符
我的解决方案如下:
protected void sendKeys(final WebElement element, final String keys) {
for (int i = 0; i < keys.length(); i++){
element.sendKeys(Character.toString(keys.charAt(i)));
waitUntil(attributeContains(element, "value", keys.substring(0, i)));
}
}
它是可靠的,工作速度足够快。更重要的是,当我们想在发送密钥之前清除输入字段时,可能会发生相同的事件转移,例如:
element.clear();
element.sendKeys("abc");
清除操作可能发生在以下四个位置之一:
- 在发送信件"a"之前
- 在发送字母"b"之前
- 在发送字母"c"之前
- 发送信件"c"后
我建议始终检查我们刚刚执行的操作是否已成功完成,例如:当我们想要清除输入字段时,最好执行以下操作:
- 检查输入字段的值
- 如果该值为空字符串,则返回
- 如果该值不是空字符串,则调用clear()函数并等待,直到该值等于空字符串
对于一个简单的任务来说,要执行大量的操作。然而,这将使测试更加稳定。
我遇到了同样的问题。我最终在循环中调用sendkeys,直到插入正确的值。以下是我所做的:
WebElement name = driver.findElement(By.xpath(...));
this.sendkeys(name,"yourValue");
private void sendkeys(WebElement ele, String val) throws
InterruptedException
{ ele.clear();
while(true)
{ ele.sendKeys(val);
if(ele.getAttribute("value").equals(val))
break;
else
{ ele.clear();
Thread.currentThread();
Thread.sleep(3000);
}
}
Thread.currentThread();
Thread.sleep(3000);
}
希望这能有所帮助。
我在使用VNC连接到VM并以这种方式运行Selenium测试时也遇到了这个问题。
VNC实际上是删除字符的一个。一旦我使用VirtualBox控制台直接连接到虚拟机。。。它运行良好。
您可以使用java脚本发送文本。请参阅下面的代码片段。
public void sendTextToFieldWithJS (String str, WebElement element){
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("arguments[0].value='" + str + "';", element);
}