使用Selenium Java操作SpreadJS时遇到JavascriptException错误求助
使用Selenium Java操作SpreadJS时遇到JavascriptException错误求助
你好!我看了你的问题和代码,遇到window.testSpread.getActiveSheet is not a function这个错误,大概率是因为你通过GC.Spread.Sheets.findControl获取到的对象不是SpreadJS的顶层Spread实例,而是工作表(Worksheet)对象,自然没有getActiveSheet()方法。
问题分析
你当前用document.querySelector("[gcuielement='gcWorksheetCanvas']")定位的是单个工作表的canvas元素,findControl传入这个元素时,返回的是对应的Worksheet对象,而Worksheet本身并不具备getActiveSheet()这个属于顶层Spread实例的方法,这就是报错的核心原因。
解决方案
你需要调整定位目标,找到SpreadJS的顶层容器元素(通常是带有gc-spread-sheets类的div,包裹着整个表格区域),再通过findControl获取正确的Spread实例:
JavascriptExecutor js = (JavascriptExecutor) driver; // 先等待SpreadJS完全初始化,避免页面未加载完成就执行脚本 WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); wait.until(driver -> ((JavascriptExecutor) driver).executeScript("return typeof GC !== 'undefined' && typeof GC.Spread !== 'undefined'")); // 定位Spread顶层容器,而非工作表canvas js.executeScript("window.testSpread = GC.Spread.Sheets.findControl(document.querySelector('.gc-spread-sheets'))"); // 注意去掉getValue参数末尾多余的逗号,避免语法错误 Object value = js.executeScript("return window.testSpread.getActiveSheet().getValue(0,0);");
另外还有两个小细节要留意:
- 你原代码里的
getValue(0,0,);多了一个逗号,属于语法错误,需要删除 - 必须确保SpreadJS脚本完全加载后再执行操作,否则可能获取不到有效实例,所以等待逻辑很关键
如果还是有问题,可以先在浏览器控制台手动执行GC.Spread.Sheets.findControl(document.querySelector('.gc-spread-sheets')),确认返回的是Spread实例后,再同步到Selenium代码中。
备注:内容来源于stack exchange,提问作者Amal M
相关产品推荐
相关产品推荐

