Selenium FirefoxDriver: разделяйте сеансы/файлы cookie между разными экземплярами

У меня есть следующий сценарий:

У меня есть программа C# WPF, в которой я пытаюсь получить доступ к разным веб-сайтам одновременно и собирать с них данные.

Веб-сайт A (www.example.com) имеет форму входа и после входа отображает ряд ссылок, таких как www.example.com?redir=abc.

Что я делаю:

  • запустить FirefoxDriver 1
  • авторизоваться
  • бесконечный цикл: собрать все ссылки и обновить страницу

Проблема в том, что у меня есть другой экземпляр FirefoxDriver 2, работающий в другом потоке в моем проекте.

В этом экземпляре 2 я получаю доступ к ссылкам, которые я собрал ранее, и хочу их открыть.

Проблема в том, что для того, чтобы получить к ним доступ (они перенаправляют), мне нужно снова войти на веб-сайт A. Когда я вхожу в систему, сеанс на экземпляре 1 завершается, поэтому мне нужно снова войти туда и т. д. и т. д., поэтому эффективно экземпляры «крадут» сеансы друг у друга. (Я хочу масштабировать это еще больше, чтобы иметь экземпляры 3,4... так что это еще больше усугубляет проблему).

Очевидно, моя проблема в том, что экземпляр 1 и экземпляр 2 не используют один и тот же сеанс.

Возможности, которые я нашел для решения проблемы:

  • используя тот же FirefoxProfile: пробовал, не работает, по-прежнему не разделяет сеанс
  • использование одного экземпляра с 2 окнами/вкладками и доступ к нему из обоих потоков с использованием класса Selenium ThreadGuard: кажется очень сложным, так как мне нужно будет постоянно переключаться между окнами
  • использование Selenium Grid: кажется излишним, и я еще не мог понять, подходит ли это мне

Поэтому я спрашиваю, у кого-нибудь есть совет, как мне это спроектировать?

Спасибо за помощь.


person skhro87    schedule 30.09.2014    source источник
comment
Немного смущен, почему вы даже используете потоки для этого?   -  person Arran    schedule 30.09.2014
comment
потому что мне нужно постоянно обновлять и читать с веб-сайта А как можно чаще и в то же время делать что-то на втором веб-сайте Б. Я предположил, что потоки — это правильно, и на самом деле понятия не имел, как я мог бы сделать это иначе. Может есть предложения?   -  person skhro87    schedule 30.09.2014


Ответы (1)


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

var driver1 = new FirefoxDriver();
driver1.Navigate().GoToUrl("http://www.html-kit.com/tools/cookietester/");
driver1.FindElementByXPath("//input[@value=\"Set Test Cookie\"]").Click();

var driver2 = new FirefoxDriver();
driver2.Navigate().GoToUrl("http://www.html-kit.com/tools/cookietester/");

// Copy cookies from one driver to the other
foreach (Cookie c in driver1.Manage().Cookies.AllCookies)
{
    driver2.Manage().Cookies.AddCookie(new Cookie(c.Name, c.Value, c.Domain.TrimStart('.'), c.Path, c.Expiry));
}

driver2.Navigate().Refresh();

Единственная проблема, которую мне пришлось решить, заключалась в том, что WebDriver (или Firefox) не позволяет вам устанавливать файлы cookie, если вы не находитесь в том же домене. Поэтому требуется небольшая хитрость: перейдите по URL-адресу в том же домене и обновите его или перейдите к целевому URL-адресу позже. Итак, в вашем случае:

  • Driver1: перейдите к SiteA
  • Водитель1: Войти
  • Driver2: перейдите к SiteA
  • Скопируйте куки от Водителя1 к Водителю2
  • Driver2: Обновить (сейчас необходимо войти в систему)
  • Driver2: перейдите к SiteB

Немного сценария. Надеюсь это работает. Удачи.

person ziya    schedule 05.10.2014
comment
Спасибо! это работает, по крайней мере, в большинстве случаев... у меня странное поведение, когда я перехожу к определенному URL-адресу на том же веб-сайте... работаю над исправлением этого. надеюсь, наконец, я смогу использовать это решение в моем конкретном случае использования - person skhro87; 09.10.2014
comment
спасибо за уловку с установкой второго драйвера в том же домене, чтобы разрешить копирование файлов cookie. - person dlcardozo; 31.05.2020