Java:当输入自动格式化时,Selenium Webdriver 无法 sendKeys()

Java: Selenium Webdriver fails to sendKeys() when input auto-formats

我想用 selenium webdriver 填充网站上的输入字段。输入字段如下所示:

<input type="text" pattern="[0-9,.]*" class="checkThousandSeparator hideNumberSpin" name="metal" tabindex="1" id="metal" value="0" onblur="updateVariables();" onkeyup="checkRessourceByType('metal'); updateVariables();" onkeypress="return submitOnEnter(event);">

所以我以前在填写输入字段时从来没有遇到过问题。但是这个会自动格式化输入,所以如果你输入 24424,它会自动从中生成 24.424。

如果我现在使用 Webdriver 输入一个值,我可以输入它(例如 4200),输入字段会从中得出 4.200。但是当我提交属于输入字段的表单时,它将值更改为 0。 疯狂的是,如果我输入一个低于 1000 的值并且输入字段不需要格式化,我可以提交正确的数字。有人知道为什么吗?

我已经尝试过的:

但两者都没有帮助。这是我的代码 -

//doesn't work, form will submit a "0"
int met = 4200;
driver.findElement(By.id("metal")).sendKeys(Integer.toString(met));

//works, form submits the right value
int met = 200;
driver.findElement(By.id("metal")).sendKeys(Integer.toString(met));

没有错误或任何东西

编辑:我忘了说:如果我用selenium Webdriver输入值,表单只会提交不正确的值。如果我输入 值,表单总是提交正确的值,即使它 > 1000。
Edit2 解决方案:好的。不是使用 sendKeys()-方法,而是需要通过 JavaScriptExecuter 设置值。

//This works:
int met = 550000;
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("document.getElementById('metal').setAttribute('value', '"+met+"')");

您可以使用 selenium 删除 pattern 属性和 class 属性。然后你可以尝试输入你想要的值。

试试看

你描述的行为对我来说听起来像是一个错误。假设当您手动输入时它不会发生,这可能是由于 Selenium "presses" 键非常快造成的。

每次按键后稍等片刻可能会有帮助:

String[] digits = "200".split("");
for (String digit : digits) {
    inputElement.sendKeys(digit);
    Thread.sleep(250);
}

如果不知道这些处理程序的实现,就不可能缩小原因范围。

你可以试试这个,

int met = 4200;
driver.findElement(By.id("metal")).sendKeys("" + met);

还有这个,

String met = "4200";
driver.findElement(By.id("metal")).sendKeys(String.valueOf(met));

driver.findElement(By.id("metal")).sendKeys(Keys.NUMPAD4, Keys.NUMPAD2, Keys.NUMPAD0, Keys.NUMPAD0);

并且还使用 JavaScript

JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("document.getElementById('metal').value='4200';");

试一试。