2016-11-19 35 views
0

我想用Behat測試一個select2 dropbox,它可以調用ajax來獲得結果。 問題是,在填充select2的搜索框後,立即關閉下拉菜單,因此搜索沒有發生。Behat select2 ajax關閉搜索框

如果選擇已填充(正常的下拉與預定義的值)一切正常,因爲所有的數據是存在的,它需要它的時候了。

我使用Behat Page object爲我的項目,所以這裏是我的方法:

select2FieldPopulate

public function select2FieldPopulate($field, $value) 
{ 
    $select2Field = $this->find('css', '.'.$field); 

    //check if select2Field exists 
    if (!$select2Field) { 
     throw new \Exception(sprintf("Field %s was not found", $field)); 
    } 

    $select2Field->click(); 

    $select2Input = $this->find('css', '.select2-drop.select2-drop-active .select2-search input.select2-input'); 

    if (!$select2Input) { 
     throw new \Exception(sprintf("Field %s was not found", "select2-input")); 
    } 

    $select2Input->setValue($value); 
} 

JS

function buildSelect2Element(selector, placeholder, url) { 
    var element = $(selector).select2({ 
     placeholder: placeholder, 
     minimumInputLength: 3, 
     ajax: { 
      url: url, 
      dataType: 'json', 
      data: function (term) { 
       return { 
        q: term 
       } 
      }, 
      results: function (data) { 

       //workarround to fix select2 
       var results = []; 
       $.each(data, function (index, item) { 
        results.push({ 
         id: item.id, 
         text: item.name 
        }); 
       }); 
       return { 
        results 
       } 
      } 
     } 
    }); 

    return element; 
} 

$select2Input->setValue()搜索框會填充值,但搜索不會發生,因爲該下拉列表會立即關閉。

所以現在的問題是:有沒有辦法迫使框,直到結果顯示(Ajax調用完成後)保持開放?

+0

選擇應該像手動一樣工作,您可能需要模擬鍵入(鍵盤按下)而不是設置值。您也許希望有一個方法來查找元素並返回找到的對象或拋出異常而不是在每個元素/操作所需的方法中處理此操作。 – lauda

+0

好吧,我設法使用'select2('search','key')進行搜索'但現在我被困在如何點擊突出顯示的值... –

回答

1

我設法讓它在select2 v4.x下工作。

我加入到JS的選項,這樣接近選擇上:

JS

function buildSelect2Element(selector, placeholder, url) { 
    var element = $(selector).select2({ 
     theme: "classic", 
     placeholder: placeholder, 
     minimumInputLength: 3, 
     selectOnClose: true, //HERE 

然後在我的測試中,我使用的evaluateScript方法:

select2FieldPopulate方法

$this->getDriver()->evaluateScript("$('#your_select2_element').select2('open')"); 
$this->getDriver()->evaluateScript("$('.select2-search__field').val('". $value ."').keyup();"); 
$this->getDriver()->evaluateScript("$('#your_select2_element').select2('close')");