在Karate框架UI自动化测试中执行JS双击函数报错:document未定义
Karate UI自动化双击操作报错问题解决
我正在使用Karate框架进行UI自动化测试,被测应用(AUT)的某个页面仅能通过双击打开。尝试使用mouse('somelocator').doubleClick()无效果后,编写了如下JS代码:
var myElement = document.getElementsByTagName("somelocator"); var clickEvent = document.createEvent ('MouseEvents'); clickEvent.initEvent('dblclick', true, true); myElement.dispatchEvent(clickEvent);
这段代码在Chrome控制台中运行完全正常,但在Karate feature文件中按如下方式调用时:
* def myDblClick = """ function() { var myElement = document.getElementsByTagName("somelocator"); var clickEvent = document.createEvent ('MouseEvents'); clickEvent.initEvent('dblclick', true, true); myElement.dispatchEvent(clickEvent); } """ * myDblClick()
出现报错:
failed features: js failed:
01: myDblClick()org.graalvm.polyglot.PolyglotException: ReferenceError: "document" is not defined
问题原因
你直接定义的JS函数是在Karate的JVM端GraalJS引擎中执行的,并非在浏览器的JavaScript环境里,所以无法访问浏览器专属的document对象,这就是报错的核心原因。
解决方法
方法1:使用Karate的script()方法执行浏览器端JS
Karate提供的script()方法会把JS代码发送到当前浏览器上下文执行,能直接访问document等浏览器对象。注意getElementsByTagName返回的是元素集合,需要指定索引获取单个元素:
* script(""" var myElement = document.getElementsByTagName("somelocator")[0]; var clickEvent = document.createEvent('MouseEvents'); clickEvent.initEvent('dblclick', true, true); myElement.dispatchEvent(clickEvent); """)
或者用更简洁的浏览器原生方法:
* script("document.getElementsByTagName('somelocator')[0].dblclick()")
方法2:修正Karate原生双击方法的用法
如果想用Karate自带的双击API,尝试先定位元素再执行操作,确保元素定位准确:
* locate('somelocator').doubleClick()
或者结合鼠标移动操作:
* mouse().moveTo(locate('somelocator')).doubleClick()
内容的提问来源于stack exchange,提问作者Boris Frenkel
相关产品推荐
相关产品推荐

