【问题标题】:Selenium: element.clear() triggers javascript before sendKeys()Selenium:element.clear() 在 sendKeys() 之前触发 javascript
【发布时间】:2015-04-28 12:30:09
【问题描述】:

我有一个应该包含日期的输入字段。

假设表单在字段内加载了一个值,例如“2015 年 4 月 28 日”。我正在使用 webdriver 使用 By 选择元素,然后我这样做:

element.clear();
element.sendKeys("2015/04/29");

不幸的是,当我清除元素时,它会触发一些加载模板“yyyy/MM/dd”并将其放入字段中的 javascript,因此当 sendKeys() 出现时,最终结果是“yyyy/MM/dd2015 /04/29”。

当您手动执行这些步骤时不会发生这种情况,如果您转到该字段并选择其中的所有内容并将其删除,它不会加载模板直到您切换到不同的元素。

因此,javascript 似乎不仅是通过更改字段来触发的,而且还结合了诸如失去焦点之类的东西。我尝试了多种方法来关注输入元素:

new Actions(driver).moveToElement(element).perform();
new Actions(driver).moveToElement(element).click().perform();
element.click()
element.sendKeys("")    // before the other sendKeys

然而,当我使用 webdriver 时,同样的事情不断发生。 所以两个问题:

  • 您一般如何处理由您执行的操作触发但可能会影响您正在执行的操作的异步 javascript 调用?等等?
  • 在这个特定问题中,它似乎是焦点驱动的,是否存在某种方式使该字段在 clear() 和 sendKeys() 之间失去焦点?

更新

详细说明:它是一个“文本”输入字段,在“更改”、“模糊”和“焦点”上运行一个 JavaScript 方法来更新字段值。

所以我运行element.clear(),它必须触发这三个之一,因为在清除后代码插入模板数据。

当我到达 element.sendKeys() 时,损坏已经完成。

因此,不知何故,在 clear() 和 sendKeys() 之间,网站上调用了“更改”、“模糊”或“焦点”,对我来说最合乎逻辑的解释是该字段以某种方式失去焦点。

【问题讨论】:

    标签: java selenium webdriver


    【解决方案1】:

    您可以尝试通过发送退格键来清除输入。

    public static void clearWithBackspace(WebElement input) {
        while(input.getAttribute("value").length() > 0) {
            input.sendKeys(Keys.BACK_SPACE);
        }
    }
    

    (或在单个 sendKeys 调用中发送正确数量的 BACK_SPACEs 后跟所需文本的一些变体。)

    或者,使用JavascriptExecutor执行的JavaScript设置输入值。

    您一般如何处理异步 javascript 调用

    我等着。一些估计的金额,或者如果我想具体一点:执行我自己的脚本并等待完成。这是可行的,因为 JavaScript 的事件循环只有在其他所有事情都完成后才会执行您的脚本。像这样的:

    public static void waitForScriptExecution() {
        executeJs("var sc = document.createElement('script'); sc.innerHTML = 'window.allDone = true;'; document.body.appendChild(sc);");
        int maxWait = 6000;
        int waitTimeSoFar = 0;
        int waitIntervalMs = 500;
        do {
            if (executeJs("return window.allDone").equals("true")) {
                break;
            }
            waitFor(waitIntervalMs, MILLISECONDS);
            waitTimeSoFar = waitTimeSoFar + waitIntervalMs;
        } while (waitTimeSoFar < maxWait);
        if (waitTimeSoFar >= maxWait) {
            // TODO handle timeout
        }
    }
    
    public static String executeJs(String script) {
        JavascriptExecutor js = (JavascriptExecutor) driver;
        Object result = js.executeScript(script);
        return result != null ? result.toString() : null;
    }
    
    public static void waitFor(long count, TimeUnit timeUnit) {
        try {
            Thread.sleep(timeUnit.toMillis(count));
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
    

    【讨论】:

      【解决方案2】:

      问题实际上描述为in this post,它链接到selenium bug,不幸的是设置为“WorkingAsIntended”。

      基本上:clear() 触发 change 事件。

      我的解决方案(基于上述帖子中的答案)是:

          Actions navigator = new Actions(driver);
          navigator.click(element)
              .sendKeys(Keys.END)
              .keyDown(Keys.SHIFT)
              .sendKeys(Keys.HOME)
              .keyUp(Keys.SHIFT)
              .sendKeys(Keys.BACK_SPACE)
              .perform();
      

      然后我做element.sendKeys()

      【讨论】:

        【解决方案3】:

        检查一下,可能会有所帮助。 类似于 ekuusela 的建议, 但是你可以试试 Ctrl + A 然后输入。

        https://groups.google.com/forum/#!topic/selenium-users/OqRAQmmABJY

        为了完整起见,在此处添加示例,

         element.sendKeys(Keys.chord(Keys.CONTROL, "a"), value));
         element.sendKeys(Keys.chord(Keys.END, Keys.BACKSPACE, Keys.BACKSPACE, ... (enough backspaces to erase the field)), value)).
        

        【讨论】:

          【解决方案4】:

          几周前我自己也遇到过类似的问题。问题是我只是偶尔遇到这个问题。通过将进程封闭在 while 循环中来解决它,在 sendkeys() 发送后检索日期。然后将检索到的日期与正则表达式进行比较,如果日期与正则表达式不匹配,则我再次重复 clear() -> sendKeys() 操作。

          为了回答您的第一个问题,我使用了一种自定义方法,该方法一直等到活动请求的数量 == 0。不确定您的第二个问题。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-09-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多