2016-11-30 54 views
6

मुझे रिएक्ट के साथ बनाई गई क्रॉलिंग वेबसाइट के साथ काम सौंपा गया है। मैं इनपुट फ़ील्ड भरने और पेज पर जावास्क्रिप्ट इंजेक्ट्स का उपयोग करके फॉर्म जमा करने की कोशिश कर रहा हूं (या तो सेल में सैलेनियम या वेबव्यू)। यह हर दूसरी साइट + तकनीक पर एक आकर्षण की तरह काम करता है लेकिन प्रतिक्रिया वास्तविक दर्द प्रतीत होती है।प्रतिक्रिया के साथ बनाए गए इनपुट तत्वों को प्रोग्रामेटिक रूप से कैसे भरें?

इसलिए यहाँ एक नमूना कोड

var email = document.getElementById('email'); 
email.value = '[email protected]'; 

मैं डोम इनपुट तत्व पर मूल्य परिवर्तन है, लेकिन प्रतिक्रिया परिवर्तन घटना को गति प्रदान नहीं करता है।

मैं राज्य अद्यतन करने के लिए प्रतिक्रिया प्राप्त करने के लिए अलग अलग तरीकों की अधिकता की कोशिश कर रहा हूँ।

var event = new Event('change', { bubbles: true }); 
email.dispatchEvent(event); 

कोई लाभ नहीं हुआ

var event = new Event('input', { bubbles: true }); 
email.dispatchEvent(event); 

काम नहीं कर रहा

काम नहीं कर रहा

मैं बातचीत प्रतिक्रिया के साथ इतना मुश्किल बना दिया गया है विश्वास नहीं कर सकता। मै किसी भी सहायता के लिए बहुत आभारी रहूँगा।

आप

+0

'डोम इनपुट तत्व पर मूल्य परिवर्तन, लेकिन प्रतिक्रिया नहीं करता है परिवर्तन घटना को ट्रिगर करें। आप किस बदलाव की उम्मीद कर रहे हैं? यदि आप इनपुट फ़ील्ड को सफलतापूर्वक भरने में सक्षम हैं, तो क्यों नहीं 'document.forms [0] .submit() '? लेकिन प्रतिक्रिया सत्यापनकर्ता शिकायत है कि आप मूल्य अर्थात लिखना चाहिए मूल्य प्रतिक्रिया घटक – lux

+0

हाँ यह है कि मैं क्या करने की कोशिश है। मैं एक कोडपेन एक साथ टॉस और चारों ओर खेलेंगे। –

+0

आह, कि दिलचस्प है में प्रसारित नहीं कर रहा है - - मैं समझता हूँ – lux

उत्तर

4

प्रतिक्रिया पाठ क्षेत्रों के input घटना के लिए सुन रहा है धन्यवाद।

आप मूल्य बदल सकते हैं और मैन्युअल रूप से एक इनपुट घटना ट्रिगर, और प्रतिक्रिया के onChange हैंडलर ट्रिगर किया जाएगा:

class Form extends React.Component { 
 
    constructor(props) { 
 
    super(props) 
 
    this.state = {value: ''} 
 
    } 
 
    
 
    handleChange(e) { 
 
    this.setState({value: e.target.value}) 
 
    console.log('State updated to ', e.target.value); 
 
    } 
 
    
 
    render() { 
 
    return (
 
     <div> 
 
     <input 
 
      id='textfield' 
 
      value={this.state.value} 
 
      onChange={this.handleChange.bind(this)} 
 
     /> 
 
     <p>{this.state.value}</p> 
 
     </div>  
 
    ) 
 
    } 
 
} 
 

 
ReactDOM.render(
 
    <Form />, 
 
    document.getElementById('app') 
 
) 
 

 
document.getElementById('textfield').value = 'foo' 
 
const event = new Event('input', { bubbles: true }) 
 
document.getElementById('textfield').dispatchEvent(event)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> 
 

 
<div id='app'></div>

+0

धन्यवाद, टाइमआउट चाल चल रहा है - मुझे समझ में नहीं आता कि ऐसा क्यों होगा - लेकिन अगर मैं टाइमआउट (सेलेनियम से) के बिना ऐसा करता हूं तो प्रतिक्रिया कभी भी घटना नहीं होती है। मुझे टाइमआउट का उपयोग करने में कुछ समस्याएं हैं हालांकि मुझे इसके चारों ओर एक रास्ता खोजना होगा। –

+0

टाइमआउट आवश्यक नहीं है और मैंने इसे उदाहरण को और स्पष्ट करने के लिए जोड़ा है। अद्यतन w/o टाइमआउट देखें। एकमात्र चीज जिसे आपको सुनिश्चित करने की आवश्यकता है वह यह है कि इनपुट घटक को बदलने वाला कोड पूरी तरह से प्रतिक्रिया घटक के बाद निष्पादित किया जाता है। – Timo

+0

ज़रूर मैं पूरी तरह समझ में आ गया - अपने उदाहरण अब काफी मैं क्या प्रारंभिक प्रश्न में है के रूप में ही है तो मैं कर रहा हूँ यकीन है कि वहाँ में कुछ है - बात यह है कि सेलेनियम प्रक्रिया से फोन कर रहा घटनाओं जब तक समाप्त हो गया आग नहीं है सेलेनियम पुल कि js इंजन –

संबंधित मुद्दे

 संबंधित मुद्दे