Подтвердить что ты не робот

.click() не работает в mocha-phantomjs на некоторых элементах

Я пишу несколько тестов, используя Mocha test framework и Chai assertions library Я тестировал они в браузере Chrome, и они работают нормально, но затем я пробую их в безголовом браузере mocha-phantomjs и событиях .click(), которые я отправляю на определенные элементы просто похоже, не стреляют, а другие работают.

Тест успешно регистрируется на веб-сайте, который выполняется с помощью:

$("#login").click()

"# login" - это кнопка отправки формы, и она отлично работает, нажав эту кнопку.

Далее я хочу щелкнуть элемент меню, который является элементом привязки.

$("#menuItemToClick").click();

Здесь он перестает работать в mocha-phantomjs, хотя это отлично работает в chrome.

Таким образом, очевидно, что функция .click() определена и работает, но не для этого элемента.

Я исчерпал свой google-foo. Вот некоторые из других вещей, которые я видел, когда другие упоминают и пробовали:

Использовать javascript dispatchEvent

var evObj = new CustomEvent('click');
evObj.initEvent('click', true, false);
document.getElementById('menuItemToClick').dispatchEvent(evObj);

Это запустит событие click и переводит браузер в правильный URL-адрес, но также приводит к перезагрузке всей страницы, как в хром, так и в mocha-phantomjs, которая перезапускает тесты с самого начала, ставя их в бесконечный цикл. Есть ли способ использовать это без его перезагрузки страницы?

Использовать phantomjs page.sendEvent()

var elementPosition = $("#menuItemToClick").offset();
page.sendEvent('click', elementPosition.left + 1, elementPosition.top + 1);

Предполагается, что он отправит событие с естественным щелчком, если вы передадите ему правильные координаты элемента. Я попытался заставить это работать, но я не мог получить доступ к этой странице в рамках выполняемых тестов mocha. Есть ли способ получить доступ к переменной страницы phantomjs из тестов mocha-phantomjs?

Любая помощь очень ценится!

4b9b3361

Ответ 1

Я вернулся и немного поиграл с этим, и, наконец, получил работу dispatchEvent, не перезагружая страницу, и работает как на хром, так и на мокко-phantomjs! Я думаю, что страница reset/reload имела какое-то отношение к событию, не являющемуся событием мыши конкретно.

Я положил функцию удобства в верхней части моих тестов:

var clickElement = function (el){
    var ev = document.createEvent("MouseEvent");
    ev.initMouseEvent(
      "click",
      true /* bubble */, true /* cancelable */,
      window, null,
      0, 0, 0, 0, /* coordinates */
      false, false, false, false, /* modifier keys */
      0 /*left*/, null
    );
    el.dispatchEvent(ev);
};

и теперь можно щелкнуть мой элемент привязки:

clickElement($("#menuItemToClick")[0]);