После исчерпывающего поиска в Google я не понимаю, как подключиться к экземпляру браузера Cef Python (Chrome Embedded Framework) с помощью Selenium.
Я вижу два возможных способа сделать это:
- Используйте Selenium для запуска экземпляра Cef Python напрямую или
- Запустите экземпляр 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 *
Любая помощь приветствуется.