使用Behat进行Drupal自动完成测试的问题

时间:2018-02-14 16:49:53

标签: autocomplete behat

我正在尝试测试Drupal生成的表单,其中有一些自动完成功能可以帮助人们做出正确的选择。

在此表单中,有3个字段可供用户选择3篇文章('Actualités'),一旦您开始输入内容,自动完成将生成具有相似标题的文章列表。

以下是一个例子:

behat1

问题在于我在进行一些测试时意识到使用$this->getSession()->getPage()->fillField()会使Behat松散地关注该字段,就像在填充字段时按 Tab 一样。

所以我尝试了很多技巧来获得这个领域的重点,如下所示:

$field = $this->getSession()->getPage()->findField('field_mb_actualites[0][target_id]');

if($field) {

  // Solution #1
  // the dropdown menu is inside a `ul#ui-id-1` element
  $this->getSession()->executeScript("jQuery('#ui-id-1').show();");

  // Solution #2     
  $field->focus();

  // Solution #3
  // Consists of pressing "shift + tab" for a "reverse tab" and trying to get back to the field

  $this->getSession()->getDriver()->keyDown($xpath, 16);
  $this->getSession()->getDriver()->keyDown($xpath, 9);
  $this->getSession()->getDriver()->keyUp($xpath, 9);
  $this->getSession()->getDriver()->keyUp($xpath, 16);

  // And I take a screenshot at the end to see if anything worked
  file_put_contents('screenshot-focus.png', $this->getSession()->getDriver()->getScreenshot());
}

但我总是得到相同的结果,如下:

behat

一旦我有了焦点,我需要做的就是按下“向右”方向箭头再次显示下拉菜单,然后按“向下”方向箭头选择建议,然后按“Enter”确认选择。

然而,即使我在Behat的github上发现了一些关于这个问题的问题,我也开始没有想法了,但是我无法让答案发挥作用。如何触发自动完成?

提前谢谢

1 个答案:

答案 0 :(得分:1)

您可以使用JavaScript函数触发此事件:



    public function triggerEventOn($css_selector){
        $function = <<<JS
        (function(){
        var element = document.querySelector("$css_selector");
        var event = document.createEvent('Event');
        event.initEvent('change', true, true);
        element.dispatchEvent(event);
        })()
JS;

        try{
            $this->getSession()->getDriver()->executeScript($function);
        }catch (Exception $e){

        }
    }
&#13;
&#13;
&#13;

如果你想要,你也可以调整它来填充场地并在之后触发事件。 要检查需要触发的事件,您需要检查该元素并检查检查器中的ev