selenium execute_async_script() example + python related details

Mar 29, 2016 17:30

Ответы на вопросы:

1) как правильно использовать selenium execute_async_script - как обернуть кусок js кода делающий return(value); в call back и правильно скормить selenium'у ?

Допустим есть js код, который мне написали для выбора значения со страницы, так вот если я обзову это функцией async_get_price и вместо console.log(price); напишу return price; - какой код надо добавить чтобы чтобы возвращаемое значение попало в call back и далее в результат driver.execute_async_script()?

если упрощеннно:
--------cut-----------
function async_get_price() {
return 10.1;
}
async_get_price();
--------cut-----------
Как вызывть этот код с call back из driver.execute_async_script()?

2) И ещё вопрос - асинхронный вызов предполагает возврат значения не сразу. Что делает питоновский код использующий result=driver.execute_async_script("some js code") - ждёт некоторый timeout пока асинхронный код успеет вернуть значение или сразу возвращает управление и result ещё надо обрабатывть в питоне пока он не окажется изменён?

Ответ:

1) поскольку ф-ия callback подставляется автоматически последним аргументом и возвращает уже свой аргумент, то код нужно предварить объявлением адреса вызова как переменной:

"var callback = arguments[arguments.length - 1];"

а в месте возврата результата вызвать этот адрес с возвращаемым значением как параметром:

callback(YourResultValue);"

Кусок кода из вопроса в итоге будет выглядеть так:
--------cut-----------
var callback = arguments[arguments.length - 1];
function async_get_price() {
return 10.1;
}
value2return=async_get_price();
callback(value2return)
--------cut-----------

Питоновская ф-я совершает асинхронный вызов и возвращает управление синхронно, отдавая резльтат или exception спустя таймаут в милисекундах, который задается вызовом set_script_timeout(), например:

driver.set_script_timeout(500)

При использовании надстройки elementium над selenium не поддерживается вызов execute_async_script(), так что надо вызывать его из selenium объекта который использовался для инициализации elementium объекта, то есть в нижеследующем примере:

print "Opening browser instance.."
browser=webdriver.Firefox()
print "Initializing elementium selenium extention.."
se = SeElements(browser)

вызов должен быть исполнен для объекта browser:

browser.set_script_timeout(500)
value_from_js=browser.execute_async_script(string_with_js_code)

programming, qa automation, selenium, javascript, python

Previous post Next post
Up