Может ли выполнять функцию JS в браузере у KarateDriver? - PullRequest
1 голос
/ 18 мая 2019

При использовании 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 Ответ

1 голос
/ 18 мая 2019

Вы можете сделать driver.eval(), где аргументом является необработанный код JavaScript в виде строки. Я думаю, что этого достаточно для ваших нужд:

* match driver.eval("location.href") == webUrlBase + '/page-01'
* assert driver.eval('1 + 2') == 3

РЕДАКТИРОВАТЬ: движок JS для каратэ и движок Browser 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, разделенных ;.

...