2016-11-19 3 views
0

Ich möchte mit Behat eine select2 Dropbox testen, die einen Ajax-Aufruf macht, um die Ergebnisse zu erhalten. Das Problem ist, dass unmittelbar nachdem ich das Suchfeld von select2 bevölkert habe, das Dropdown sofort geschlossen wird, so dass die Suche nicht stattfindet.Behat select2 ajax schließt das Suchfeld

Wenn die Auswahl bereits ausgefüllt ist (ein normales Dropdown mit vordefinierten Werten), ist alles in Ordnung, da alle Daten vorhanden sind und sie sofort übernommen werden.

Ich Behat Page object für mein Projekt mit so hier ist meine Methode:

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; 
} 

Unter $select2Input->setValue() wird das Suchfeld mit dem Wert gefüllt, aber die Suche wird nicht ausgeführt, da das Dropdown-Menü sofort geschlossen wird.

Die Frage ist also: Gibt es eine Möglichkeit, die Box zu zwingen, offen zu bleiben, bis die Ergebnisse angezeigt werden (der Ajax-Aufruf ist beendet)?

+0

Die Auswahl sollte sich wie manuell verhalten und Sie müssen möglicherweise Eingabe simulieren (Tastatur drücken), anstatt den Wert festzulegen. Auch möchten Sie möglicherweise eine einzige Methode, um das Element zu finden und das Objekt zurückgeben, wenn gefunden oder Ausnahme auslösen anstatt dies in der Methode zu behandeln, die Sie für jedes Element/Aktion benötigen. – lauda

+0

ok, ich habe es geschafft, die Suche mit 'select2 ('search', 'key')' zu machen, aber jetzt stehe ich fest, wie man auf den hervorgehobenen Wert klickt ... –

Antwort

1

Ich schaffte es, es unter select2 v4.x zu arbeiten.

ich hinzugefügt, um die js die Option schließen aus, auf wie folgt aus:

js

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

Dann in meinen Tests ich die evaluateScript Methode verwendet:

select2FieldPopulate-Methode

$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')");