Jak kliknąć element w PhantomJS?
page.evaluate(function() {
document.getElementById('idButtonSpan').click();
});
To daje mi błąd „undefined is not a function ...”
Jeśli zamiast tego
return document.getElementById('idButtonSpan');
a następnie wydrukuj,
następnie wypisuje [obiekt obiektu], więc element istnieje.
Element działa jak przycisk, ale w rzeczywistości jest to tylko element span, a nie dane wejściowe przesyłania.
Udało mi się uzyskać ten przycisk, aby pracować z Casperem, ale Casper miał inne ograniczenia, więc wróciłem do PhantomJS.
javascript
click
phantomjs
user984003
źródło
źródło
click()
w DOM API w ogóle nie istnieje, prawdopodobnie widzieliście to w jQuery lub innej bibliotece tego typu?Odpowiedzi:
.click()
nie jest standardem. Musisz utworzyć wydarzenie i wysłać je: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); }
źródło
el
pomocą jQuery daje tę definicję kliknięcia. Będzie działać w Twojej przeglądarce i Phantom.$(el).click()
Alternatywnie do odpowiedzi @ torazaburo, możesz
HTMLElement.prototype.click
zgubić podczas uruchamiania w PhantomJS. Na przykład używamy PhantomJS + QUnit do uruchamiania naszych testów, aw naszymqunit-config.js
mamy coś takiego: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); }; } }
źródło
window._phantom
obiektu, więc właśnie usunąłem ten stan i działało zgodnie z oczekiwaniami.To nie jest ładne, ale używam tego, aby umożliwić mi użycie jQuery do wyboru:
var rect = page.evaluate(function() { return $('a.whatever')[0].getBoundingClientRect(); }); page.sendEvent('click', rect.left + rect.width / 2, rect.top + rect.height / 2);
ale zawsze możesz zastąpić
$(s)[0]
je,document.querySelector(s)
jeśli nie używasz jQuery.(Zależy to od elementu, który jest w widoku, tj. Twój viewportSize.height jest wystarczająco duży).
źródło
tr
.+1
Mam nadzieję, że poniższa metoda będzie przydatna. U mnie zadziałało w wersji 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; });
To zadziałało dla mnie. Mam nadzieję, że przyda się to również innym
źródło
Gdy
1.9.2
to zadziałało, zostały uruchomione moduły obsługi kliknięć:var a = page.evaluate(function() { return document.querySelector('a.open'); }); page.sendEvent('click', a.offsetLeft, a.offsetTop);
źródło
użyj prostego JavaScript z
evaluate
czymś takim:page.evaluate(function() { document.getElementById('yourId').click(); });
źródło
Nigdy nie udało mi się bezpośrednio kliknąć elementu. Zamiast tego spojrzałem na kod HTML, aby znaleźć funkcję, która została wywołana za pomocą onclick, a następnie wywołałem tę funkcję.
źródło
Document.querySelector (element) .click () działa podczas korzystania z 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); },
źródło
W PhantomJS możliwe są również podwójne kliknięcia.
Zalecana
To jest adaptacją odpowiedź z stovroz i wyzwala rodem
dblclick
w tymmousedown
,mouseup
aclick
wydarzenia (dwa od siebie).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);
Inaczej
Poniższe dwa sposoby uruchamiają tylko
dblclick
zdarzenie, ale nie inne zdarzenia, które powinny je poprzedzać.Zaczerpnięte z tej odpowiedzi z 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);
Zaczerpnięte z tej odpowiedzi z Jobins Jana :
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);
Pełny skrypt testowy
źródło
Najłatwiej jest użyć jQuery.
page.evaluate(function() { page.includeJs("your_jquery_file.js", function() { page.evaluate(function() { $('button[data-control-name="see_more"]').click(); }); }); });
źródło
Dla tych, którzy używają JQuery, interfejs użytkownika JQuery stworzył narzędzie do ich symulacji: jquery-simulate . Używam tego w PhantomJS i Chrome
$ele..simulate( "click" );
źródło