Behat select2 ajax 关闭搜索框
Behat select2 ajax closes the search box
我想用 Behat 测试一个 select2 投递箱,它发出 ajax 调用以获得结果。
问题是,在我填充 select2 的搜索框后,下拉列表会立即关闭,因此不会进行搜索。
如果 select 已经填充(带有预定义值的正常下拉列表)一切正常,因为所有数据都在那里并且它会立即获取。
我正在为我的项目使用 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 调用完成)?
我设法让它在 select2 v4.x.
下工作
我在关闭时向 js 添加了 select 的选项,如下所示:
js
function buildSelect2Element(selector, placeholder, url) {
var element = $(selector).select2({
theme: "classic",
placeholder: placeholder,
minimumInputLength: 3,
selectOnClose: true, //HERE
然后在我的测试中我使用了 evaluateScript 方法:
select2FieldPopulate method
$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')");
我想用 Behat 测试一个 select2 投递箱,它发出 ajax 调用以获得结果。 问题是,在我填充 select2 的搜索框后,下拉列表会立即关闭,因此不会进行搜索。
如果 select 已经填充(带有预定义值的正常下拉列表)一切正常,因为所有数据都在那里并且它会立即获取。
我正在为我的项目使用 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 调用完成)?
我设法让它在 select2 v4.x.
下工作我在关闭时向 js 添加了 select 的选项,如下所示:
js
function buildSelect2Element(selector, placeholder, url) {
var element = $(selector).select2({
theme: "classic",
placeholder: placeholder,
minimumInputLength: 3,
selectOnClose: true, //HERE
然后在我的测试中我使用了 evaluateScript 方法:
select2FieldPopulate method
$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')");