Кто-нибудь знает, может ли Selenium (предпочтительно WebDriver) взаимодействовать и действовать через браузер, который уже запущен до запуска клиента Selenium?
Я имею в виду, может ли Selenium взаимодействовать с браузером без использования Selenium Server (например, Internet Explorer может быть запущен вручную).
selenium
selenium-webdriver
webdriver
communication
Анхель Ромеро
источник
источник
Это дублированный ответ ** Подключитесь к драйверу в python selenium ** Это применимо для всех драйверов и для 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
И вы снова подключены к своему драйверу.
driver.get("http://www.mrsmart.in")
источник
selenium.common.exceptions.SessionNotCreatedException: Message: Session is already started
Этот фрагмент позволяет повторно использовать существующий экземпляр браузера, избегая при этом создания дублирующего браузера. Найдено в блоге Таруна Лалвани .
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/')
источник
# session_id = driver.session_id
- это способ получения идентификатора сеанса Chrome-окна с помощью python selenium api. Я предполагаю, что каждая вкладка в сеансе Chrome не имеет уникального идентификатора.Это возможно. Но вы должны его немного взломать, есть код. Что вам нужно сделать, это запустить автономный сервер и "исправить" RemoteWebDriver
источник
Похоже, что эта функция официально не поддерживается селеном. Но Тарун Лалвани создал рабочий код Java, чтобы обеспечить эту функцию. Обратитесь - http://tarunlalwani.com/post/reusing-existing-browser-session-selenium-java/
Вот рабочий пример кода, скопированный по указанной выше ссылке:
Ваш тест должен иметь RemoteWebDriver, созданный из существующего сеанса браузера. Чтобы создать этот драйвер, вам нужно знать только «информацию о сеансе», то есть адрес сервера (в нашем случае локальный), на котором запущен браузер, и идентификатор сеанса браузера. Чтобы получить эти сведения, мы можем создать один сеанс браузера с использованием selenium, открыть нужную страницу и, наконец, запустить настоящий тестовый скрипт.
Я не знаю, есть ли способ получить информацию о сеансе, который не был создан селеном.
Вот пример информации о сеансе:
Адрес удаленного сервера: http: // localhost: 24266 . Номер порта отличается для каждого сеанса. Идентификатор сеанса: 534c7b561aacdd6dc319f60fed27d9d6.
источник
Вдохновленный ответом Эрика, вот мое решение этой проблемы для селена 3.7.0. По сравнению с решением http://tarunlalwani.com/post/reusing-existing-browser-session-selenium/ преимущество состоит в том, что при каждом подключении к существующему сеансу не будет пустого окна браузера.
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']
Чтобы использовать это:
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))
источник
Пока что во всех решениях отсутствовала определенная функциональность. Вот мое решение:
источник
Решение Javascript:
Я успешно подключился к существующему сеансу браузера с помощью этой функции
Документацию можно найти здесь .
источник
У меня есть решение на Python, я модифицировал класс webdriver на основе найденного мной класса PersistenBrowser.
https://github.com/axelPalmerin/personal/commit/fabddb38a39f378aa113b0cb8d33391d5f91dca5
замените модуль webdriver /usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py
Эдж. использовать:
источник
Я использую Rails + Cucumber + Selenium Webdriver + PhantomJS, и я использую версию Selenium Webdriver с исправлением обезьяны, которая держит браузер PhantomJS открытым между тестовыми запусками. См. Это сообщение в блоге: http://blog.sharetribe.com/2014/04/07/faster-cucumber-startup-keep-phantomjs-browser-open-between-tests/
См. Также мой ответ на этот пост: Как мне выполнить команду в уже открытом браузере из файла ruby
источник
Это довольно просто использовать
selenium-webdriver
клиент JavaScript :Во-первых, убедитесь, что у вас запущен сервер WebDriver. Например, скачайте ChromeDriver и запустите
chromedriver --port=9515
.Во-вторых, создайте драйвер следующим образом :
var driver = new webdriver.Builder() .withCapabilities(webdriver.Capabilities.chrome()) .usingServer('http://localhost:9515') // <- this .build();
Вот полный пример:
var webdriver = require ('selenium-webdriver');
источник