Как правильно использовать функцию ExecuteAsyncScript
У меня есть тест, который проверяет работоспособность всех страниц. Решил сделать это с помощью fetch. Для каждой страницы вызываю:
Driver.HandleXHR(link);
public static void HandleXHR(this IWebDriver driver, string url)
{
var js = ((IJavaScriptExecutor)driver);
dynamic response = js.ExecuteAsyncScript(
"const result = await fetch(arguments[0]);" +
"console.log(result);" +
"return result;", url);
Assert.IsTrue((bool)response["ok"], $"{response["status"]}, {response["url"]}");
}
Проблема такая: на первой итерации при завершении выполнения скрипта выбрасывается OpenQA.Selenium.WebDriverTimeoutException : script timeout.
Вопрос: Как мне переписать мой скрипт js, чтобы это сработало для ExecuteAsyncScript()?
Ответы (1 шт):
Автор решения: arby
→ Ссылка
В общем насколько я понял вернуть результат можно вызвав callback(), а в качестве параметра - то что хотите вернуть.
Вот реализация через XMLHttpRequest()
public static void HandleXHR(this IWebDriver driver, string url)
{
var js = ((IJavaScriptExecutor)driver);
dynamic response = js.ExecuteAsyncScript(
"var callback = arguments[arguments.length - 1];" +
"var xhr = new XMLHttpRequest();" +
$"xhr.open('GET', '{url}', true);" +
"xhr.onreadystatechange = function() {" +
" if (xhr.readyState == 4) {" +
" callback(xhr);" +
" }" +
"};" +
"xhr.send();");
Assert.AreEqual(200, response["status"], $"{response["status"]}, {response["statusText"]}, {response["responseURL"]}");
}
Вот реализация через fetch():
public static void HandleXHR(this IWebDriver driver, string url)
{
var js = ((IJavaScriptExecutor)driver);
dynamic response = js.ExecuteAsyncScript(
"var callback = arguments[arguments.length - 1];" +
$"callback(await fetch('{url}'));");
Assert.IsTrue((bool)response["ok"], $"{response["status"]}, {response["url"]}");
}
PS Лично у меня через fetch() выполняется быстрее на 2.5 сек. 56 страниц.