Behat + mink如何测试jquery-ui自动完成字段?

时间:2014-11-21 06:53:44

标签: jquery-ui-autocomplete behat mink

我正在使用Behat来测试注册页面 此页面包含一些具有自动完成功能的字段。 用户在字段中填写一些值,页面等待500毫秒,发出ajax请求并显示一些选项以及相关消息(未找到任何项目/找到多个项目/找到一个项目。)

我正在使用预定义步骤“我用填写字段”(尝试使用“我填写 < em> field “而不是” 下一步是自定义的,类似于documentation中描述的步骤 - 我只是等待消息出现并检查它是否有正确的文本。

但是在填充场后,Mink会从中移除焦点,导致 blur 事件在场上被触发。
Jquery-ui清除字段值以响应此 blur 事件,因此在500毫秒字段为空并且ajax请求被中止后。

如何解决此问题?

Behat v2.5.0
水貂v1.5.0
水貂延伸v1.3.3
Jquery-ui v1.8.21
Selenium v​​2.44.0

3 个答案:

答案 0 :(得分:0)

下面的解决方案特定于我的标记代码,但应该很容易适应您的。您可能需要修改它。

假设在文本框中选择自动建议选项。用户的击键后,自我提示选项显示为<li>个元素。 <li>元素出现在页面中,但其内容在开头是空的,因此behat没有任何内容可供选择。要解决此问题,<li>标记之间的现有内容将包含<label>标记。

此自动建议字段中的用户类型:

<input name="brand" type="text" />

自动提示数据出现的地方:

<ul>
<li><label>{{ suggestion }}</label></li>
</ul>

<强>小黄瓜:

When I fill in "brand" with "S"
And I wait 1 seconds
Then I select autosuggestion option "Sula"
And I wait 1 seconds
......

<强> FeatureContext:

/**
 * @Given /^I wait (\d+) seconds$/
 */
public function iWaitSeconds($seconds)
{
    sleep($seconds);
}

/**
 * @Then /^I select autosuggestion option "([^"]*)"$/
 *
 * @param $text Option to be selected from autosuggestion
 * @throws \InvalidArgumentException
 */
public function selectAutosuggestionOption($text)
{
    $session = $this->getSession();
    $element = $session->getPage()->find(
        'xpath',
        $session->getSelectorsHandler()->selectorToXpath('xpath', '*//*[text()="'. $text .'"]')
    );

    if (null === $element) {
        throw new \InvalidArgumentException(sprintf('Cannot find text: "%s"', $text));
    }

    $element->click();
}

答案 1 :(得分:0)

@Scenario: I'm stuck
  Given I use jquery-ui-autocomplete
  And I can not test it with behat
  Then I trigger keyDown event like this:
  """
   /**
    * @When I select :entry after filling :value in :field
    */
   public function iFillInSelectInputWithAndSelect($entry, $value, $field)
   {
       $page = $this->getSession()->getPage();
       $field = $this->fixStepArgument($field);
       $value = $this->fixStepArgument($value);
       $page->fillField($field, $value);

       $element = $page->findField($field);
       $this->getSession()->getDriver()->keyDown($element->getXpath(), '', null);
       $this->getSession()->wait(500);
       $chosenResults = $page->findAll('css', '.ui-autocomplete a');
       foreach ($chosenResults as $result) {
           if ($result->getText() == $entry) {
               $result->click();
               return;
           }
       }
       throw new \Exception(sprintf('Value "%s" not found', $entry));
   }
   """

答案 2 :(得分:0)

使用它来填写搜索框:(使用ID选择器)

/**
 * @Then I type :text into search box
 */
public function iTypeTextIntoSearchBox($text)
{
    $element = $this->getSession()->getPage()->findById('searchInput');
    $script  = "$('#searchInput').keypress();";
    $element->setValue($text);
    $this->getSession()->evaluateScript($script);
}