一尘不染

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

selenium

我们有一个Web应用程序,我正在尝试使用Java,Web
Driver和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

我读过sendKeys(Keys)可以触发keyup事件,所以我尝试发送Keys.TAB

driver.findElement(By.id("my_budget")).sendKeys(Keys.TAB);

这没有任何作用。

方法2:发送keyDown-keyUp

我以这个问题为参考,只是按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?

阅读 297

收藏
2020-06-26

共1个答案

一尘不染

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

要使用onfocusJavascript 在文本字段中输入文本,我需要click()使用文本字段webelement:

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

}
2020-06-26