¿Puede Selenium interactuar con una sesión de navegador existente?
¿Alguien sabe si Selenium (preferiblemente WebDriver) puede comunicarse y actuar a través de un navegador que ya se está ejecutando antes de iniciar un cliente Selenium?
Quiero decir, si Selenium puede comunicarse con un navegador sin usar Selenium Server (podría ser un Internet Explorer iniciado manualmente, por ejemplo).
Esta es una respuesta duplicada ** Vuelva a conectarse a un controlador en Python Selenium ** Esto se aplica a todos los controladores y a la API de Java.
- abrir un controlador
driver = webdriver.Firefox() #python
- extraer a session_id y _url del objeto del controlador.
url = driver.command_executor._url #"http://127.0.0.1:60622/hub"
session_id = driver.session_id #'4e167f26-dc1d-4f51-a207-f761eaf73c31'
- Utilice estos dos parámetros para conectarse a su controlador.
driver = webdriver.Remote(command_executor=url,desired_capabilities={})
driver.close() # this prevents the dummy browser
driver.session_id = session_id
Y estará conectado nuevamente a su controlador.
driver.get("http://www.mrsmart.in")
Esta es una solicitud de función bastante antigua: Permitir que webdriver se adjunte a un navegador en ejecución . Entonces oficialmente no es compatible.
Sin embargo, hay un código de trabajo que afirma admitir esto: https://web.archive.org/web/20171214043703/http://tarunlalwani.com/post/reusing-existing-browser-session-selenium-java/ .
Este fragmento permite reutilizar con éxito la instancia del navegador existente y evita generar el navegador duplicado. Encontrado en el blog de Tarun Lalwani .
from selenium import webdriver
from selenium.webdriver.remote.webdriver import WebDriver
# executor_url = driver.command_executor._url
# session_id = driver.session_id
def attach_to_session(executor_url, session_id):
original_execute = WebDriver.execute
def new_command_execute(self, command, params=None):
if command == "newSession":
# Mock the response
return {'success': 0, 'value': None, 'sessionId': session_id}
else:
return original_execute(self, command, params)
# Patch the function before creating the driver object
WebDriver.execute = new_command_execute
driver = webdriver.Remote(command_executor=executor_url, desired_capabilities={})
driver.session_id = session_id
# Replace the patched function with original function
WebDriver.execute = original_execute
return driver
bro = attach_to_session('http://127.0.0.1:64092', '8de24f3bfbec01ba0d82a7946df1d1c3')
bro.get('http://ya.ru/')
Desde aquí , si el navegador se abrió manualmente, se puede utilizar la depuración remota:
Iniciar Chrome con
chrome --remote-debugging-port=9222
O con perfil opcional
chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\selenium\ChromeProfile"
- Entonces: Java:
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
//Change chrome driver path accordingly
System.setProperty("webdriver.chrome.driver", "C:\\selenium\\chromedriver.exe");
ChromeOptions options = new ChromeOptions();
options.setExperimentalOption("debuggerAddress", "127.0.0.1:9222");
WebDriver driver = new ChromeDriver(options);
System.out.println(driver.getTitle());
Pitón:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
#Change chrome driver path accordingly
chrome_driver = "C:\chromedriver.exe"
driver = webdriver.Chrome(chrome_driver, chrome_options=chrome_options)
print driver.title