Минк: дождитесь загрузки страницы в @BeforeStep

Я хочу выполнить некоторый javascript на странице в хуке @BeforeStep, который зависит от jQuery. Однако jQuery в то время не определен, фактически страница пуста.

Вот чего я пытаюсь добиться:

/**
 * @BeforeStep @javascript
 */
public function registerAjaxEventHandlers()
{
    $javascript = <<<JS
        window.jQuery(document).ready(function () {
            if (window.__ajaxStatus !== undefined) {
                return;
            }
            window.__ajaxStatus = 'none';

            $('body').ajaxStop(function() {
              window.__ajaxStatus = 'idle';
            });

            $('body').ajaxStart(function() {
              window.__ajaxStatus = 'in-flight';
            });
        });
JS;
        //$this->getSession()->wait(5000, 'window.jQuery !== undefined');
        $this->getSession()->executeScript($javascript);
    }

Я подумал, что, может быть, я мог бы подождать, пока страница сначала загрузит jQuery (строка с комментариями), но это не так. Похоже, выполнение останавливается до тех пор, пока этот хук не будет обработан.

Какое правильное место в экосистеме behat/mink для выполнения javascript на странице?


person Dziamid    schedule 23.08.2012    source источник
comment
В итоге я добавил приведенный выше JS-скрипт в исходный код.   -  person Dziamid    schedule 15.10.2012


Ответы (2)


Как насчет этого?

$this->getSession()->wait(5000, 'typeof window.jQuery == "function"');
person Jakub Zalas    schedule 24.08.2012
comment
Тоже не помогает. Ждет 5 секунд, пока экран белый, и продолжает. - person Dziamid; 15.10.2012
comment
Я сделал что-то подобное, но это приводит к тому, что сценарий выполняется намного дольше, когда шаг не взаимодействует с браузером, например при загрузке необходимых данных. Выполнение проверки типа $this->getSession->getCurrentUrl() === 'about:blank' помогает, но, возможно, есть более элегантный способ. - person Adam Elsodaney; 14.09.2015

Ваш javascript выполняется перед шагом, то есть до загрузки страницы. Но если вы загрузите страницу, все виды ondomload/pageload JavaScript уже будут запущены.

Если вы хотите запустить его после начальной страницы, вы можете использовать @AfterStep следующим образом:

/**
 * @AfterStep
 */
public function set_selenium_css_selector (Behat\Behat\Event\StepEvent $event) {
  $this->getSession()->wait(10, 'jQuery ("body").addClass ("selenium")');
}
person Berend de Boer    schedule 31.08.2013