javascript - 如何使用 onkeyup/onfocus javascript 在文本字段中输入文本?

标签 javascript selenium selenium-webdriver onkeyup onfocus

我们有一个网络应用程序,我正在尝试使用 Java、网络驱动程序和 TestNG 对其进行自动化测试。我面临(失败)的最大挑战是保持领先于开发并防止测试框架因微小的代码更改而中断。

问题

  • 有一个接受数字的文本字段。到目前为止,sendKeys 为我完成了这项工作。
  • 在最近对页面源代码的更改中,当输入数字时,系统会自动插入逗号。
  • 例如,“50000”变为“50,000”。
  • 现在 sendKeys 正确输入了值,但在我离开该字段编辑其他字段后,该值重置为 0。

这是元素的来源。注意 onkeyuponfocus 的值:

<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/

相关文章:

java - 使用 java 反射 api 调用 selenium web 驱动程序方法 'findElement' 时代码出现问题

javascript - jquery fadein,延迟问题

javascript - 新 Node 缓冲区已经有数据了吗?

python - 如何使用 Python Selenium 加载 firefox 配置文件?

selenium - IE11 和 Selenium 3.13 的 IEDriverServer 兼容版本是哪个?

python - 在 Python 中使用 Angular JS( Protractor )和 Selenium

javascript - 使用ajax-jquery发布当句子有+时发送空格

javascript - 使用 jquery mobile 定位链接

php - Selenium 浏览器窗口大小

python - 尝试用 selenium/beautiful soup 提取动态表(url 不变)