2015-02-18 2 views
5

Sono stato in cerca di un modo per accedere a un campo di testo non visibile utilizzando il webdriver del selenio. L'unico modo che ho preso a lavorare sta usandoCome si usa la variabile python in un javascript?

driver.execute_script("document.getElementById('text_field').value+='XYZ'") 

Tuttavia, invece di utilizzare XYZ, voglio usare le variabili Python.

risposta

0

Se io sto capendo il problema in modo corretto si sta cercando di passare un var invece di hard coded XYZ

driver.execute_script("document.getElementById('text_field').value+='" + var + "'"); 
+0

Grazie per la modifica @Jossef – Saifur

1

Se non mi misisng qualcosa, una possibilità è:

driver.execute_script("document.getElementById('text_field').value+='{0}'".format(foo)) 
2

È necessario per ottenere una rappresentazione stringa JavaScript del valore della variabile Python e inserirla nel comando JavaScript. Fortunatamente, il modulo di Python json farà questo per voi.

from json import dumps 

driver.execute_script("document.getElementById('text_field').value+=" + 
         dumps(my_python_variable)) 

Sarei cauto nell'introdurre il valore nelle virgolette come hanno mostrato altre risposte. Cosa succede se il valore contiene già delle virgolette o caratteri speciali che devono essere salvati? Cosa succede se non è una stringa? json.dumps gestirà tutta la formattazione e l'escaping necessarie per te, appropriate al tipo di variabile.

+0

risposta perfetta con informazioni sufficienti per darmi il caldo e il fuzzy! –

+0

Se ti è piaciuto, sentiti libero di accettarlo! – kindall

5

Il modo normale di passare delle variabili al codice JavaScript si esegue attraverso il selenio è di passare solo le variabili da execute_script:

foo = "something" 
driver.execute_script(""" 
var foo = arguments[0]; 
document.getElementById('text_field').value += foo; 
""", foo) 

si recupera il ragionamento sul lato JavaScript attraverso il arguments object. Si può fare questo perché il codice si passa a execute_script è avvolto in una funzione in modo da ciò che viene eseguito è qualcosa di simile:

function() { 
    var foo = arguments[0]; 
    document.getElementById('text_field').value += foo; 
} 

e la funzione viene chiamata con gli argomenti che sono stati passati a execute_script. Gli argomenti sono serializzati automaticamente da Selenium.

L'interpolazione con .format o il concatenamento di stringhe sono modi fragili per farlo. Ad esempio, se lo fai, 'var foo = "' + foo + '"' questo si interromperà non appena la tua variabile foo avrà una doppia citazione (uguale a 'var foo = "{0}"'.format(foo)). Utilizzando json.dumps sta per evitare questo e funzionerà nella maggior parte dei casi, ma non prendersi cura di qualcosa di simile a questo:

el = driver.find_element(".something") 

// Do stuff with el on the Python side. 

driver.execute_script(""" 
var el = arguments[0]; 
// Do something with el on the JavaScript side. 
""") 

selenio sa come convertire il Python oggetto ti dà quando si trova un oggetto a un DOM oggetto sul lato JavaScript. json.dumps non lo fa.