फैंटमज; एक तत्व क्लिक करें


81

मैं PhantomJS में किसी तत्व को कैसे क्लिक करूं?

page.evaluate(function() {
    document.getElementById('idButtonSpan').click();  
});

यह मुझे एक त्रुटि देता है "अपरिभाषित एक फ़ंक्शन नहीं है ..."

अगर मैं इसके बजाय

 return document.getElementById('idButtonSpan');

और फिर इसे प्रिंट करें,

तब यह प्रिंट करता है [ऑब्जेक्ट ऑब्जेक्ट], इसलिए तत्व मौजूद है।

तत्व एक बटन के रूप में कार्य करता है, लेकिन यह वास्तव में सिर्फ एक स्पैन तत्व है, न कि सबमिट इनपुट।

मैं कैस्पर के साथ काम करने के लिए इस बटन को क्लिक करने में सक्षम था, लेकिन कैस्पर की अन्य सीमाएं थीं इसलिए मैं फैंटमजस वापस आ गया हूं।


28
उत्तर स्वीकार करने का समय।

3 उत्तर हैं जो "डिस्पैचवेंट" फ़ंक्शन का उपयोग करते हैं, 2 "सेंडईवेंट" का उपयोग करते हैं, एक जो व्यावहारिक रूप से बेकार है और एक जो एक टिप्पणी होनी चाहिए।
redbeam_

# साइन न भूलें ...
GracefulCode

click()DOM API में कोई भी ऐसा क्यों नहीं है जो अभी तक मौजूद नहीं है, आपने शायद इसे jQuery में देखा है या कुछ लिबास जैसे?
यमसाल्ट

4 साल बाद: उत्तर स्वीकृत! मैं PhantomJS से दूर हो गया इसलिए उत्तर को सत्यापित नहीं कर सका। लेकिन मैं स्वीकार करूँगा कि 58 upvotes सही हैं :) @torazaburo
user984003

जवाबों:


68

.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);
}

9
elJQuery के साथ लपेटकर आपको क्लिक का यह मानदंड देता है। यह आपके ब्राउज़र में और प्रेत में काम करेगा। $(el).click()
Bluu

3
लगभग 12 घंटे के निरंतर संघर्ष के बाद, खुशी के आंसू छोड़े! सूंघो सूंघो!
user1323136

1
मेरे लिए भी ठीक काम किया है, लेकिन प्रसंस्करण समाप्त होने से पहले किसी को भी फैंटमजस से बाहर निकलने के लिए याद नहीं करना चाहिए। मुझे एक बटन पर क्लिक करने और बाहर निकलने के लिए एक छोटी स्क्रिप्ट की आवश्यकता थी। यह मेरे लिए तब तक काम नहीं करेगा, जब तक कि मैं pantom.exit () पेज के भीतर से फोन नहीं करता हूं। तब तक का कार्य = फ़ंक्शन () {...};
ग्रैगको

document.querySelector (element) .click () मेरे लिए ठीक काम करता है।
ग्रेसफुलकोड

कस्टम नियंत्रणों के साथ काम करने के लिए, मुझे 3 घटनाओं के साथ और अधिक जटिल समाधान करना पड़ा: फ़ंक्शन ट्रिगरमूशन (एल्म, ईवेंटटाइप) {var ev = document.createEvent ("माउसइवेंट"); ev.initMouseEvent (EventType, true / * बुलबुला /, true / रद्द करने योग्य / /, window, null, 0, 0, 0, 0, / निर्देशांक / गलत, गलत, गलत, / संशोधक कुंजियाँ * / 0 / * बाएँ * /, शून्य ); elm.dispatchEvent (ev); } फंक्शन क्लिक (एल्म) {ट्रिगरमैसवेंट (एल्म, 'मूसडाउन'); ट्रिगरहाउस (एल्म, 'माउसअप'); ट्रिगरमाईवेंट (एल्म, 'क्लिक'); }
ए-बोबकोव

34

वैकल्पिक रूप से @ torazaburo की प्रतिक्रिया के अनुसार, आप HTMLElement.prototype.clickPhantomJS में दौड़ने पर रुक सकते हैं। उदाहरण के लिए, हम अपने परीक्षण चलाने के लिए 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);
    };
  }
}

1
एक सिर है कि मैं कर्म 0.12.17 को प्रेत 1.9.1-14 के साथ चला रहा हूं। कोई window._phantomवस्तु नहीं है इसलिए मैंने बस उस शर्त को हटा दिया और यह उम्मीद के मुताबिक काम किया।
ब्रैडग्रेन

मुझे आश्चर्य है कि अगर फ़ंक्शन को
माउसइवेंट के

16

यह सुंदर नहीं है, लेकिन मैं इसे चयन के लिए jQuery का उपयोग करने की अनुमति देने के लिए उपयोग कर रहा हूं:

var rect = page.evaluate(function() {
    return $('a.whatever')[0].getBoundingClientRect();
});
page.sendEvent('click', rect.left + rect.width / 2, rect.top + rect.height / 2);

लेकिन आप हमेशा jQuery का उपयोग न करने के $(s)[0]साथ बदल सकते हैं document.querySelector(s)

(यह तत्व को देखने के दिमाग में होने पर निर्भर करता है, यानी आपका viewportSize.height काफी बड़ा है)।


2
सभी संभव दृष्टिकोणों की कोशिश की और यह एकमात्र विकल्प है जिसने क्लिक करने की कोशिश करते समय मेरे लिए काम किया tr
काई

प्रेत ०.१.० पर और एक <a> तत्व
redbeam_

1
सबसे अच्छा समाधान imo,+1
फ्लैश थंडर

10

आशा है कि निम्नलिखित विधि उपयोगी होगी। इसने मेरे लिए संस्करण 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
@QadirHussain यह वास्तव में पृष्ठ के पूरी तरह से लोड होने की प्रतीक्षा कर रहा है। इसका लगभग पेज लोड करने के लिए एक विशेष समय सेट करने जैसा है।
जॉबिन्स जॉन

6

इसके 1.9.2लिए मेरे साथ काम करने पर, क्लिक हैंडलर चालू हो गए:

var a = page.evaluate(function() {
    return document.querySelector('a.open');
});

page.sendEvent('click', a.offsetLeft, a.offsetTop);

यह सभी तत्वों पर नहीं है। उदाहरण के लिए <a> में यह नहीं है। बटन पर यह वहाँ है।
अनलॉन्ड करें

6

evaluateइस तरह से सरल जावास्क्रिप्ट का उपयोग करें:

page.evaluate(function() {
    document.getElementById('yourId').click();
});

1
वास्तव में अब यह PhantomJS 2.x
BlaM

3

मैं तत्व को सीधे क्लिक करने में सक्षम नहीं था। इसके बजाय, मैंने यह देखने के लिए html को देखा कि किस फ़ंक्शन को ऑनक्लिक के साथ बुलाया गया था, और फिर उस फ़ंक्शन को कहा गया।


आप फ़ंक्शन को कैसे ढूंढ सकते हैं और अगर आप इसे एडवेंटिस्टलिस्ट के माध्यम से संलग्न किया गया है, तो आप इसे कैसे कॉल कर सकते हैं।
Suo6613

2

Document.querySelector (तत्व) .click () फैंटमज 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);
},

2

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);

पूर्ण परीक्षण स्क्रिप्ट


2

सबसे आसान तरीका jQuery का उपयोग कर रहा है।

page.evaluate(function() {
  page.includeJs("your_jquery_file.js", function() {
    page.evaluate(function() {
      $('button[data-control-name="see_more"]').click();
    });
  });
});

0

JQuery का उपयोग करने वालों के लिए, JQuery UI ने इनका अनुकरण करने के लिए एक उपयोगिता बनाई: jquery-simulate । मैं इसे PhantomJS और Chrome में उपयोग करता हूं

$ele..simulate( "click" );
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.