Мне нужно сохранить некоторые элементы из локального хранилища с помощью С# (через js, потому что кажется, что нет решения с «чистым» С#). Я пробовал это (извините за соглашение по коду, я делал это в спешке):
public string token;
string storageToken = "localStorage.getItem('token')";
token = (string)js.ExecuteScript(storageToken);`
Когда я запускаю это, он получает пустую строку для этих элементов. Моя цель — получить элементы локального хранилища, сохранить их в переменных и использовать в другом методе:
string tokenSetItemScript = $"localStorage.setItem('token','{token}')";
js.ExecuteScript(tokenSetItemScript);
Попробуйте с этим (пример Java, но С# должен быть очень похож):
LocalStorage local = ((WebStorage) driver).getLocalStorage();
Я не думаю, что для С# больше нет эквивалентного интерфейса (или класса) WebStorage. Я нашел это selenium.dev/selenium/docs/api/dotnet/html/… но, насколько я знаю, он отсутствует в последних версиях селена.
Спасибо за ваш ответ, но с С# он не работает таким образом
Используя javascript, вы можете установить элемент или получить элемент из локального хранилища.
public static class WebDriverExtensions
{
public static void SetItemToLocalStorage(this IWebDriver driver, string key, string value)
{
var js = (IJavaScriptExecutor)driver;
js.ExecuteScript("localStorage.setItem(arguments[0],arguments[1])", key, value);
}
public static string GetItemFromLocalStorage(this IWebDriver driver, string key)
{
var js = (IJavaScriptExecutor)driver;
return (string)js.ExecuteScript($"return window.localStorage.getItem('{key}')");
}
}
А затем используйте эти методы расширения, например:
driver.SetItemToLocalStorage("token", "your-token");
string token = driver.GetItemFromLocalStorage("token")
Вы должны включить полный код. Я не думаю, что вы сможете получить эти значения, если вы в настоящее время не находитесь в домене, который их установил. С помощью приведенного выше кода невозможно определить, в каком домене вы находитесь. Вероятно, вам также понадобится оператор return в вашем JS, но ответ Алекса ниже кажется немного более элегантным.