我们有一个网络应用程序,我正在尝试使用 Java、网络驱动程序和 TestNG 对其进行自动化测试。我面临(失败)的最大挑战是保持领先于开发并防止测试框架因微小的代码更改而中断。
问题
- 有一个接受数字的文本字段。到目前为止,
sendKeys
为我完成了这项工作。 - 在最近对页面源代码的更改中,当输入数字时,系统会自动插入逗号。
- 例如,“50000”变为“50,000”。
- 现在
sendKeys
正确输入了值,但在我离开该字段编辑其他字段后,该值重置为 0。
这是元素的来源。注意 onkeyup
和 onfocus
的值:
<input type="text" class="form-control tooltip-default" id="my_budget" value="" data-mask="fdecimal" data-rad="." data-toggle="tooltip" data-placement="top" data-original-title="test tooltip" onfocus="removeErrors('my_budget');" onkeyup="removeNegativeSign('my_budget');">
我以前遇到过这个问题,并尝试使用 W3Schools 破解解决方案和其他研究。
方法一:Keys.TAB
I've read sendKeys(Keys)
可以触发 keyup 事件,所以我尝试发送 Keys.TAB
driver.findElement(By.id("my_budget")).sendKeys(Keys.TAB);
这没有任何效果。
方法二:发送keyDown-keyUp
我用了this问题作为引用,只是模拟按下 Ctrl 键。
new Actions(driver).keyDown(driver.findElement(By.id("my_budget")), Keys.CONTROL).keyUp(driver.findElement(By.id("my_budget")), Keys.CONTROL).perform();
这没有任何效果。
方法 3:手动执行 Javascript
最后,我尝试手动执行 Javascript,首先为 onfocus
,然后当它不起作用时,为 onkeyup
。
SeleniumHelper.doJavascriptOnElement(driver, driver.findElement(By.id("my_budget")), driver.findElement(By.id("my_budget")).getAttribute("onfocus"));
SeleniumHelper.doJavascriptOnElement(driver, driver.findElement(By.id("my_budget")), driver.findElement(By.id("my_budget")).getAttribute("onkeyup"));
这导致错误表明未找到 Javascript:
Caused by: java.lang.Exception: org.openqa.selenium.WebDriverException: unknown error: removeErrors is not defined
问题
所以 -
- 如何在 onkeyup 或 onfocus(或其他)Javascript 处于事件状态的文本字段中输入文本?
- 我将来如何围绕这种情况(我的代码发生变化)进行编程?是否有我不知道的“智能”sendKeys?
最佳答案
经过一天的挖掘,我找到了答案。
要使用 onfocus
Javascript 在文本字段中输入文本,我需要 click()
文本字段网络元素:
driver.findElement(By.id("my_budget")).click();
这有效 - 输入值时执行 Javascript。
为了更容易地输入文本+生成事件,我创建了一个方法:
调用它:
sendKeysWithEvent(driver, driver.findElement(By.id("my_budget")), "50000", "onfocus");
方法:
public static void sendKeysWithEvent(WebDriver driver, WebElement element, String text, String event) throws Exception {
element.sendKeys(text);
switch(event) {
case "keyup":
new Actions(driver).keyDown(element, Keys.CONTROL).keyUp(element, Keys.CONTROL).perform();
break;
case "onblurJS":
doJavascriptOnElement(driver, element, element.getAttribute("onblur"));
break;
case "onfocus":
element.click();
break;
case "keyupJS":
doJavascriptOnElement(driver, element, element.getAttribute("onkeyup"));
break;
case "keyupTAB":
element.sendKeys(Keys.TAB);
break;
}
}
public static void doJavascriptOnElement(WebDriver driver, WebElement element, String javascript) throws Exception {
ApiHelper.doLog("Running Javascript: " + javascript);
((JavascriptExecutor) driver).executeScript(javascript, element);
}
关于javascript - 如何使用 onkeyup/onfocus javascript 在文本字段中输入文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25012780/