Quelqu'un sait-il si Selenium (WebDriver de préférence) est capable de communiquer et d'agir via un navigateur qui est déjà en cours d'exécution avant de lancer un client Selenium?
Je veux dire si Selenium est capable de communiquer avec un navigateur sans utiliser le serveur Selenium (avec peut-être un Internet Explorer lancé manuellement par exemple).
selenium
selenium-webdriver
webdriver
communication
Ange romero
la source
la source
Ceci est une réponse en double ** Reconnectez-vous à un pilote en python sélénium ** Ceci est applicable sur tous les pilotes et pour java api.
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
Et vous êtes à nouveau connecté à votre pilote.
driver.get("http://www.mrsmart.in")
la source
selenium.common.exceptions.SessionNotCreatedException: Message: Session is already started
Cet extrait de code permet avec succès de réutiliser l'instance de navigateur existante tout en évitant d'élever le navigateur en double. Trouvé sur le 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/')
la source
# session_id = driver.session_id
est la façon dont vous pouvez récupérer l'identifiant de session d'une fenêtre chrome en utilisant l'api python selenium. Je suppose que chaque onglet d'une session Chrome n'a pas d'identifiant unique.C'est possible. Mais vous devez le pirater un peu, il y a un code Ce que vous devez faire est d'exécuter un serveur autonome et de "patcher" RemoteWebDriver
la source
Il semble que cette fonctionnalité n'est pas officiellement prise en charge par le sélénium. Mais, Tarun Lalwani a créé du code Java fonctionnel pour fournir cette fonctionnalité. Reportez-vous - http://tarunlalwani.com/post/reusing-existing-browser-session-selenium-java/
Voici l'exemple de code de travail, copié à partir du lien ci-dessus:
Votre test doit avoir un RemoteWebDriver créé à partir d'une session de navigateur existante. Pour créer ce pilote, il vous suffit de connaître les "informations de session", c'est-à-dire l'adresse du serveur (local dans notre cas) sur lequel le navigateur s'exécute et l'identifiant de session du navigateur. Pour obtenir ces détails, nous pouvons créer une session de navigateur avec du sélénium, ouvrir la page souhaitée, puis enfin exécuter le script de test réel.
Je ne sais pas s'il existe un moyen d'obtenir des informations de session pour une session qui n'a pas été créée par le sélénium.
Voici un exemple d'informations sur la session:
Adresse du serveur distant: http: // localhost: 24266 . Le numéro de port est différent pour chaque session. Id de session: 534c7b561aacdd6dc319f60fed27d9d6.
la source
Inspiré par la réponse d'Eric, voici ma solution à ce problème pour le sélénium 3.7.0. Par rapport à la solution sur http://tarunlalwani.com/post/reusing-existing-browser-session-selenium/ , l'avantage est qu'il n'y aura pas de fenêtre de navigateur vide à chaque fois que je me connecte à la session existante.
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']
Pour l'utiliser:
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))
la source
Jusqu'à présent, toutes les solutions manquaient de certaines fonctionnalités. Voici ma solution:
la source
Solution Javascript:
J'ai réussi à me connecter à une session de navigateur existante à l'aide de cette fonction
La documentation peut être trouvée ici .
la source
J'ai eu une solution en python, j'ai modifié la classe webdriver basée sur la classe PersistenBrowser que j'ai trouvée.
https://github.com/axelPalmerin/personal/commit/fabddb38a39f378aa113b0cb8d33391d5f91dca5
remplacez le module webdriver /usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py
Ej. utiliser:
la source
J'utilise Rails + Cucumber + Selenium Webdriver + PhantomJS, et j'utilise une version monkey-patch de Selenium Webdriver, qui maintient le navigateur PhantomJS ouvert entre les tests. Voir ce billet de blog: http://blog.sharetribe.com/2014/04/07/faster-cucumber-startup-keep-phantomjs-browser-open-between-tests/
Voir aussi ma réponse à ce post: Comment exécuter une commande sur un navigateur déjà ouvert à partir d'un fichier ruby
la source
C'est assez simple en utilisant le
selenium-webdriver
client JavaScript :Tout d'abord, assurez-vous qu'un serveur WebDriver est en cours d'exécution. Par exemple, téléchargez ChromeDriver , puis exécutez
chromedriver --port=9515
.Deuxièmement, créez le pilote comme ceci :
var driver = new webdriver.Builder() .withCapabilities(webdriver.Capabilities.chrome()) .usingServer('http://localhost:9515') // <- this .build();
Voici un exemple complet:
var webdriver = require ('sélénium-webdriver');
la source