Как мне щелкнуть элемент в PhantomJS?
page.evaluate(function() {
document.getElementById('idButtonSpan').click();
});
Это дает мне ошибку "undefined не является функцией ..."
Если я вместо этого
return document.getElementById('idButtonSpan');
а затем распечатайте его,
затем он печатает [объект объект], значит элемент действительно существует.
Элемент действует как кнопка, но на самом деле это просто элемент диапазона, а не ввод для отправки.
Мне удалось нажать эту кнопку для работы с Casper, но у Casper были другие ограничения, поэтому я вернулся к PhantomJS.
javascript
click
phantomjs
пользователь984003
источник
источник
click()
вообще нет в DOM API, вы, наверное, видели это в jQuery или какой-то подобной библиотеке?Ответы:
.click()
не стандарт. Вам нужно создать событие и отправить его:function click(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); }
источник
el
с помощью jQuery дает вам такую оценку щелчка. Он будет работать в вашем браузере и в Phantom.$(el).click()
В качестве альтернативы ответу @torazaburo вы можете заглушить его
HTMLElement.prototype.click
при работе в PhantomJS. Например, мы используем PhantomJS + QUnit для запуска наших тестов, и уqunit-config.js
нас есть что-то вроде этого:if (window._phantom) { // Patch since PhantomJS does not implement click() on HTMLElement. In some // cases we need to execute the native click on an element. However, jQuery's // $.fn.click() does not dispatch to the native function on <a> elements, so we // can't use it in our implementations: $el[0].click() to correctly dispatch. if (!HTMLElement.prototype.click) { HTMLElement.prototype.click = function() { var ev = document.createEvent('MouseEvent'); ev.initMouseEvent( 'click', /*bubble*/true, /*cancelable*/true, window, null, 0, 0, 0, 0, /*coordinates*/ false, false, false, false, /*modifier keys*/ 0/*button=left*/, null ); this.dispatchEvent(ev); }; } }
источник
window._phantom
объекта, поэтому я просто удалил это условие, и оно сработало, как ожидалось.Это некрасиво, но я использовал это, чтобы позволить мне использовать jQuery для выбора:
var rect = page.evaluate(function() { return $('a.whatever')[0].getBoundingClientRect(); }); page.sendEvent('click', rect.left + rect.width / 2, rect.top + rect.height / 2);
но вы всегда можете заменить его
$(s)[0]
на,document.querySelector(s)
если не используете jQuery.(Он полагается на элемент, имеющийся в виду, т.е. ваш viewportSize.height достаточно велик).
источник
tr
.+1
Надеюсь, следующий метод окажется полезным. У меня сработало в версии 1.9
page.evaluate(function(){ var a = document.getElementById("spr-sign-in-btn-standard"); var e = document.createEvent('MouseEvents'); e.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); a.dispatchEvent(e); waitforload = true; });
Это сработало для меня. Надеюсь, это будет полезно и для других
источник
У
1.9.2
меня это сработало, сработали обработчики кликов:var a = page.evaluate(function() { return document.querySelector('a.open'); }); page.sendEvent('click', a.offsetLeft, a.offsetTop);
источник
используйте простой JavaScript
evaluate
, например:page.evaluate(function() { document.getElementById('yourId').click(); });
источник
Мне никогда не удавалось напрямую щелкнуть элемент. Вместо этого я просмотрел html, чтобы узнать, какая функция была вызвана с помощью onclick, а затем вызвал эту функцию.
источник
Document.querySelector (element) .click () работает при использовании Phantomjs 2.0
click: function (selector, options, callback) { var self = this; var deferred = Q.defer(); options = options || {timeout:1000}; setTimeout(function () { self.page.evaluate(function(targetSelector) { $(document).ready(function() { document.querySelector(targetSelector).click(); }) ; }, function () { deferred.resolve(); }, selector); }, options.timeout); return deferred.promise.nodeify(callback); },
источник
Двойные щелчки также возможны с PhantomJS.
рекомендуемые
Это взято из ответа на stovroz и запускает уроженец
dblclick
включаяmousedown
,mouseup
иclick
событие (два из каждых).var rect = page.evaluate(function(selector){ return document.querySelector(selector).getBoundingClientRect(); }, selector); page.sendEvent('doubleclick', rect.left + rect.width / 2, rect.top + rect.height / 2);
Другие способы
Следующие два способа запускают только
dblclick
событие, но не другие события, которые должны ему предшествовать.Взято из этого ответа на torazaburo :
page.evaluate(function(selector){ var el = document.querySelector(sel); var ev = document.createEvent("MouseEvent"); ev.initMouseEvent( 'dblclick', true /* bubble */, true /* cancelable */, window, null, 0, 0, 0, 0, /* coordinates */ false, false, false, false, /* modifier keys */ 0 /*left*/, null ); el.dispatchEvent(ev); }, selector);
Взято из этого ответа на Jobins Иоанна :
page.evaluate(function(selector){ var el = document.querySelector(sel); var e = document.createEvent('MouseEvents'); e.initMouseEvent('dblclick', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); el.dispatchEvent(e); }, selector);
Полный тестовый сценарий
источник
Самый простой способ - использовать jQuery.
page.evaluate(function() { page.includeJs("your_jquery_file.js", function() { page.evaluate(function() { $('button[data-control-name="see_more"]').click(); }); }); });
источник
Для тех, кто использует JQuery, пользовательский интерфейс JQuery создал служебную программу для имитации этого: jquery-simulate . Я использую это в PhantomJS и Chrome
$ele..simulate( "click" );
источник