Используя тот же сеанс для PhantomJs при каждом запуске

Я сканирую защищенный веб-сайт, который блокирует меня всякий раз, когда я перезапускаю приложение-искатель (мне нужно изменить IP как трюк). Я решил эту проблему, используя профиль пользователя по умолчанию в chrome-драйвере вроде этого (я использую С# прямо сейчас, но при необходимости я могу переключиться на java):

ChromeOptions options = new ChromeOptions();
options.AddArguments($"user-data-dir=C:/Users/{Environment.UserName}/AppData/Local/Google/Chrome/User Data/Default");

Сохраняет все сеансы и файлы cookie и восстанавливает их при перезагрузке моего приложения. Все работает так, как ожидалось.

Теперь мне нужно изменить мой webdriver на PhantomJS по некоторым причинам.

Мой вопрос. Как я могу сделать этот сценарий возможным с помощью PhantomJS: войти в учетную запись (например, gmail или facebook), закрыть мое приложение и драйвер, найти себя вошедшим в систему при следующем запуске приложения и драйвера. Другими словами, как я могу использовать один и тот же сеанс для PhantomJS при каждом запуске?

Попробуйте 1 (в С#):

После выполнения какого-то поиска я обнаружил, что это можно сделать, используя локальные файлы хранилища и файлы файлов cookie в PhantomJS. Теперь проблема в том, что локальный путь хранения всегда пуст, и там ничего не сохраняется (я перемещаюсь по нескольким сайтам, но все еще пуст), поэтому я не могу использовать сеанс из предыдущего выполнения. Мой код для установки файла локального хранилища и файлов cookie прост, как показано ниже:

PhantomJSDriverService service = PhantomJSDriverService.CreateDefaultService();
service.LocalStoragePath = Application.StartupPath + "\\default";
service.CookiesFile = Application.StartupPath + "\\default\\Cookies";
IWebDriver driver = new PhantomJSDriver(service);

Что не так с моим подходом?

Попробуйте 2 (в С#):

Основываясь на ответах @SiKing на ответы и комментарии, я изменил код ниже (используя AddArgument), но каталог все еще пуст:

string localStoragePath = Path.Combine(Path.GetTempPath(),"PhantomLocalStorage-");

if (!Directory.Exists(localStoragePath))
{
    Directory.CreateDirectory(localStoragePath);
}

PhantomJSDriverService service = PhantomJSDriverService.CreateDefaultService();
service.AddArgument("--local-storage-quota=5000");
service.AddArgument("--local-storage-path=" + localStoragePath);
IWebDriver driver = new PhantomJSDriver(service);

Попробуйте 3 (в java):

Каталог по-прежнему пуст:

DesiredCapabilities capabilities = DesiredCapabilities.phantomjs();
List<String> cliArgs = new ArrayList<String>();
Path local_storage_path = Paths.get(System.getProperty("java.io.tmpdir") + "PhantomLocalStorage-");
if (Files.notExists(local_storage_path)) {
    try {
        Files.createDirectory(local_storage_path);
    }
    catch (IOException e) {
        JOptionPane.showConfirmDialog(null, "Can Not Create Path");
    }
}
cliArgs.add("--local-storage-quota=5000");
cliArgs.add("--local-storage-path=" + local_storage_path.toString());
capabilities.setCapability(PhantomJSDriverService.PHANTOMJS_CLI_ARGS, cliArgs);
WebDriver driver = new PhantomJSDriver(capabilities);

Ответ 1

PhantomJS по умолчанию начинается без локального хранилища; см. это обсуждение.

Чтобы включить локальное хранилище через Selenium, я использовал следующий код Java. К сожалению, слишком давно я использовал С#, но я уверен, что привязки С# имеют похожие методы.

DesiredCapabilities capabilities = DesiredCapabilities.phantomjs();
// Phantom options can only be set from CLI
List<String> cliArgs = new ArrayList<String>();
cliArgs.add("--local-storage-quota=5000");
Path local_storage_path = Files.createTempDirectory("PhantomLocalStorage-");
cliArgs.add("--local-storage-path=" + local_storage_path.toString());
capabilities.setCapability(PhantomJSDriverService.PHANTOMJS_CLI_ARGS, cliArgs);
WebDriver driver = new PhantomJSDriver(capabilities);

Обратите внимание, что local_storage_path не будет удаляться после того, как вы закончите с ним. Если вам это нужно, вы можете настроить крючок на этот пост. Но я подозреваю, что в С# эта часть будет сильно отличаться от Java.

Ответ 2

Для части файлов cookie вы можете просто сохранить их из одного сеанса:

ReadOnlyCollection<Cookie> cookiesFromFirstSession = driver.Manage().Cookies.AllCookies;

И загрузите их в другой сеанс webdriver:

driver.Manage().Cookies.AddCookie();

Я бы предположил, что это файлы cookie, а не любые другие данные локального хранилища, которые вам нужны, чтобы сохранить один и тот же сеанс.