2016-11-30 96 views
6

React ile oluşturulmuş tarama web sitesiyle görevlendirildim. Girdi alanlarını doldurmaya ve sayfaya javascript enjeksiyonu kullanarak göndermeye çalışıyorum (selenyum veya mobilde web görünümü). Bu, diğer her site + teknolojisinde bir çekicilik gibi çalışır ancak React gerçek bir acı gibi gözüküyor. işte React ile oluşturulan giriş öğelerini program aracılığıyla nasıl doldurulur?

bir örnek kod

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

I DOM giriş öğesinin üzerinde değeri değiştiğinde, ancak değişim olayı tetiklemez yanıt verin.

Ben durumunu güncellemek için Tepki almak için farklı yollar bolluk çalışıyorum.

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

Çok zor hale getirilmiştir tepki ile etkileşim inanamıyorum

çalışmıyor

çalışmıyor boşuna

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

. Her türlü yardıma çok minnettar olurum.

Eğer

+0

'DOM giriş öğesinin üzerinde değer değişiklikleri, ancak değil Tepki Değişiklik olayını tetikle. 'Ne değişiklik olayı bekliyorsunuz? Giriş alanını başarılı bir şekilde doldurabiliyorsanız, neden "document.forms [0] .submit()')? ama doğrulayıcı değerin bu ilginç bileşen – lux

+0

evet bu benim yapmaya çalışacağım budur. Bir kod yazısını toplayıp oynayacağım. bu kadar olurdu Oldukça neden anlamıyorum - - –

+0

Ah Tepki yayılır değil değer yani doldurmalısınız şikayet Tepki - - Anlıyorum – lux

cevap

4

metin alanlarından input Olayı dinleyen React ederiz.

Sen onChange işleyicisi tetikleyecek değerini değiştirmek ve manuel bir giriş olayını tetikleyebilir ve en tepki verebilir

:

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

sayesinde zaman aşımı hileye neden olabilir ama Tepki (selenyum itibaren) zaman aşımı olmadan aynı yaparsanız olayı hiçbir zaman alır. bu yüzden onun etrafında bir yol bulmak gerekecek olsa Ben aşımını kullanarak bazı sorunları mevcuttur. –

+0

Zaman aşımı gerekli değildir ve ben sadece örneği daha açık yapmak için ekledim. Güncelleme w/o zaman aşımı bakın. Emin olmanız gereken tek şey, giriş değerini değiştiren kodun, reaksiyon bileşeni tamamen oluşturulduktan sonra yürütülmesidir. – Timo

+0

Tabii ben tamamen anladım - senin örneğin artık hemen hemen aynı ben ilk soru ne var gibidir yüzden bir şey oldukça emin olduğunu ediyorum - şey Selenyum sürecinden çağıran olaylar zaman aşımına sürece ateş kalmamasıdır js motorunu –