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