使用Selenium Java操作DynamicForm无法点击输入文本的解决方法
问题原因
你无法操作DynamicForm内元素的核心原因是:scLocator是SmartClient(SmartGWT底层UI框架)的专属定位语法,原生Selenium的定位器不识别该语法规则,直接传入scLocator字符串无法匹配到DOM节点,自然无法执行点击、输入操作。
另外你给出的两个定位路径中,DynamicForm的ID存在差异:第一个是单下划线的CollapseView_RuleGrid_activeView_RuleForm,第二个是双下划线的CollapseView__RuleGrid_activeView_RuleForm,实际使用前需要先核对页面真实渲染的ID,避免定位失效。
实现方案
SmartGWT渲染的动态表单组件绑定了大量自定义事件,不推荐硬写原生XPath/CSS定位(DOM结构随组件版本、渲染顺序变化极易失效),直接调用框架内置的AutoTest接口获取元素是稳定性最高的方案。
第一步:封装通用操作工具类
import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.interactions.Actions; public class SmartGwtOperator { /** * 通过scLocator获取页面对应DOM元素 */ public static WebElement getElement(WebDriver driver, String scLocator) { String js = "return window.isc.AutoTest.getElement(arguments[0]);"; return (WebElement) ((JavascriptExecutor) driver).executeScript(js, scLocator.replace("scLocator=", "")); } /** * 针对DynamicForm表单项的点击+输入通用方法 */ public static void inputToFormItem(WebDriver driver, String scLocator, String content) throws InterruptedException { WebElement item = getElement(driver, scLocator); // 滚动到元素可见区域 ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView({block: 'center'});", item); // 模拟真实鼠标操作触发组件焦点事件,禁止用JS点击,否则不会触发表单联动、校验逻辑 new Actions(driver).moveToElement(item).click().perform(); // 等待输入框获取焦点 Thread.sleep(150); // 清空原有内容后输入 item.clear(); item.sendKeys(content); // 等待输入完成组件响应 Thread.sleep(200); } }
第二步:业务逻辑调用
注意传入scLocator时不需要做HTML转义,直接写原始属性值即可:
public void testDynamicFormInput(WebDriver driver) throws InterruptedException { // 第一个表单项定位路径 String firstItemLocator = "scLocator=//DynamicForm[ID=\"CollapseView_RuleGrid_activeView_RuleForm\"]/item[name=name1||title=title1||index=26||Class=CanvasItem]/canvas/member[Class=Canvas||index=1||length=2||classIndex=0||classLength=1]/"; // 第二个表单项定位路径,使用前请核对ID是否和页面实际一致 String secondItemLocator = "scLocator=//DynamicForm[ID=\"CollapseView__RuleGrid_activeView_RuleForm\"]/item[name=name2||title=title1||index=26||Class=CanvasItem]/canvas/member[Class=Canvas||index=1||length=2||classIndex=0||classLength=1]/"; // 操作第一个元素输入文本 inputToFormItem(driver, firstItemLocator, "第一个字段的输入内容"); // 操作第二个元素输入文本 inputToFormItem(driver, secondItemLocator, "第二个字段的输入内容"); }
排错说明
- 如果
getElement返回null:打开浏览器F12控制台,执行isc.AutoTest.getElement('你用的scLocator去掉scLocator=前缀'),如果控制台也返回null,说明你的scLocator属性写错了,优先核对DynamicForm的ID、表单项的name属性,index属性会随表单项渲染顺序变化,非必要不要作为核心定位依据。 - 如果点击后输入框没获取焦点:检查元素是否被折叠面板、弹窗遮挡,scrollIntoView时要将元素滚动到页面中间区域,不要贴边。
- 如果输入后内容不生效:不要用JS给元素value属性赋值,必须用
sendKeys模拟真实键盘输入,否则SmartGWT不会识别到值变更,提交表单时会拿不到输入内容。
内容的提问来源于stack exchange,提问作者Manjunath
相关产品推荐
相关产品推荐

