Selenium open new windows

Why does Selenium Webdriver opens new window for every time run the script and how to fix it?

I am trying to run following code. But everytime I run a new chrome window opens. How to fix this problem. Also the new chrome instance that open are not logged in so I am unable to use the extension that i have already installed. Any way to fix this problem?

Any help will be appreciated.

I have provided screenshot for the same:

3 Answers 3

When you execute your code each time a new ChromeDriver instance is created which spawns a new Chrome Browser session. This functionality is as per design.

A better approach would be to invoke driver.quit() within tearDown()<> method to close & destroy both the WebDriver and Web Browser instances gracefully after each run of Test Execution. You can find a detailed discussion here.

Though that would solve the issue of multiple Chrome Browser windows still you won’t be logged in within your new session. To get logged in you need to use a specific Chrome Profile and store the cookies and reuse them later. You will find a detailed discussion on how to create and open a new Chrome Profile in this discussion.

To use the extension that you have installed you need to pack/unpack them and use ChromeOptions class.

Chrome Extensions

Chrome extensions can be either packed or unpacked. Packed extensions are a single file with a .crx extension. Unpacked extensions are a directory containing the extension, including a manifest.json file.

To pack an unpacked extension, use the Pack button in chrome://extensions or use Chrome (Windows example):

See the extensions docs for other ways to do this that are more automation friendly. To unpack a packed extension, just unzip the file (you may need to rename the file from .crx to .zip for your zip utility to recognize it).

Selenium под Windows: все с начала

Представляю вам перевод моей статьи на Medium.com.

Впервые выпущенная более 30 лет назад Microsoft Windows сегодня является неоспоримым лидером среди настольных операционных систем. Это просто нельзя игнорировать при разработке веб-приложений. В этой статье я хотел бы обсудить некоторые особенности использования Selenium под Windows и предложить простое и проверенное в боевых условиях решение, значительно упрощающее жизнь.

Чем Windows отличается от Linux

В своих предыдущих статьях (первая, вторая, третья) я описал подходы и инструменты с открытым кодом, позволяющие организовать масштабируемый кластер Selenium. Мы также поговорили о том, как при помощи тех же инструментов эффективно запускать тесты на машине разработчика. Во всех статьях в качестве операционной системы использовался Linux. Чем же Windows отличается от Linux с точки зрения Selenium?

  1. Наличие браузеров, не существующих на других платформах. В зависимости от версии, Windows поставляется с предустановленным Internet Explorer (IE) или Microsoft Edge. Единовременно может быть установлена только одна версия каждого браузера. Для обоих браузеров имеются готовые исполняемые файлы web-драйверов (IEDriverServer и EdgeDriver соответственно), которые используют вызовы Windows API для запуска и управления браузером. С этой стороны Windows браузеры архитектурно ничем не отличаются от браузеров на Linux.
  2. Графический интерфейс встроен в операционную систему. Большинство версий Windows (кроме последних версий Windows Server) имеют встроенный графический интерфейс, который нельзя ни отключить ни заменить другим графическим сервером. Интерфейс автоматически стартует вместе с операционной системой и постоянно потребляет ресурсы. Кроме того графический интерфейс Windows по-умолчанию отображает все открываемые окна (в том числе и окна браузеров) в одном и том же рабочем столе и только одно из этих окон может быть в фокусе в заданный момент времени. Из-за этого попытки запустить несколько IE или Edge параллельно часто приводят к различным проблемам с фокусом окна: отличающиеся CSS-стили (например, при наведении на ссылки), не срабатывающие события DOM и так далее. Эта проблема очень мешает работе.
  3. Практически полное отсуствие поддержки Docker. Последние версии Windows Server поддерживают большинство функций Docker нативно, но на интересующих нас настольных версиях нет такой поддержки. Поэтому единственный способ запустить Docker на этих версиях — при помощи виртуальной машины с Linux, в которую установлен Docker.
Читайте также:  Windows 10 изменить разрешение камеры

Как видите многие современные подходы при работе с Selenium: использование X сервера без монитора и запуск браузеров в контейнерах не работают в Windows. Но можно ли достичь сходной с Linux производительности и обойти известные ограничения Windows? Да, и это проще, чем вы могли бы подумать! В следующих разделах я расскажу как это сделать.

Создаем порядок из хаоса

Мы будем двигаться к поставленной цели шаг за шагом. Для начала сделаем решение как можно проще. Как известно, обычная схема установки Selenium на Windows выглядит так:

Схема состоит из Selenium сервера, запущенного при помощи виртуальной машины Java (JRE), затем исполняемый файл IEDriverServer или EdgeDriver и, наконец, сам браузер — IE или Edge. В этой цепочке есть как минимум одно слабое звено — Selenium сервер и Java. Все потому, что Selenium здесь выступает в роли простого прокси-сервера, который запускает процесс драйвера на случайном порту и затем отправляет все запросы на этот порт. Проксирование сетевого трафика — простейшая задача в любом языке программирования, потому что основная работа выполняется сетевой подсистемой операционной системы. Именно поэтому установка Java (50 и более Мб) и скачивание Selenium server (20 и более Мб) для простого проксирования выглядит чересчур громоздким решением. Более того Selenium сервер плохо работает под нагрузкой:

  1. Он потребляет слишком много памяти и иногда даже течет.
  2. Проксирование выполняется «вручную» — на каждый запрос создается новый экземпляр HTTP клиента и входящий запрос копируется в него. Такой подход очень неэффективен и в некоторых случаях вызывает странные таймауты при проксировании.
    Мы можем значительно улучшить ситуацию, просто заменив тяжелый Selenium сервер легковесным Selenoid.

Как заменить Selenium сервер на Selenoid

Selenoid — это легковесная замена Selenium сервера, написанная на языке Go. Selenoid поставляется в виде одного маленького (около 7 Мб) исполняемого файла и не имеет внешних зависимостей. Для начала использования нужно просто скачать и запустить этот файл. В моей предыдущей статье я кратко описал насколько удобным может быть Selenoid для запуска браузеров в Docker контейнерах — основного его назначения. Второй поддерживаемый режим — это запуск исполняемых файлов вместо контейнеров и проксирование сетевого трафика в них — также, как Selenium сервер делает это с IEDriverServer и EdgeDriver. Заменить Selenium сервер на Selenoid очень просто. Для примера, запустим Internet Explorer при помощи Selenoid:

  1. Скачиваем исполняемый файл Selenoid со страницы релизов. Исполняемый файл обычно называется selenoid_windows_386.exe для 32-битной Windows и selenoid_windows_amd64.exe для Windows 64 bit. Насколько мне известно настольные версии Windows не имеют встроенной консольной программы для скачивания файлов. Но, если у вас установлен Cygwin и curl, то скачать файл можно так:
  2. Скачиваем и распаковываем архив с IEDriverServer.exe со страницы загрузок Selenium. К примеру сохраним IEDriverServer.exe в C:\ .
  3. Настраиваем Internet Explorer как описано в вики.
  4. Создаем простой файл конфигурации для Selenoid — browsers.json :

Запускаем Selenoid вместо Selenium сервера (порт 4444 должен быть свободен) при помощи вот такого файла selenoid.bat :

Здесь мы предполагаем, что все файлы из предыдущих шагов были сохранены в C:\ . Логи Selenoid будут сохранены в C:\selenoid.log . Обратите внимание на параметр -limit — он определяет сколько сессий можно запустить одновременно. Когда указанное количество сессий запущено — новые запросы становятся в очередь точно также, как в Selenium сервере.

  • Готово! Можно запускать тесты на тот же самый URL:
  • Чтобы оставаться легковесным, Selenoid не имеет встроенного графического интерфейса. Мордочка сделана в виде отдельного исполняемого файла: Selenoid UI. Просто скачайте скомпилированный файл со страницы релизов и запустите его, затем откройте http://localhost:8080/ в браузере.
  • Читайте также:  Linux файл больше диска

    Запускаем тесты на нескольких рабочих столах

    После замены Selenium сервера на Selenoid вы увидите значительное снижение потребления памяти и CPU. Этот простой шаг может даже позволить вам запускать больше браузеров параллельно. Тем не менее простая замена не лечит проблемы с открытием нескольких окон браузеров одновременно. Окна по-прежнему показывается на одном рабочем столе и продолжают терять фокус. Для того, чтобы обойти это препятствие требуется научиться запускать браузеры в отдельных рабочих столах. Хорошая новость — внутренние API Windows даже в настольных версиях имеют поддержку виртуальных рабочих столов — можно переключаться между рабочими столами и запускать окна в этих рабочих столах независимо друг от друга. Но есть новость получше — не нужно погружаться во внутренности Windows, чтобы получить такое поведение для Selenium — нужная функциональность уже реализована в проекте headless-selenium-for-win. Скачав релиз, вы получите архив с двумя исполняемыми файлами: desktop_utils.exe и headless_ie_selenium.exe .

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

    Для работы с Selenium нам потребуется вторая утилита — headless_ie_selenium.exe . Она является надстройкой к IEDriverServer.exe , обрабатывающей запросы на сессии и автоматически запускающей IEDriverServer.exe в новом рабочем столе. headless_ie_selenium.exe должна лежать в одном каталоге с IEDriverServer.exe . Для того, чтобы использовать утилиту с Selenoid нужно просто заменить пусть до исполняемого файла в browsers.json и перезапустить Selenoid:

    Теперь все проблемы с фокусом окон должны уйти.

    Немного магии с Selenium capabilities

    Простой заменой Selenium на Selenoid и IEDriverServer.exe на headless_ie_selenium.exe мы решили наиболее острые проблемы Selenium под Windows. Давайте сделаем из алмаза бриллиант, выставив несколько полезных capabilities в тестах.

    По-умолчанию Internet Explorer использует системные настройки HTTP прокси. Это приводит к тому, что настройки прокси, выставленные в одной сессии «пролезают» и в другие сессии. Для того, чтобы исправить это, выставьте:

    Ваше веб-приложение может использовать cookies для хранения важной информации. В Windows эти файлы хранятся отдельно для каждого пользователя и поведение по-умолчанию — переиспользовать выставленные куки между параллельными сессиями. Это может приводить к плавающим тестам. Чтобы избежать переиспользование cookie можно стартовать IE в анонимном режиме:

    Также не забудьте выставить:

  • Для того, чтобы избежать странных ошибок с фокусом окна, также убедитесь, что указанная нижу capability не выставлена или равна false:
  • Заключение

    В этой статье я коротко описал основные проблемы, с которыми вы можете столкнуться при запуске Selenium тестов под Windows и предложил простое решение. Я продолжаю утверждать — тесты в Selenium могут не доставлять боли. Нужно только правильно уметь его готовить.

    Browser manipulation

    Ruby is not installed by default on Windows. Download the latest version and run the installer. You can leave all settings at default values, except at the Installation Destination and Optional Tasks screen check where you need to check the Add Ruby executables to your PATH checkbox. To drive any browser, you have to install selenium-webdriver Ruby gem. To install it, open command prompt and type this:

    Or, if you use Bundler, add this line to your application’s Gemfile:

    And then execute the following command in command prompt:

    Internet Explorer

    Internet Explorer is installed by default on Windows, so no installation is needed. To drive Internet Explorer on Windows, you have to download the latest Internet Explorer Driver and put the file into a folder that is in PATH . To find out which directories are in PATH , type echo %PATH% in command prompt.

    C:\Ruby200\bin looks like a good place. Unzip IEDriverServer file and move IEDriverServer.exe there.

    This should open a new Internet Explorer window:

    Browser navigation

    The first thing you will want to do after launching a browser is to open your website. This can be achieved in a single line:

    Get current URL

    You can read the current URL from the browser’s address bar using:

    Pressing the browser’s back button:

    Forward

    Pressing the browser’s forward button:

    Refresh

    Refresh the current page:

    Get title

    You can read the current page title from the browser:

    Читайте также:  Sibelius для windows 10

    Windows and tabs

    Get window handle

    WebDriver does not make the distinction between windows and tabs. If your site opens a new tab or window, Selenium will let you work with it using a window handle. Each window has a unique identifier which remains persistent in a single session. You can get the window handle of the current window by using:

    Switching windows or tabs

    Clicking a link which opens in a new window will focus the new window or tab on screen, but WebDriver will not know which window the Operating System considers active. To work with the new window you will need to switch to it. If you have only two tabs or windows open, and you know which window you start with, by the process of elimination you can loop over both windows or tabs that WebDriver can see, and switch to the one which is not the original.

    However, Selenium 4 provides a new api NewWindow which creates a new tab (or) new window and automatically switches to it.

    Create new window (or) new tab and switch

    Creates a new window (or) tab and will focus the new window or tab on screen. You don’t need to switch to work with the new window (or) tab. If you have more than two windows (or) tabs opened other than the new window, you can loop over both windows or tabs that WebDriver can see, and switch to the one which is not the original.

    Note: This feature works with Selenium 4 and later versions.

    Closing a window or tab

    When you are finished with a window or tab and it is not the last window or tab open in your browser, you should close it and switch back to the window you were using previously. Assuming you followed the code sample in the previous section you will have the previous window handle stored in a variable. Put this together and you will get:

    Forgetting to switch back to another window handle after closing a window will leave WebDriver executing on the now closed page, and will trigger a No Such Window Exception. You must switch back to a valid window handle in order to continue execution.

    Quitting the browser at the end of a session

    When you are finished with the browser session you should call quit, instead of close:

    • Quit will:
      • Close all the windows and tabs associated with that WebDriver session
      • Close the browser process
      • Close the background driver process
      • Notify Selenium Grid that the browser is no longer in use so it can be used by another session (if you are using Selenium Grid)

    Failure to call quit will leave extra background processes and ports running on your machine which could cause you problems later.

    Some test frameworks offer methods and annotations which you can hook into to tear down at the end of a test.

    If not running WebDriver in a test context, you may consider using try / finally which is offered by most languages so that an exception will still clean up the WebDriver session.

    Python’s WebDriver now supports the python context manager, which when using the with keyword can automatically quit the driver at the end of execution.

    Frames and Iframes

    Frames are a now deprecated means of building a site layout from multiple documents on the same domain. You are unlikely to work with them unless you are working with an pre HTML5 webapp. Iframes allow the insertion of a document from an entirely different domain, and are still commonly used.

    If you need to work with frames or iframes, WebDriver allows you to work with them in the same way. Consider a button within an iframe. If we inspect the element using the browser development tools, we might see the following:

    If it was not for the iframe we would expect to click on the button using something like:

    Оцените статью