Obtenir la valeur de retour du code Javascript dans Selenium

103

J'utilise Selenium2 pour certains tests automatisés de mon site Web, et j'aimerais pouvoir obtenir la valeur de retour d'un code Javascript. Si j'ai une foobar()fonction Javascript dans ma page Web et que je veux l'appeler et obtenir la valeur de retour dans mon code Python, que puis-je appeler pour le faire?

Eli Courtwright
la source

Réponses:

167

Pour renvoyer une valeur, utilisez simplement le returnmot-clé JavaScript dans la chaîne passée à la execute_script()méthode, par exemple

>>> from selenium import webdriver
>>> wd = webdriver.Firefox()
>>> wd.get("http://localhost/foo/bar")
>>> wd.execute_script("return 5")
5
>>> wd.execute_script("return true")
True
>>> wd.execute_script("return {foo: 'bar'}")
{u'foo': u'bar'}
>>> wd.execute_script("return foobar()")
u'eli'
Eli Courtwright
la source
si la variable n'est pas définie par javascript, quelle serait la valeur de retour? Lève-t-elle une exception ou simplement une chaîne vide?
Alex
si la variable n'est pas définie, elle renvoieNone
dbJones
7
note rapide pour ces newbs, return_value = wd.execute_script("return {foo: 'bar'}")stockerait la valeur retournée pour être utilisée plus tard dans votre programme.
ntk4
1
le doc ne spécifie pas un Retruns: note. Bien que dans leur utilisation: sample, ils mettent un js qui renvoie le titre du document. Mieux vaut spécifier explicitement Retruns: dans leur doc
woodz
8

Vous pouvez renvoyer des valeurs même si vous n'avez pas votre extrait de code écrit en tant que fonction comme dans l'exemple de code ci-dessous, en ajoutant simplement return var;à la fin où var est la variable que vous souhaitez retourner.

result = driver.execute_script('''cells = document.querySelectorAll('a');
URLs = []
console.log(cells);
[].forEach.call(cells, function (el) {
    if(el.text.indexOf("download") !== -1){
    //el.click();
    console.log(el.href)
    //window.open(el.href, '_blank');
    URLs.push(el.href)
    }
});
return URLs''')

resultcontiendra le tableau qui est dans URLsce cas.

Eduard Florinescu
la source