我正在尝试测试Drupal生成的表单,其中有一些自动完成功能可以帮助人们做出正确的选择。
在此表单中,有3个字段可供用户选择3篇文章('Actualités'),一旦您开始输入内容,自动完成将生成具有相似标题的文章列表。
以下是一个例子:
问题在于我在进行一些测试时意识到使用$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());
}
但我总是得到相同的结果,如下:
一旦我有了焦点,我需要做的就是按下“向右”方向箭头再次显示下拉菜单,然后按“向下”方向箭头选择建议,然后按“Enter”确认选择。
然而,即使我在Behat的github上发现了一些关于这个问题的问题,我也开始没有想法了,但是我无法让答案发挥作用。如何触发自动完成?
提前谢谢
答案 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;
如果你想要,你也可以调整它来填充场地并在之后触发事件。
要检查需要触发的事件,您需要检查该元素并检查检查器中的ev
。