Подключение к экземпляру Cef Python с помощью Selenium - PullRequest
1 голос
/ 26 мая 2020

После исчерпывающего поиска в Google я не понимаю, как подключиться к экземпляру браузера Cef Python (Chrome Embedded Framework) с помощью Selenium.

Я вижу два возможных способа сделать это:

  1. Используйте Selenium для запуска экземпляра Cef Python напрямую или
  2. Запустите экземпляр Cef Python независимо, затем подключитесь к нему с помощью Selenium.

Я искал похожие вопросы, но они либо имеют нерабочий код (более старые версии?), либо, похоже, пытаются делать другие вещи, и я не могу найти любой с фактическими рабочими фрагментами кода в качестве ответов. Итак, в качестве отправной точки вот рабочий код для запуска Chrome с Selenium, но с использованием стандартного экземпляра, отличного от CEF Chrome:

Вариант 1 (рабочий; запуск стандартного Chrome. exe с Selenium)

from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("--disable-gpu")

chromedriver_path = r"C:\Users\..\webdrivers\chromedriver_2_40\chromedriver_win32\chromedriver.exe"
chrome_path = r"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"
options.binary_location = chrome_path;

driver = webdriver.Chrome(executable_path=chromedriver_path, options=options)
time.sleep(1)
driver.get("https://www.google.com") # SUCCESS!
time.sleep(4)
driver.quit()

Вариант 2 (работает; запустите Chrome .exe, затем подключитесь к нему с помощью Selenium)

В этом примере «driver2» - это тот, который подключается удаленно к уже запущенному экземпляру, созданному «driver».

from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("--disable-gpu")

chromedriver_path = r"C:\Users\..\webdrivers\chromedriver_2_40\chromedriver_win32\chromedriver.exe"

chrome_path = r"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"
options.binary_location = chrome_path;

driver = webdriver.Chrome(executable_path=chromedriver_path, options=options)
executor_url = driver.command_executor._url
session_id = driver.session_id
print(executor_url, session_id)

driver2 = webdriver.Remote(command_executor=executor_url, desired_capabilities={})
driver2.close() # close the second session created by driver 2 (cannot pass a session_id to webdriver.Remote())
driver2.session_id = session_id # use the driver1 session instead
time.sleep(1)
driver2.get("https://www.google.com") # SUCCESS!
time.sleep(4)
driver2.quit()

Но когда я пытаюсь заставить это работать с Cef Python, я не понимаю, как для этого.

Вариант 1 (не работает; Cef Python экземпляр)

Попытка Варианта 1 с Cef Python просто зависает на некоторое время перед поднятием исключение. Единственный исполняемый файл в пакете Cef Python, который, как я вижу, можно использовать для запуска Selenium, - это файл subprocess.exe, но ясно, что это НЕ просто замена chrome .exe.

Этот код идентичен приведенному выше коду "Вариант 1", за исключением того, что он заменяет chrome_path двоичным файлом subprocess.exe.

from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("--disable-gpu")

chromedriver_path = r"C:\Users\..\webdrivers\chromedriver_2_40\chromedriver_win32\chromedriver.exe"
chrome_path = r"C:\Users\..\project-folder\pybin\Lib\site-packages\cefpython3\subprocess.exe"
options.binary_location = chrome_path;

driver = webdriver.Chrome(executable_path=chromedriver_path, options=options)
print('driver created...') # is never reached :( apparently hangs over socket waiting...
# after a while...
# selenium.common.exceptions.WebDriverException: Message: unknown error: DevToolsActivePort file doesn't exist
time.sleep(1)
driver.get("https://www.google.com") 
time.sleep(4)
driver.quit()

Вариант 2 (нерабочий; Cef Python экземпляр)

Здесь я пытаюсь запустить CEF Python самостоятельно, а затем подключиться к нему с помощью Selenium. Попытка сделать это оставляет мне необходимость в Execor_url и идентификаторе сеанса, однако я не могу на всю жизнь понять, как получить их из запущенного экземпляра Cef Python:

from cefpython3 import cefpython as cef
from selenium import webdriver

settings = {"windowless_rendering_enabled": False}
switches = {"remote-debugging-port": "22222",
            'user-data-dir':r"C:\Users\..\..\mydatadir"}
cef.Initialize(settings, switches)

executor_url = None # how to get this?
session_id = None # how to get this?

driver2 = webdriver.Remote(command_executor=executor_url, desired_capabilities={})
driver2.close() # close the driver 1 session (cannot pass a session_id to webdriver.Remote())
driver2.session_id = session_id
time.sleep(30)
driver2.get("https://www.google.com")
time.sleep(4)
driver2.quit()

Я использую 2.40 версии ChromeDriver, потому что последняя версия Cef Python использует Chrome версию 66 , которая, в свою очередь, требует версии 2.40 хромированной драйвера *. 1051 *

Любая помощь приветствуется.

...