¿Puede Selenium interactuar con una sesión de navegador existente?

Resuelto Angel Romero asked hace 12 años • 15 respuestas

¿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).

Angel Romero avatar Dec 01 '11 23:12 Angel Romero
Aceptado

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.

  1. abrir un controlador
driver = webdriver.Firefox()  #python
  1. 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'
  1. 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")
Manoj Sahu avatar Dec 21 '2015 11:12 Manoj Sahu

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/ .

Robert Munteanu avatar Dec 02 '2011 07:12 Robert Munteanu

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/')
Pavel Vlasov avatar Jan 10 '2018 19:01 Pavel Vlasov

Desde aquí , si el navegador se abrió manualmente, se puede utilizar la depuración remota:

  1. Iniciar Chrome con

    chrome --remote-debugging-port=9222
    

O con perfil opcional

chrome.exe --remote-debugging-port=9222 --user-data-dir="C:\selenium\ChromeProfile"
  1. 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
Ahmed Ashour avatar Nov 23 '2021 21:11 Ahmed Ashour