Pobieranie wartości zwracanej kodu JavaScript w Selenium

104

Używam Selenium2 do niektórych zautomatyzowanych testów mojej witryny i chciałbym mieć możliwość uzyskania wartości zwracanej przez kod JavaScript. Jeśli mam funkcję foobar()Javascript na mojej stronie internetowej i chcę ją wywołać i uzyskać wartość zwracaną do mojego kodu Pythona, co mogę wywołać, aby to zrobić?

Eli Courtwright
źródło

Odpowiedzi:

168

Aby zwrócić wartość, wystarczy użyć returnsłowa kluczowego JavaScript w ciągu przekazanym do execute_script()metody, np

>>> 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
źródło
jeśli zmienna nie jest zdefiniowana przez javascript, jaka byłaby wartość zwracana? Czy zgłasza wyjątek, czy po prostu pusty ciąg?
Alex
jeśli zmienna nie jest zdefiniowana, zwracaNone
dbJones
7
krótka uwaga dla tych newbs, zapisze return_value = wd.execute_script("return {foo: 'bar'}")zwróconą wartość do późniejszego wykorzystania w programie.
ntk4
1
doc brakuje Określanie Retruns: notatka. Chociaż w teir Usage: sample wstawili js, który zwraca tytuł dokumentu. Lepiej jednoznacznie określić Retruns: w ich dokumencie
woodz
8

Możesz zwracać wartości, nawet jeśli nie masz wyciętego kodu zapisanego jako funkcja, jak w poniższym przykładowym kodzie, po prostu dodając return var;na końcu, gdzie zmienna jest zmienną, którą chcesz zwrócić.

result = driver.execute_script('''
cells = document.querySelectorAll('a');
URLs = [];
[].forEach.call(cells, function (el) {
    URLs.push(el.href)
});
return URLs
''')

resultbędzie zawierać tablicę, która jest w URLstym przypadku.

Eduard Florinescu
źródło