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 的值并且输入字段不需要格式化,我可以提交正确的数字。有人知道为什么吗?
我已经尝试过的:
- 睡觉
- 使用 sendKeys 进行较慢的输入(因此只有 1 个字符然后等待 300 毫秒)
但两者都没有帮助。这是我的代码 -
//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';");
试一试。
我想用 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 的值并且输入字段不需要格式化,我可以提交正确的数字。有人知道为什么吗?
我已经尝试过的:
- 睡觉
- 使用 sendKeys 进行较慢的输入(因此只有 1 个字符然后等待 300 毫秒)
但两者都没有帮助。这是我的代码 -
//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';");
试一试。