Запретить Selenium открывать новое окно

сегодня я использую Selenium для анализа данных с веб-сайта. Вот мой код:

    public ActionResult ParseData()
    {
        IWebDriver driver = new FirefoxDriver();
        driver.Navigate().GoToUrl(myURL);
        IList<IWebElement> nameList = driver.FindElements(By.XPath(myXPath));
        return View(nameList);
    }

Проблема в том, что всякий раз, когда он запускается, он открывает новое окно в месте myURL, затем получает данные и оставляет это окно открытым.

Я не хочу, чтобы Selenium открывал здесь новое окно. Просто запустите в фоновом режиме и дайте мне проанализированные данные. Как я могу этого добиться? Помогите мне, пожалуйста. Большое спасибо.


person Triet Doan    schedule 19.01.2014    source источник
comment
Запуск драйвера Selenium в веб-запросе - не очень хорошая идея, ИМХО. Почему бы вам не загрузить эту страницу по адресу myURL, используя, например, объект WebClient, а затем просто извлечь необходимые данные из ответа?   -  person turdus-merula    schedule 19.01.2014


Ответы (2)


В целом я согласен с Андреем: зачем использовать Selenium, если вы не планируете взаимодействовать с окном браузера? Сказав это, самое простое, что можно сделать, чтобы Selenium не оставил окно открытым, — это закрыть его перед возвратом из функции:

driver.Quit();

Другой вариант, если страницу не нужно загружать в Firefox, — использовать Драйвер HtmlUnit вместо этого (у него нет пользовательского интерфейса)

person user1433852    schedule 19.01.2014

Что ж, похоже, что при каждом веб-запросе вы создаете (но не закрываете/удаляете) объект драйвера Selenium. Как я уже сказал в комментарии, могут быть лучшие решения для вашей проблемы...

Если вы хотите выбрать веб-страницу и извлечь некоторые данные с нее, не стесняйтесь использовать:

Веб-приложение - не очень гостеприимная среда для экземпляра драйвера Selenium IMHO. Однако, если вы все еще хотите немного поиграть с ним, сделайте экземпляр Selenium статическим и повторно используйте его среди запросов. Тем не менее, если он будет использоваться из параллельных запросов (несколько потоков, работающих одновременно), очень вероятен сбой :) У вас есть возможность защитить экземпляр (блокировки, критическая секция и т. д.) но тогда у вас будет нулевая масштабируемость.

Короткий ответ: получить данные другим способом, насколько я знаю, Selenium предназначен только для автоматических тестов исследования...

Но...

Если вам действительно нужно изучить этот веб-сайт — источник ваших данных — с помощью Selenium... Тогда получите данные с помощью Selenium заранее — гипотетически, в другом процессе (< em>консольное приложение, работающее в фоновом режиме) и сохранить его в некоторых файлах или в базе данных. Затем из веб-приложения считывайте данные и возвращайте их своим клиентам :)

Если у вас еще нет данных, запрошенных клиентом, ответьте с какой-либо ошибкой — «пожалуйста, повторите попытку через 5 минут» и сообщите консольному приложению (которое работает в фоновом режиме) для получения этих данных. (существуют различные способы связи через границы процессов - в нашем случае веб-приложение и консольное приложение, но вы можете использовать простой файл /db для постановки в очередь "запросов данных" - что угодно)...

person turdus-merula    schedule 19.01.2014
comment
Спасибо за Ваш ответ. Итак, я не могу использовать Selenium в фоновом режиме, как HtmlAgilityPack? - person Triet Doan; 19.01.2014
comment
@ Forte_201092 ... Наверное, нет, HtmlAgilityPack выглядит как специализированная библиотека для работы с HTML. С другой стороны, запуск селена означает запуск нового процесса (браузера), управление им и т. д. В рамках веб-запроса ничего нельзя сделать... Извините, если не помог... - person turdus-merula; 20.01.2014