You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cucumber Java自动化测试中时间输入文本异常变形问题

问题:Selenium自动化输入时间时格式混乱的解决办法

问题说明

使用Selenium+Java+Cucumber+JUnit做自动化测试时,时间输入框支持手动输入22:00 pm格式,但通过参数化步骤传入时间字符串后,输入框文本会变成am :0022这类混乱格式,导致断言验证失败,尝试字符串处理未解决问题。

相关代码片段

Feature文件场景:

Then click and clear event start hour and type manually "22:00 am"

Java操作代码:

Actions actions = new Actions(Driver.getDriver());

actions.clickAndHold(eventPage.startTime).moveToElement(eventPage.startDate).sendKeys(Keys.BACK_SPACE).perform();

actions.sendKeys(hour).perform();
}

目标元素HTML及关联JS:

<input id="feed_cal_event_from_timecal_3Jcl" name="TIME_FROM_" type="text" value="" size="6" title="Select start date and time" autocomplete="off">

<script>
        function bxLoadClock_feed_cal_event_from_timecal_3Jcl(callback)
        {
                        if (!window.JCClock && !window.jsUtils)
            {
                return setTimeout(function(){bxLoadClock_feed_cal_event_from_timecal_3Jcl(callback);}, 50);
            }

            if (!window.JCClock)
            {
                if(!!window.bClockLoading)
                {
                    return setTimeout(function(){bxLoadClock_feed_cal_event_from_timecal_3Jcl(callback);}, 50);
                }
                else
                {
                    window.bClockLoading = true;
                    return BX.load(
                        [
                            '/bitrix/js/main/clock.js?154877654922135',
                            '/bitrix/themes/.default/clock.css?15487765656522'
                        ],
                        function() {bxLoadClock_feed_cal_event_from_timecal_3Jcl(callback)}
                    );
                }
            }

            window.bClockLoading = false;

            var obId = 'bxClock_feed_cal_event_from_timecal_3Jcl';

            window[obId] = new JCClock({
                step: 5,
                initTime: '',
                showIcon: false,
                inputId: 'feed_cal_event_from_timecal_3Jcl',
                iconId: 'feed_cal_event_from_timecal_3Jcl_icon',
                zIndex: 0,
                AmPmMode: false,
                MESS: {
                    Insert: 'Set Time',
                    Close: 'Close',
                    Hours: 'Hours',
                    Minutes: 'Minutes',
                    Up: 'Increase (Up)',
                    Down: 'Decrease (Down)'
                }
                });

            return callback.apply(window, [window[obId]]);
        }

        function bxShowClock_feed_cal_event_from_timecal_3Jcl(id)
        {
            bxLoadClock_feed_cal_event_from_timecal_3Jcl(function(obClock)
            {
                obClock.Show(id);
            });
        }
    </script>

原因分析

  1. JS控件格式冲突:输入框绑定了Bitrix的JCClock控件,代码中AmPmMode设为false,说明控件默认不支持12小时制带am/pm的格式,手动输入这类格式时,控件的格式化逻辑会混乱,导致文本乱序。
  2. 清理操作不稳定:当前用clickAndHold+移动元素+回退键的方式清理输入框,无法确保完全清空内容,还可能触发控件的异常交互逻辑,打乱后续输入。

解决方案

方案1:直接通过JS设置输入框值(推荐)

绕过控件的输入拦截逻辑,直接修改输入框的value属性,同时触发变更事件确保控件感知:

WebElement timeInput = eventPage.startTime;
JavascriptExecutor js = (JavascriptExecutor) Driver.getDriver();
// 直接设置输入框值
js.executeScript("arguments[0].value = arguments[1];", timeInput, hour);
// 触发change事件,同步控件状态
js.executeScript("arguments[0].dispatchEvent(new Event('change'));", timeInput);

方案2:修复原生输入逻辑

如果必须模拟手动输入,调整清理和输入步骤,确保操作稳定:

WebElement timeInput = eventPage.startTime;
// 激活输入框
timeInput.click();
// 全选并删除现有内容(比单个回退键更可靠)
timeInput.sendKeys(Keys.chord(Keys.CONTROL, "a"));
timeInput.sendKeys(Keys.DELETE);
// 分步骤输入,避免控件干扰
timeInput.sendKeys("22:00");
timeInput.sendKeys(" pm");
// 短暂等待控件完成格式化
Thread.sleep(200);

方案3:调用控件原生API设置时间

直接调用JCClock控件的方法设置时间,适配控件的格式要求:

// 等待控件加载完成
WebDriverWait wait = new WebDriverWait(Driver.getDriver(), 10);
wait.until(webDriver -> ((JavascriptExecutor) webDriver).executeScript("return typeof window.bxClock_feed_cal_event_from_timecal_3Jcl !== 'undefined'"));
// 调用控件SetTime方法设置24小时制时间
JavascriptExecutor js = (JavascriptExecutor) Driver.getDriver();
js.executeScript("window.bxClock_feed_cal_event_from_timecal_3Jcl.SetTime(22, 00);");

注意事项

  • 优先使用JS直接设置值,这种方式不受控件交互逻辑影响,稳定性最高。
  • 注意控件AmPmMode为false,默认支持24小时制,可尝试直接输入22:00,无需添加am/pm,避免格式冲突。

内容的提问来源于stack exchange,提问作者Sami Derin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 08:05:34