Python - отправка экземпляра селена Chrome в фоновом режиме

Я пытаюсь открыть простой экземпляр Chrome, используя Python и Selen. Пожалуйста, найдите мой код ниже:

import time, datetime, sys, os
start_time = time.time()
from datetime import datetime
os.system("cls")
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options

CHROME_PATH = 'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe'
CHROMEDRIVER_PATH = 'C:\\Users\\'+userID+'\\'+filename+'\\chromedriver.exe'
WINDOW_SIZE = "1920,1080"

chrome_options = Options()  
chrome_options.add_argument("--window-size=%s" % WINDOW_SIZE)
chrome_options.add_argument("disable-gpu")
chrome_options.add_argument("disable-infobars")
chrome_options.add_argument("--disable-notifications")
chrome_options.binary_location = CHROME_PATH

browser = webdriver.Chrome(executable_path=CHROMEDRIVER_PATH,chrome_options=chrome_options)
time.sleep(1)
browser.get("https://www.google.com")
os.system("cls")
time.sleep(2)

Я хотел бы, чтобы это открывалось в фоновом режиме, то есть когда я набираю что-то еще, фокус мыши / курсора не должен случайным образом переходить к этому автоматизированному экземпляру chrome после его открытия.

Ограничения: обратите внимание на следующие ограничения:

  1. Я не могу использовать "--headless"
  2. Я не могу использовать PhantomJS
  3. Я не могу использовать PyVirtualDisplay, поскольку код (exe-файл) в конечном итоге будет развернут на компьютерах с Windows для конечных пользователей.

Есть ли другой способ перенести этот экземпляр Chrome на задний план? Спасибо

2 ответа

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

Грубым альтернативным способом является использование браузера без головы, и вы можете найти подробное обсуждение, в котором Какие драйверы поддерживают тестирование без браузера / без головы?,

Почему не возможно?

Software Test Automation - это искусство. Ваша Тестовая Структура должна быть:

  • Настраивается со всеми необходимыми программами, библиотеками и двоичными файлами.
  • Выполнение теста должно выполняться в контролируемой среде для оптимизации производительности.
  • В то время как ваш @Tests выполняются, он должен быть свободен от ручного вмешательства.
  • Особенно когда ваш @Tests основаны на Selenium, в то время как выполнение теста - InProgress, среда тестирования не должна вмешиваться по следующим причинам:

    • На самом низком уровне поведение actions Класс предназначен для имитации поведения удаленного конца с фактическим устройством ввода настолько близко, насколько это возможно, и стратегия реализации может включать в себя, например, введение синтезированных событий в цикл событий браузера. Поэтому шаги по отправке действия неизбежно окажутся на территории, специфичной для реализации. Однако существуют определенные наблюдаемые эффекты содержимого, которые должны быть согласованы между реализациями. Чтобы приспособиться к этому, спецификация требует, чтобы удаленные конечные точки выполняли специфичные для реализации действия по отправке действий вместе со списком событий и их свойств. Этот список не является исчерпывающим; в частности, действие по умолчанию для источника ввода может вызвать генерацию дополнительных событий в зависимости от реализации и состояния браузера (например, события ввода, относящиеся к ключевым действиям, когда фокус находится на редактируемом элементе, события прокрутки и т. д.).
  • Более того,

    • Триггер активации, генерируемый пользователем API WebDriver, должен быть неотличим от триггеров, генерируемых реальным пользователем, взаимодействующим с браузером. В частности, отправленные события будут иметь атрибут isTrusted со значением true. Самый надежный способ отправить эти события - создать их в самой реализации браузера. Отправка входных сообщений, специфичных для ОС, в окно браузера имеет недостаток, заключающийся в том, что автоматизируемый браузер не может быть должным образом изолирован от случайного изменения пользователем состояния источника ввода. Использование API доступа на уровне ОС имеет тот недостаток, что окно браузера должно быть сфокусировано, и в результате несколько экземпляров WebDriver не могут работать параллельно.

    • Преимущество API доступа на уровне ОС состоит в том, что он гарантирует, что входные данные корректно отражают пользовательский ввод, и позволяет взаимодействовать с хост-ОС при необходимости. Это может, однако, иметь потери производительности с точки зрения использования машины.

  • Дополнительно,

    • Robot Class используется для генерации собственных событий системного ввода для целей автоматизации тестирования, самостоятельных демонстраций и других приложений, где необходимо управление мышью и клавиатурой. Основная цель Robot - облегчить автоматизированное тестирование реализаций платформы Java. Использование класса для генерации входных событий отличается от публикации событий в очереди событий AWT или компонентах AWT тем, что события генерируются в собственной входной очереди платформы. Например, Robot.mouseMove будет фактически перемещать курсор мыши, а не просто генерировать события перемещения мыши.
  • Наконец, в соответствии с Internet Explorer и Native Events:

    • Поскольку InternetExplorerDriver предназначен только для Windows, он пытается использовать так называемые "родные" события или события на уровне ОС для выполнения операций с мышью и клавиатурой в браузере. Это отличается от использования смоделированных событий JavaScript для одних и тех же операций. Преимущество использования собственных событий состоит в том, что они не зависят от песочницы JavaScript и обеспечивают правильное распространение событий JavaScript в браузере. Однако в настоящее время существуют некоторые проблемы с событиями мыши, когда окно браузера IE не имеет фокуса и при попытке навести курсор на элементы.
  • Фокус браузера:

    • Проблема заключается в том, что сам IE, похоже, не полностью соблюдает сообщения Windows, которые мы отправляем в окно браузера IE (WM_MOUSEDOWN и WM_MOUSEUP), если окно не имеет фокуса. В частности, элемент, по которому щелкают, получит окно фокусировки вокруг него, но элемент не будет обрабатывать щелчок. Возможно, мы не должны отправлять сообщения вообще; скорее, мы должны использовать API SendInput (), но этот API явно требует, чтобы окно имело фокус. У нас есть две противоречивые цели с проектом WebDriver.

    • Во-первых, мы стремимся подражать пользователю как можно ближе. Это означает использование собственных событий, а не имитацию событий с использованием JavaScript.

    • Во-вторых, мы не хотим, чтобы фокус окна браузера был автоматизирован. Это означает, что простое перемещение окна браузера на передний план является неоптимальным.

Заключение

Всегда держите тестовую среду отдельно от среды разработки и абсолютно без ручного вмешательства.

В Windows вы можете использовать «планировщик задач», если вы открываете его при входе в систему или когда смотрите в систему, он будет открываться в фоновом режиме. В селене я нашел только:

      browser.set_window_position(-10000, 0)
browser.set_window_size(0, 0) # this is optional

но браузер будет виден на панели задач (вы не можете его открыть). введите описание изображения здесь

Другие вопросы по тегам