2016-03-26 12 views
5

nota: una soluzione in selenio o wrapper API Splinter per Selenium va bene!Interagire con iFrame utilizzando Splinter/selenio [Python]

Ho riscontrato problemi di interazione con gli iframe su Twitter.com utilizzando Splinter API per Python.

Per esempio,

with Browser('firefox', profile_preferences= proxySettings) as browser: 
    #...login and do other stuff here 
    browser.find_by_id('global-new-tweet-button').click() 

questo porta in primo piano una finestra di pop-up a digitare in un tweet.

Come posso interagire con questa nuova casella utilizzando Splinter a: 1) Compilare un messaggio 2) cliccare su "Tweet" (inviare) ..programmatically naturalmente.

Ho provato a ispezionare l'elemento ma non sembra essere annidato all'interno di un iframe, tuttavia esso mira a un iframe. Quindi non sono sicuro di come trovare/interagire con gli elementi in questo pop-up.

Ho provato a digitare manualmente in un messaggio facendo clic sul pulsante Tweet programmazione:

browser.find_by_css('.btn.primary-btn.tweet-action.tweet-btn.js-tweet-btn').click() 

..ma ottengo l'errore:

ElementNotVisibleException: Message: Element is not currently visible and so may not be interacted with 
Stacktrace: 
    at fxdriver.preconditions.visible (file:///var/folders/z1/8rqrglqn2dj8_yj1z2fv5j700000gn/T/tmppRsJvd/extensions/[email protected]/components/command-processor.js:10092) 
    at DelayedCommand.prototype.checkPreconditions_ (file:///var/folders/z1/8rqrglqn2dj8_yj1z2fv5j700000gn/T/tmppRsJvd/extensions/[email protected]/components/command-processor.js:12644) 
    at DelayedCommand.prototype.executeInternal_/h (file:///var/folders/z1/8rqrglqn2dj8_yj1z2fv5j700000gn/T/tmppRsJvd/extensions/[email protected]/components/command-processor.js:12661) 
    at DelayedCommand.prototype.executeInternal_ (file:///var/folders/z1/8rqrglqn2dj8_yj1z2fv5j700000gn/T/tmppRsJvd/extensions/[email protected]/components/command-processor.js:12666) 
    at DelayedCommand.prototype.execute/< (file:///var/folders/z1/8rqrglqn2dj8_yj1z2fv5j700000gn/T/tmppRsJvd/extensions/[email protected]/components/command-processor.js:12608) 

ho strettamente voglio raggiungere il mio obiettivo con Splinter così per favore non offrire alternative, so che ci sono altri modi. Grazie in anticipo!

risposta

0

Il problema principale sembra essere che si tratti i risultati di browser.find_by_xxx come oggetto elemento, quando in realtà si tratta di un oggetto contenitore di elementi (ad esempio un elenco di elementi di webdriver).

Scrivendo al campo funziona per me se riferimento all'elemento esplicitamente:

In [51]: elems = browser.find_by_id('tweet-box-global') 
In [52]: len(elems) 
Out[52]: 1 
In [53]: elems[0].fill("Splinter Example") 
In [54]: 

che scriverà "Splinter Esempio" in campo per me.

Il clic del pulsante non funziona perché il percorso css restituisce un elenco di tre elementi e si fa clic implicitamente sul primo elemento nascosto. Nel mio test, l'elemento che si vuole realmente fare clic sul è il secondo elemento della lista:

In [26]: elems = browser.find_by_css('.btn.primary-btn.tweet-action.tweet-btn.js-tweet-btn') 
In [27]: len(elems) 
Out[27]: 3 
In [28]: elems[1].click() 
In [29]: 

Quando scatto in modo esplicito il secondo elemento che non genera un errore e fa clic sul pulsante.

Se si aggiunge al percorso CSS è possibile restringere i risultati per solo il pulsante in modal visibile:

In [42]: css_path = "div.modal-tweet-form-container button.btn.primary-btn" 
In [43]: elems = browser.find_by_css(css_path) 
In [44]: len(elems) 
Out[44]: 1 
In [45]: elems.click() 
In [46]: 

Si noti che non fa eccezione è stato gettato qui.