经过大量的谷歌搜索后,我不知道如何使用 Selenium 连接到CefPython(Chrome 嵌入式框架)浏览器实例。
我看到了两种可能的方法:
- 使用 Selenium 直接启动 CefPython 实例,或
- 独立启动一个 CefPython 实例,然后使用 Selenium 连接到它。
我一直在寻找类似的问题,但它们要么有非工作代码(旧版本?),要么似乎正在尝试做其他事情,我找不到任何实际工作代码片段作为答案。因此,作为起点,这里是使用 Selenium 启动 Chrome 的工作代码,但使用标准的非 CEF Chrome 实例:
选项 1(工作;使用 Selenium 启动标准 Chrome.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:\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()
但是当我尝试使用 CefPython 进行这项工作时,我不知道该怎么做。
选项 1(不工作;CefPython 实例)
尝试使用 CefPython 的选项 1 在引发异常之前会挂起一段时间。我看到 Selenium 可以用来启动的 CefPython 包中唯一的可执行文件是 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(不工作;CefPython 实例)
在这里,我尝试独立启动 CEFPython,然后使用 Selenium 连接到它。尝试这样做会让我需要一个 executor_url 和一个会话 ID,但是我终其一生都无法弄清楚如何从正在运行的 CefPython 实例中获取这些:
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,因为最新版本的 CefPython使用Chrome 版本 66,而这又需要 2.40 版本的 chromedriver。
任何帮助表示赞赏。