Mendapatkan nilai kembali kode Javascript di Selenium

102

Saya menggunakan Selenium2 untuk beberapa tes otomatis situs web saya, dan saya ingin mendapatkan nilai kembali dari beberapa kode Javascript. Jika saya memiliki foobar()fungsi Javascript di halaman web saya dan saya ingin memanggilnya dan mendapatkan nilai kembali ke kode Python saya, apa yang dapat saya panggil untuk melakukannya?

Eli Courtwright
sumber

Jawaban:

166

Untuk mengembalikan nilai, cukup gunakan returnkata kunci JavaScript dalam string yang diteruskan ke execute_script()metode, mis

>>> 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
sumber
jika variabel tidak ditentukan oleh javascript, apa yang akan menjadi nilai kembaliannya? Apakah itu melempar pengecualian atau hanya string kosong?
Alex
jika variabel tidak ditentukan, ia mengembalikanNone
dbJones
7
catatan singkat untuk newbs tersebut, return_value = wd.execute_script("return {foo: 'bar'}")akan menyimpan nilai yang dikembalikan untuk digunakan nanti dalam program Anda.
ntk4
1
yang doc Lacks menentukan Retruns: catatan. Meskipun di Teir Usage: sample mereka menempatkan js yang mengembalikan judul dokumen. Lebih baik untuk secara eksplisit menentukan Retruns: di doc mereka
woodz
7

Anda dapat mengembalikan nilai meskipun Anda tidak memiliki potongan kode yang ditulis sebagai fungsi seperti pada kode contoh di bawah ini, hanya dengan menambahkan return var;di bagian akhir di mana var adalah variabel yang ingin Anda kembalikan.

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''')

resultakan berisi array yang ada dalam URLskasus ini.

Eduard Florinescu
sumber