У меня была похожая ситуация при тестировании apis. В итоге я связал экземпляр GuzzleClient с сервисным контейнером (см. Документацию ). Что-то вроде:
$this->app->instance('GuzzleHttp\Client', new MockClient);
Чтобы успешно смоделировать экземпляр, я затем проверил, имеет ли он определенное значение свойства (в моем случае base_url
устанавливается). Это определило, был ли экземпляр тестом, поскольку base_url
будет установлен.
Помимо этого метода, GuzzleHttp\Client
имеет MockHandler , который вы можете захотеть исследовать. Это может быть использовано для фальсификации тел ответа, заголовков и кодов состояния.
Ваш конкретный пример работает на меня, но если я добавляю другое поле с тем же именем:
<input type="text" name="keyword1" />
<input type="text" name="keyword1" />
Затем document.adv_search.keyword1.focus()
перестанет работать с ошибкой, которую Вы указываете.
Причина состоит в том что:
document.adv_search.keyword1
ярлык для этого синтаксиса (который возвращается к Уровню 0 DOM и Netscape 2 дня!):
document.forms.adv_search.elements.keyword1
(Кстати, лучше использовать этот полный синтаксис, вместо того, чтобы полагаться на поведение 'документа' и объектов 'формы', индексируемых на именах: если новый метод добавляется к HTMLDocument или HTMLFormElement, который мог бы столкнуться с именем элемента управления, Вы используете. Это - меньше проблемы при использовании document.forms или form.elements наборов. Кроме того, IE по ошибке выводит все имена и идентификаторы в 'документ', поэтому если у Вас есть элемент с id="adv_search"
в дополнение к форме с этим как имя, document.adv_search
возвратит неправильный.)
Так или иначе методы сценариев Уровня 0 DOM ведут себя немного любопытно при доступе к элементу по имени как это. Если будет единственный элемент соответствия, то Вы получите тот как автономный объект. Если с другой стороны, будет больше чем один, то Вы получите список объектов. Вы не можете звонить focus()
или select()
в подобном массиву списке, который является, почему ошибка появляется; необходимо было бы сделать что-то как keyword1[0].focus (), когда список был возвращен.
Таким образом, необходимо решить, собираетесь ли Вы быть использующими олдскульными методами Уровня 0 DOM для доступа к средствам управления формой — in, какой случай Вы оказываетесь перед необходимостью справляться со сниффингом для single-or-multiple-controls — or, перемещаются в основанные на идентификаторе методы, представленные ‘Уровнем 1 DOM’:
document.getElementById('keyword1').focus();
Основанные на идентификаторе методы обычно немного больше вводят (в сценарии и добавить ‘идентификатор ко всем элементам, Вы хотите получить доступ к этому пути, если у них уже нет их), но они просты и однозначны. (Также можно затем отбросить name
на сама <форма>.)
Идентификационный подход действительно является лучшим, но если Вы хотите пойти по имени, используйте getElementsByName.
В этом случае это могло бы быть похожим на это:
<script>
// retrieves array of objects with the name 'keyword1'
// and takes the first one
var key1 = document.getElementsByName('keyword1')[0];
key1.focus();
key1.select();
</script>