【问题标题】:How do I enter text in textfield with onkeyup/onfocus javascript?如何使用 onkeyup/onfocus javascript 在文本字段中输入文本?
【发布时间】:2014-07-29 10:05:47
【问题描述】:

我们有一个 Web 应用程序,我正在尝试使用 Java、Web 驱动程序和 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 和其他研究来破解解决方案。

方法 1: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?

【问题讨论】:

    标签: javascript selenium selenium-webdriver onkeyup onfocus


    【解决方案1】:

    经过一天的挖掘,我找到了答案。

    要使用 onfocus Javascript 在文本字段中输入文本,我需要 click() 文本字段 web 元素:

    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);
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-11
      • 2016-06-10
      • 2020-07-30
      • 1970-01-01
      • 2012-06-30
      • 1970-01-01
      • 2012-07-18
      相关资源
      最近更新 更多