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>
原因分析
- JS控件格式冲突:输入框绑定了Bitrix的
JCClock控件,代码中AmPmMode设为false,说明控件默认不支持12小时制带am/pm的格式,手动输入这类格式时,控件的格式化逻辑会混乱,导致文本乱序。 - 清理操作不稳定:当前用
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
相关产品推荐
相关产品推荐

