Selenium смена FirefoxOptions в процессе выполнения тестов

220
06 февраля 2019, 17:10

При запуске браузера, настройки успешно устанавливаются.

FirefoxOptions options = new FirefoxOptions();
options.SetPreference("network.proxy.http", proxy);
options.SetPreference("network.proxy.http_port", port);
options.SetPreference("network.proxy.ftp", proxy);
options.SetPreference("network.proxy.ftp_port", port);
options.SetPreference("network.proxy.ssl", proxy);
options.SetPreference("network.proxy.ssl_port", port);
options.SetPreference("network.proxy.socks", proxy);
options.SetPreference("network.proxy.socks_port", port);
options.SetPreference("network.proxy.type", 1);
IWebDriver driver = new OpenQA.Selenium.Firefox.FirefoxDriver(options);

Но мне нужно иметь возможность менять их в процессе выполнения, без перезапуска браузера. Шастая по интернету я ничего такого не нашел. Интересуют любые способы решения проблемы, не только средствами Selenium

Мне удалось написать функцию которая может менять параметры со строковым типом в about:config вот она

void SetPreference(string preferenceName, string value, IWebDriver driver)
        {
            IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
            js.ExecuteScript($"document.getElementById(\"textbox\").value = '{preferenceName}'");
            js.ExecuteScript("FilterPrefs()");
            js.ExecuteScript("view.selection.currentIndex = 0");
            js.ExecuteScript("ModifySelected();");
            IAlert alert = driver.SwitchTo().Alert();
            alert.SendKeys(value);
            alert.Accept();
        }

Так же можно менять параметры с булевыми значениями на противоположные. Но я не могу считать значение дабы знать стоит ли его менять или нет, вот пример функции для булевых типов

void ChangeBoolValue(string preferenceName, IWebDriver driver)
        {
            IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
            js.ExecuteScript($"document.getElementById(\"textbox\").value = '{preferenceName}'");
            js.ExecuteScript("FilterPrefs()");
            js.ExecuteScript("view.selection.currentIndex = 0");
            js.ExecuteScript("ModifySelected();");
        }

По идее через view можно достучаться, мне удалось достать оттуда Generic object, string или string, object не помню, но там ничего не было. Пользовался этим примером: https://stackoverflow.com/questions/46470473/change-browser-preferences-in-runtime/46478341#46478341

Answer 1

У меня есть предположение, что достаточно просто поменять этот уже созданный options уже после запуска драйвера.

Если не сработает, то ты найдешь Options внутри инстанса driver. Не уверен как он будет называтся, но поищи.

Если же и это не сработает, то предполагаю что поможет создание профиля

FirefoxProfile ffprofile= new FirefoxProfile();
driver = new FirefoxDriver(ffprofile);

и изменение в рантайме профиля нужных настроек:

profile.setPreference("browser.startup.homepage","http://www.google.com");

Что скорее всего подействует, но так же гарантий не даю.

Все вышеперечисленное я не проверял т.к. не имею сейчас доступа к нужному энваерменту. Проверить прийдется тебе.

READ ALSO
Вопрос по ориентации экрана и UI

Вопрос по ориентации экрана и UI

Как сделать, так, чтобы при переключении на альбомную ориаентацию в игре, отключалась одна Panel, и запустилась другая? Можно ли со скрипта как...

186
confirm() в yii2 выполняет действие если нажать отмена

confirm() в yii2 выполняет действие если нажать отмена

Я повесил на кнопку <button type="submit" class="btn btn-primary btn-group-justified" id="save" onclick="confirm('Вы уверены что хотите сохранить?')">Сохранить</button>

164
Где держать бизнес-логику приложения?

Где держать бизнес-логику приложения?

Только начал изучение шаблона MVC и сразу столкнулся с проблемой его понятияПеречитал достаточно статей, но так и не нашел единого подхода

153