使用KarateDriver时,我想在浏览器中定义并执行JS函数。
有可能吗?
我想像这样定义它:
* def someFn =
"""
function(param) {
// DOM operation in the browser
// Event handling in the browser
return
}
"""
* assert someFn('param1') == '<span>param1</span>'
Edit1:
我定义并执行;
* def keyword = 'karate'
* def formSubmit =
"""
function(formId) {
var formElem = document.getElementById(formId);
formElem.submit();
}
"""
Given driver 'https://github.com/search'
And driver.input('input[name=q]', keyword)
When driver.eval(formSubmit('search_form'))
Then eval driver.waitUntil(driver.location == 'https://github.com/search?utf8=%E2%9C%93&q=' + keyword + '&ref=simplesearch')
但是此功能失败。
javascript evaluation failed: driver.eval(formSubmit('search_form')), ReferenceError: "document" is not defined in <eval> at line number 2
它可以使用DOM操作吗?
Edit2:
我可以定义并执行JS函数:
* def getSubmitFn =
"""
function(formId) {
return "var formElem = document.getElementById('" + formId + "');"
+ "formElem.submit();"
}
"""
答案 0 :(得分:1)
您可以执行driver.eval()
,其中参数是原始javascript代码作为字符串。我认为这足以满足您的需求:
* match driver.eval("location.href") == webUrlBase + '/page-01'
* assert driver.eval('1 + 2') == 3
编辑:空手道的JS引擎和浏览器JS引擎不同,并且没有连接。因此,您必须将JS作为原始字符串传递给driver.eval()
,这是一个用于提交表单的示例。
* def getSubmitFn =
"""
function(formId) {
return "document.getElementById('" + formId + "').submit()"
}
"""
* def temp = getSubmitFn('eg02FormId')
* print temp
* driver.eval(temp)
编辑:我刚刚记得,* driver.eval()
是有效的,不需要做* eval karate.eval()
通常,传递给driver.eval()
的内容可能很简单,但是它必须是字符串,并且不能使用空手道变量(在动态创建JS时必须对其进行硬编码)。您可以使用DOM对象和函数。您可以用;
分隔多个JS语句。