Selenium не запускается браузер
- первый скрипт запускает браузер(Firefox), и перемещает его профиль с помощью shutil в нужный мне каталог, после этого делает quit либо close браузера
- второй скрипт запускает браузер с этим профилем, который был скопирован.
И как раз-таки проблема в том, что он не запускается. Если же пробовать просто «firefox -profile ./профиль --no-remote», то всё запускается, и виден вывод в stderr какого-то лога. Через selenium же - только ошибки.
Вопрос: что я делаю не так? Всех нюансов работы с Selenium я пока что не знаю, так что прошу меня натолкнуть на истинный пусть. Всем заранее спасибо.
Я понимаю, что selenium пытается создать отдельный(кажется) профиль, но почему?
И на самом деле хорошо бы было, если бы кто-нибудь подсказал мне, как правильно отобрать у selenium профиль браузера. Что ни гуглил - всё какая-то фигня. Пришлось городить огород такой последовательности: Запускаем браузер делаем все необходимые изменения в профиле(для этого я их и сохраняю) Находим в каталоге /tmp/ каталог, начинающийся с tmp*(вот такие адские костыли. Если там будет что-то ещё, начинающееся с tmp - всё коту под хвост). Потом перемещаем его(move) в нужный нам каталог, и закрываем браузер. Всё вроде перемещается, а заново из Селениума работать не хочет. Если есть какой-то уже готовый механизм, или фича в самом Селениуме, которую я не смогу найти - помогите пожалуйста.
В коде подсоединяешься к серверу, он использует данный профиль. Если запускать сервер без опций, будет генериться временный профиль и это правильно с точки зрения чистоты тестовых данных.
Lordwind ★★★★★ ( 16.12.14 17:57:43 )
Последнее исправление: Lordwind 16.12.14 17:58:13 (всего исправлений: 1)
Проблема в том, что мне нужно динамично подгружать разные профили. Для этого я всё это и наворотил.
сорри, не посмотрел на язык, устал уже
Lordwind ★★★★★ ( 16.12.14 18:01:38 )
Последнее исправление: Lordwind 16.12.14 18:02:07 (всего исправлений: 1)
Возможно в том профиле, который ты собираешься использовать, уже добавлен экстеншин вебдрайвера.
Попробуй просто запустить с этим профилем фаерфокс и удалить экстеншин, если он есть.
Удалил - и ничего. :( Может кто-нибудь ещё что-нибудь знает по этому поводу?
Так что, господа, кто-нибудь знает как можно заставить selenium пользовать какой-нибудь отдельный профиль?
На java получилось подтянуть профиль так: ProfilesIni allProfiles = new ProfilesIni(); FirefoxProfile profile = allProfiles.getProfile(«Selenium_Profile»); WebDriver driver = new FirefoxDriver(profile);
Я не могу запустить браузер IE для запуска автоматических тестов selenium, написанных на Java. Я использую Windows 7 и IE 9. Ниже приведен мой код:
пожалуйста, найдите вложение.
Он должен установить одинаковый уровень безопасности во всех зонах. Для этого выполните следующие действия:
- открыть IE
- перейдите в меню Сервис -> Свойства обозревателя -> безопасность
- установите все зоны (интернет, локальная интрасеть, доверенные сайты, сайты с ограниченным доступом) в один и тот же защищенный режим, включен или отключен не имеет значения.
наконец, установите уровень масштабирования на 100%, щелкнув правой кнопкой мыши на шестеренке, расположенной в правом верхнем углу и включив строка состояния. Уровень масштабирования по умолчанию теперь отображается в правом нижнем углу.
и быстрый способ из той же ссылки : "в IE, из меню "Сервис" (или значок шестеренки на панели инструментов в более поздних версиях), выберите " Свойства обозревателя."Перейти на вкладку "Безопасность". В нижней части окна для каждой зоны, вы должны увидеть чек флажок "Включить защищенный режим."Установите значение флажка равным тому же значению, установленному или не установленному, для каждой зоны"
следующий фрагмент кода WebDriver Java должен работать для запуска IE. Код будет игнорировать настройку параметров защищенного режима для всей зоны в браузере IE.
загрузите IEDriverServer и извлеките его в нужное место и установите абсолютный путь (в моем примере выше это было "D:\Ripon Al Wasim\IEDriverServer.exe")
- на IE->Tools->Internet Options .
- перейдите на вкладку Безопасность.
- включить/отключить защищенный режим для всех(интернет, местная интрасеть, надежные сайты и опасные сайты.)
чтобы решить эту проблему, вам нужно сделать две вещи:
вам нужно будет установить запись реестра на целевом компьютере, чтобы драйвер может поддерживать подключение к экземпляру Internet Исследователь он создает.
измените несколько настроек браузера Internet Explorer на этой машине (где вы хотите запустить автоматизацию).
1 . Настройка Раздела Реестра / Запись :
чтобы установить раздел реестра или запись, вам нужно открыть "редактор реестра".
чтобы открыть "редактор реестра" нажмите кнопку windows + R алфавитный ключ который откроет "окно запуска", а затем введите" regedit " и нажмите enter.
или нажмите кнопку Windows и введите "regedit" в меню "Пуск" и нажать кнопку ввод. Теперь в зависимости от типа вашей ОС, следует ли 32/64 бит соответствие лестница.
Windows 32 бит: перейдите в это расположение - " HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl "и проверьте ключ" FEATURE_BFCACHE".
бит Windows 64: перейдите в это расположение-HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\Main\FeatureControl и проверьте наличие ключа "FEATURE_BFCACHE". обратите внимание: the FEATURE_BFCACHE подраздел может или может не присутствовать, и должен быть создан если его нет.
важно: внутри этого ключа создайте значение DWORD с именем iexplore.exe со значением 0.
2 . Изменение настроек браузера Internet Explorer:
нажмите на кнопку Настройки и выберите "Свойства обозревателя".
On " Интернет параметры " окно перейти к "безопасность" tab
Теперь выберите "сети" опция и снимите флажок" Включить защищенный режим "и измените" уровень безопасности " на низкий.
Теперь выберите "Местная Интрасеть" опция и изменить "уровень безопасности" на низкий.
Теперь выберите "Надежные Узлы" опция и изменить "уровень безопасности" на низкий.
- Теперь нажмите на кнопку "применить" кнопка, всплывающее предупреждение может появиться нажмите на кнопку" OK "для предупреждения, а затем на кнопку" OK " в окне параметров Интернета.
вместо использования абсолютного пути для IEDriverServer.exe, лучше использовать относительный путь в соответствии с проектом.
для использования NighwatchJS:
перед началом работы с Internet Explorer и Selenium Webdriver рассмотрим эти два важных правила.
- уровень масштабирования: должен быть установлен по умолчанию (100%) и
- настройки зоны безопасности: должны быть одинаковыми для всех. Параметры безопасности должны быть установлены в соответствии с разрешениями организации.
Как установить?
- просто перейдите в Internet explorer, сделайте оба материала вручную. Вот и все. Нет секрет.
- сделайте это через свой код.
Способ 1:
возможности DesiredCapabilities = возможности DesiredCapabilities.Internet обозреватель();
это точно не показывать никаких ошибок, и браузер откроется а также будет перемещаться по URL.
эта не будет идентифицировать какой-либо элемент и, следовательно, вы не можете продолжить.
почему? Потому что у нас просто подавил ошибку и попросил IE открыть и получить этот URL-адрес. Однако Selenium будет идентифицировать элементы только в том случае, если масштаб браузера равен 100% ie. по умолчанию. Таким образом, окончательный код будет
Метод 2 надежный и полный способ доказательства:
надеюсь, что это помогает. Дайте мне знать, если потребуется дополнительная информация.
Я пытаюсь запустить сервер selenium, передав пользовательский профиль firefox конструктору DefaultSelenium. Он открывает браузер с указанным URL-адресом.
тогда он остается таким, и сервер не запускается.
это работает если я не использую пользовательский профиль.
Я думаю, что мой сервер не настроен для запуска пользовательского профиля. Пожалуйста, помоги мне с этим.
на старт команда на самом деле не запускает ваш сервер selenium как таковой, она подключает ваш объект selenium к уже сервер с браузер.
чтобы фактически запустить сервер selenium [Jetty Web], который отправляет / получает команды тестируемому приложению через указанный браузер, используйте пакетный файл и переключатель rs79 имеет в виду. Содержимое вашего пакетного файла должно включите его линию:
теперь у вас есть настоящий сервер selenium, работающий на вашем компьютере dev (localhost) с портом по умолчанию "4444". Это укажет, что любое тестирование браузера Firefox будет использовать этот профиль.
теперь ваш конструктор DefaultSelenium, назначение и другие вызовы могут выглядеть так:
Firefox начнет использовать пользовательский профиль, указанный в пакетном файле, который запускает сервер Selenium, с желаемым базовым URL-адресом, а затем перейдите в нужное приложение [URL]. Если вы начинаете свой тест с "http://www.server.com/ " и не "http://www.server.com/myApp", Вы можете опустить последнее открыть линии.
при вызове сервера Selenium RC укажите путь с помощью дополнительного -firefoxProfileTemplate предложения. Например -
Это позволит вам использовать все привязки были сохранены в пользовательском профиле.
d) в моем случае я использую FF 36 и selenium-server-standalone-2.45.0.jar
Запустить selenium server :
тогда обратитесь к нему в своем коде:
если вы хотите обратиться к конкретному профилю в своем коде (здесь я использую папку, созданную по умолчанию для профиля с именем "myProfile"):
вы можете добавить сертификаты в пользовательский профиль
a) запустить браузер с пользовательским профилем
b) добавить сертификат
c) не забудьте отметить опцию в настройках Firefox / Advanced / Certificates
Select one automatically
чтобы избежать запроса на принятие сертификата каждый раз при доступе к тестируемой странице
d) перезапустить браузер
e) перейти на страницу, что будет протестировано и принято User Identification Request
f) закройте Firefox и наслаждайтесь пользовательским профилем с сертификатами, доступными с selenium server:)
Небольшая предыстория. Давным-давно, в 2010 году на конференции SeleniumCamp я рассказывал про оптимизацию скорости выполнения тестов, и одна из первых рекомендаций была «используйте уже запущенный браузер повторно, не перезапускайте его для каждого теста заново». Потому что запуск браузера — весьма длительная и ресурсоёмкая операция. Чуть позже, уже в 2011 году, я написал первую статью, в которой я изложил «теоретические основы науки о запуске браузеров». Через год после этого появилась вторая статья, в которой описывалась конкретная реализация утилиты, управляющей запущенными браузерами. К ней, естественно, прилагался проект с программным кодом этой утилиты. Ещё через год я наконец выложил усовершенствованный вариант этой утилиты на GitHub, и вот теперь пришло время написать сопроводительную документацию.
Что это такое?
WebDriverFactory — это библиотека, которая помогает управлять запущенными экземплярами WebDriver (ну и браузерами тоже, поскольку каждому экземпляру драйвера соответствует свой экземпляр браузера).
- автоматически создавать драйвер (и запускать браузер) по требованию в момент первого использования,
- повторно использовать уже созданные драйверы, если есть такая возможность,
- автоматически останавливать старый и запускать новый, когда понадобился драйвер с другими характеристиками,
- автоматически запускать нового драйвера, если предыдущий экземпляр недоступен,
- останавливать все запущенные драйверы одной командой.
- автоматический перезапуск драйвера после заданного количества использований — раньше это было актуально, когда у браузера Firefox наблюдались серьёзные утечки памяти, сейчас эта «фича» уже практически невостребована, а если очень нужно — её можно реализовать при помощи несложного счётчика на уровне конфигурацинных методов тестового набора (@Before)
- автоматический останов всех драйверов при завершении работы виртуальной машины Java — эта фича осталась, но её не рекомендуется использовать, потому что с некоторыми браузерами возникают проблемы именно при остановке их из shutdown hook, так что лучше явно в конце выполнять остановку всех драйверов специальной командой.
(Вообще говоря, название «фабрика» (Factory) не совсем правильное, потому что эта библиотека реализует шаблон проектирования, который больше похож на Object Pool, но я решил оставить сложившееся исторически название, потому что и «пул» тоже является одной из вариаций общей концепции Factory).
Как подключить библиотеку к проекту?
Если вы используете Maven — достаточно просто добавить зависимости от фабрики и от самой библиотеки Selenium:
Номер последней доступной версии смотрите в центральном репозитории Maven.
Если вы не используете Maven — тогда оттуда же из центрального репозитория нужно скачать jar-файл webdriver-factory-2.0.jar (номер версии может быть другим, конечно) и подключить его к вашему проекту так, как вы подключаете другие jar-файлы.
Как это работает?
- SINGLETON — в каждый момент времени может существовать не более одного экземпляра WebDriver, управляемого фабрикой
- THREADLOCAL_SINGLETON — в каждый момент времени в каждом потоке может существовать не более одного экземпляра WebDriver, управляемого фабрикой
По умолчанию используется режим работы THREADLOCAL_SINGLETON. Режимы работы можно переключать, если нет ни одного запущенного драйвера:
Режим работы SINGLETON
- При первом запросе запускается новый драйвер (и новый браузер).
- При втором запросе, поскольку требуется драйвер с теми же характеристиками, возвращается ранее запущенный драйвер.
- При третьем запросе, поскольку требуется драйвер с другими характеристиками, предыдущий драйвер автоматически останавливается, и вместо него запускается новый, с запрашиваемыми характеристиками.
- Метод dismiss останавливает единственный существующий драйвер.
Режим работы THREADLOCAL_SINGLETON
Этот режим работы необходим при параллельном выполнении тестов в нескольких потоках, чтобы избежать конфликтов. Он работает аналогично предыдущему, но только для каждого потока проверки выполняются независимо.
То есть если весь вышеуказанный код выполняется в одном и том же потоке — всё будет работать точно так же, как описано в предыдущем разделе: сначала запускается новый драйвер, потом он повторно используется, потом он останавливается и вместо него запускается драйвер с другими характеристиками, и наконец этот последний драйвер останавливается.
Но если тесты работают в нескольких параллельно выполняющихся потоках, то второй запрос драйвера с теми же характеристиками может случиться в другом потоке, и тогда будет создан новый драйвер, несмотря на то, что драйвер с нужными характеристиками уже есть. У каждого потока свой драйвер, использовать драйвер другого потока фабрика не позволит.
Аналогично, если потребовался драйвер с другими характеристиками — он будет запущен, но остановлен при этом может быть только драйвер, который ранее был запущен в том же самом потоке. Драйверы, принадлежащие другим потокам, останутся нетронутыми.
Чем ещё полезна фабрика?
Есть у фабрики ещё пара полезных функций, помимо хранения драйверов для повторного использования и их автоматического перезапуска.
Перед тем, как вернуть клиенту существующий драйвер, фабрика проверяет, что он функционирует нормально — вызывает метод getCurrentUrl() . Если этот метод отработает успешно — фабрика вернёт клиенту этот ранее запущенный драйвер. Но если возникают проблемы, драйвер считается «испорченным», в этом случае фабрика запустит новый и вернёт его. В любом случае, клиент получит старый или новый, но работающий драйвер, удовлетворяющий заданным характеристикам.
Кроме того, поскольку фабрика хранит все запущенные драйверы, она позволяет в конце остановить все оставшиеся активные драйверы одной командой dismissAll() :
В проекте на GitHub можно посмотреть примеры использования фабрики с тестовыми фреймворками JUnit и TestNG.
Будет ли продолжение?
Возможно, в будущем появятся новые режимы работы фабрики, накладывающие меньше ограничений и ориентированные на удалённый запуск с использованием Selenium Grid. Но с концептуальной точки зрения я считаю для себя тему запуска браузеров закрытой. Впрочем, я буду рад ошибиться. Если есть какие-то идеи развития — присылайте пулл-реквесты!
По неизвестным причинам мой браузер очень медленно открывает тестовые страницы моего удаленного сервера. Поэтому я думаю, что если я смогу повторно подключиться к браузеру после выхода из скрипта, но не выполнять, webdriver.quit() это оставит браузер открытым. Вероятно, это своего рода ручка HOOK или webdriver. Я просмотрел документ API селена, но не нашел никакой функции. Я использую Chrome 62, x64, windows 7, selenium 3.8.0. Я буду очень признателен, если вопрос будет решен или нет.
Вы пробовали повторно использовать существующий каталог пользователя Chrome, используя параметр user-data-dir вместо того, чтобы webdriver каждый раз создавал новый каталог. Вместо загрузки хром будет использовать материал из кеша.
@Grasshopper Что это за черная магия? Я использовал эту опцию Chrome, и она значительно сократила время загрузки. Я поищу это. Большое спасибо.
Нет , вы не можете повторно подключиться к предыдущему сеансу просмотра веб-страниц после выхода из сценария. Даже если вы можете извлечь атрибуты Session ID , Cookies и другие атрибуты сеанса из предыдущего контекста просмотра, вы все равно не сможете передать эти атрибуты как HOOK в WebDriver .
Более чистый способ - вызвать, webdriver.quit() а затем охватить новый контекст просмотра .
Глубокое погружение
Было много обсуждений и попыток повторно подключить WebDriver к существующему работающему контексту просмотра . В обсуждении Разрешить webdriver подключаться к работающему браузеру Саймон Стюарт [Creator WebDriver] четко упомянул:
- Reconnecting to an existing Browsing Context is a browser specific feature, hence can't be implemented in a generic way.
- With internet-explorer, it's possible to iterate over the open windows in the OS and find the right IE process to attach to. and google-chrome needs to be started in a specific mode and configuration, which effectively means that just attaching to a running instance isn't technically possible.
tl; доктор
Да , на самом деле это довольно просто.
Сеанс selenium webdriver представлен URL-адресом подключения и session_id, вы просто подключаетесь к существующему.
Отказ от ответственности - подход использует внутренние свойства селена (в некотором роде "частные"), которые могут измениться в новых выпусках; лучше не использовать его для производственного кода; лучше не использовать против удаленного SE (вашего концентратора или провайдера, такого как BrowserStack / Sauce Labs) из-за оговорки / утечки ресурсов, описанной в конце.
Когда запускается экземпляр webdriver, вам необходимо получить вышеупомянутые свойства; образец:
Теперь, когда эти два свойства известны, другой экземпляр может подключиться; «Уловка» состоит в том, чтобы запустить Remote драйвер и предоставить указанное _url выше - таким образом, он будет подключаться к этому запущенному процессу селена:
Когда это будет запущено, вы увидите, что открывается новое окно браузера.
Это потому, что при запуске драйвера библиотека селена автоматически запускает для него новый сеанс - и теперь у вас есть 1 процесс веб-драйвера с 2 сеансами (экземпляры браузеров).
Если вы перейдете к URL-адресу, вы увидите, что он выполняется в этом новом экземпляре браузера, а не в том, который остался после предыдущего запуска, что является нежелательным поведением.
На этом этапе необходимо сделать две вещи: а) закрыть текущий сеанс SE («новый») и б) переключить этот экземпляр на предыдущий сеанс:
Вот и все - теперь вы подключены к предыдущему / уже существующему сеансу со всеми его свойствами (файлы cookie, LocalStorage и т. Д.).
Между прочим, вам не нужно предоставлять desired_capabilities при запуске нового удаленного драйвера - они сохраняются и унаследованы от существующего сеанса, который вы переняли.
Предостережение - запуск процесса SE может привести к некоторой утечке ресурсов в системе.
Всякий раз, когда один запускается, а затем не закрывается - как в первом фрагменте кода - он будет оставаться там, пока вы не убьете его вручную. Под этим я подразумеваю - например, в Windows - вы увидите процесс «chromedriver.exe», который вам нужно будет завершить вручную, как только вы закончите с ним. Он не может быть закрыт драйвером, который подключился к нему как к удаленному процессу селена.
Причина - всякий раз, когда вы запускаете локальный экземпляр браузера, а затем вызываете его quit() метод, он состоит из двух частей: первая состоит в том, чтобы удалить сеанс из экземпляра Selenium (что сделано во втором фрагменте кода наверху), а другой - остановить локальную службу (chrome / geckodriver), которая обычно работает нормально.
Дело в том, что для удаленных сеансов отсутствует вторая часть - ваша локальная машина не может управлять удаленным процессом, это работа концентратора этого удаленного. Итак, вторая часть - это буквально оператор pass Python - без операции.
Если вы запускаете слишком много служб селена на удаленном концентраторе и не контролируете его, это приведет к утечке ресурсов с этого сервера. Облачные провайдеры, такие как BrowserStack, принимают меры против этого - они закрывают сервисы, которые не работали в течение последних 60-х и т. Д., Но вы не хотите этого делать.
А что касается локальных сервисов SE - только не забывайте время от времени очищать ОС от потерянных драйверов селена, о которых вы забыли :)
Читайте также: