可以在KarateDriver的浏览器中执行JS函数吗?

时间:2019-05-18 06:25:44

标签: karate

使用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();"
    }
    """

1 个答案:

答案 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语句。