¿Alguien sabe si Selenium (preferiblemente WebDriver) es capaz de comunicarse y actuar a través de un navegador que ya se está ejecutando antes de iniciar un cliente de Selenium?
Me refiero a si Selenium puede comunicarse con un navegador sin usar el servidor Selenium (podría ser un Internet Explorer lanzado manualmente, por ejemplo).
selenium
selenium-webdriver
webdriver
communication
Ángel romero
fuente
fuente
Esta es una respuesta duplicada ** Vuelva a conectarse a un controlador en python selenium ** Esto es aplicable en todos los controladores y para la API de Java.
driver = webdriver.Firefox() #python
url = driver.command_executor._url #"http://127.0.0.1:60622/hub" session_id = driver.session_id #'4e167f26-dc1d-4f51-a207-f761eaf73c31'
driver = webdriver.Remote(command_executor=url,desired_capabilities={}) driver.close() # this prevents the dummy browser driver.session_id = session_id
Y está conectado nuevamente con su conductor.
driver.get("http://www.mrsmart.in")
fuente
selenium.common.exceptions.SessionNotCreatedException: Message: Session is already started
Este fragmento de código permite reutilizar correctamente la instancia del navegador existente y, al mismo tiempo, evita levantar 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/')
fuente
# session_id = driver.session_id
es la forma en que puede recuperar la identificación de sesión de una ventana de Chrome usando python selenium api. Supongo que cada pestaña en una sesión de Chrome no tiene una identificación única.Es posible. Pero tienes que hackearlo un poco, hay un código. Lo que tienes que hacer es ejecutar un servidor independiente y "parchear" RemoteWebDriver
fuente
Parece que esta función no es compatible oficialmente con selenium. Pero, Tarun Lalwani ha creado código Java funcional para proporcionar la función. Consulte: http://tarunlalwani.com/post/reusing-existing-browser-session-selenium-java/
Aquí está el código de muestra de trabajo, copiado del enlace anterior:
Su prueba debe tener un RemoteWebDriver creado a partir de una sesión de navegador existente. Para crear ese controlador, solo necesita conocer la "información de la sesión", es decir, la dirección del servidor (local en nuestro caso) donde se está ejecutando el navegador y la identificación de la sesión del navegador. Para obtener estos detalles, podemos crear una sesión de navegador con selenium, abrir la página deseada y finalmente ejecutar el script de prueba real.
No sé si hay alguna forma de obtener información de sesión para una sesión que no fue creada por selenium.
A continuación, se muestra un ejemplo de información de la sesión:
Dirección del servidor remoto: http: // localhost: 24266 . El número de puerto es diferente para cada sesión. Id de sesión: 534c7b561aacdd6dc319f60fed27d9d6.
fuente
Inspirado por la respuesta de Eric, aquí está mi solución a este problema para el selenio 3.7.0. En comparación con la solución en http://tarunlalwani.com/post/reusing-existing-browser-session-selenium/ , la ventaja es que no habrá una ventana del navegador en blanco cada vez que me conecte a la sesión existente.
import warnings from selenium.common.exceptions import WebDriverException from selenium.webdriver.remote.errorhandler import ErrorHandler from selenium.webdriver.remote.file_detector import LocalFileDetector from selenium.webdriver.remote.mobile import Mobile from selenium.webdriver.remote.remote_connection import RemoteConnection from selenium.webdriver.remote.switch_to import SwitchTo from selenium.webdriver.remote.webdriver import WebDriver # This webdriver can directly attach to an existing session. class AttachableWebDriver(WebDriver): def __init__(self, command_executor='http://127.0.0.1:4444/wd/hub', desired_capabilities=None, browser_profile=None, proxy=None, keep_alive=False, file_detector=None, session_id=None): """ Create a new driver that will issue commands using the wire protocol. :Args: - command_executor - Either a string representing URL of the remote server or a custom remote_connection.RemoteConnection object. Defaults to 'http://127.0.0.1:4444/wd/hub'. - desired_capabilities - A dictionary of capabilities to request when starting the browser session. Required parameter. - browser_profile - A selenium.webdriver.firefox.firefox_profile.FirefoxProfile object. Only used if Firefox is requested. Optional. - proxy - A selenium.webdriver.common.proxy.Proxy object. The browser session will be started with given proxy settings, if possible. Optional. - keep_alive - Whether to configure remote_connection.RemoteConnection to use HTTP keep-alive. Defaults to False. - file_detector - Pass custom file detector object during instantiation. If None, then default LocalFileDetector() will be used. """ if desired_capabilities is None: raise WebDriverException("Desired Capabilities can't be None") if not isinstance(desired_capabilities, dict): raise WebDriverException("Desired Capabilities must be a dictionary") if proxy is not None: warnings.warn("Please use FirefoxOptions to set proxy", DeprecationWarning) proxy.add_to_capabilities(desired_capabilities) self.command_executor = command_executor if type(self.command_executor) is bytes or isinstance(self.command_executor, str): self.command_executor = RemoteConnection(command_executor, keep_alive=keep_alive) self.command_executor._commands['GET_SESSION'] = ('GET', '/session/$sessionId') # added self._is_remote = True self.session_id = session_id # added self.capabilities = {} self.error_handler = ErrorHandler() self.start_client() if browser_profile is not None: warnings.warn("Please use FirefoxOptions to set browser profile", DeprecationWarning) if session_id: self.connect_to_session(desired_capabilities) # added else: self.start_session(desired_capabilities, browser_profile) self._switch_to = SwitchTo(self) self._mobile = Mobile(self) self.file_detector = file_detector or LocalFileDetector() self.w3c = True # added hardcoded def connect_to_session(self, desired_capabilities): response = self.execute('GET_SESSION', { 'desiredCapabilities': desired_capabilities, 'sessionId': self.session_id, }) # self.session_id = response['sessionId'] self.capabilities = response['value']
Para usarlo:
if use_existing_session: browser = AttachableWebDriver(command_executor=('http://%s:4444/wd/hub' % ip), desired_capabilities=(DesiredCapabilities.INTERNETEXPLORER), session_id=session_id) self.logger.info("Using existing browser with session id {}".format(session_id)) else: browser = AttachableWebDriver(command_executor=('http://%s:4444/wd/hub' % ip), desired_capabilities=(DesiredCapabilities.INTERNETEXPLORER)) self.logger.info('New session_id : {}'.format(browser.session_id))
fuente
Todas las soluciones hasta ahora carecían de cierta funcionalidad. Aquí está mi solución:
fuente
Solución Javascript:
Me he conectado correctamente a la sesión del navegador existente usando esta función
La documentación se puede encontrar aquí .
fuente
Obtuve una solución en Python, modifiqué la clase webdriver basada en la clase PersistenBrowser que encontré.
https://github.com/axelPalmerin/personal/commit/fabddb38a39f378aa113b0cb8d33391d5f91dca5
reemplace el módulo webdriver /usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py
Ej. usar:
fuente
Estoy usando Rails + Cucumber + Selenium Webdriver + PhantomJS, y he estado usando una versión con parche de mono de Selenium Webdriver, que mantiene abierto el navegador PhantomJS entre ejecuciones de prueba. Vea esta publicación de blog: http://blog.sharetribe.com/2014/04/07/faster-cucumber-startup-keep-phantomjs-browser-open-between-tests/
Vea también mi respuesta a esta publicación: ¿Cómo ejecuto un comando en un navegador ya abierto desde un archivo ruby?
fuente
Esto es bastante fácil con el
selenium-webdriver
cliente JavaScript :Primero, asegúrese de tener un servidor WebDriver en ejecución. Por ejemplo, descargue ChromeDriver y luego ejecútelo
chromedriver --port=9515
.En segundo lugar, cree el controlador así :
var driver = new webdriver.Builder() .withCapabilities(webdriver.Capabilities.chrome()) .usingServer('http://localhost:9515') // <- this .build();
Aquí tienes un ejemplo completo:
var webdriver = require ('selenium-webdriver');
fuente