Czy ktoś wie, czy Selenium (najlepiej WebDriver) jest w stanie komunikować się i działać za pośrednictwem przeglądarki, która jest już uruchomiona przed uruchomieniem Klienta Selenium?
Chodzi mi o to, czy Selenium jest w stanie komunikować się z przeglądarką bez korzystania z Selenium Server (na przykład może to być Internet Explorer uruchamiany ręcznie).
selenium
selenium-webdriver
webdriver
communication
Angel Romero
źródło
źródło
To jest zduplikowana odpowiedź ** Połącz ponownie ze sterownikiem w języku Python selenium ** Dotyczy wszystkich sterowników i interfejsu 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
I jesteś ponownie połączony ze swoim sterownikiem.
driver.get("http://www.mrsmart.in")
źródło
selenium.common.exceptions.SessionNotCreatedException: Message: Session is already started
Ten fragment kodu z powodzeniem pozwala na ponowne wykorzystanie istniejącej instancji przeglądarki, unikając jednocześnie podnoszenia zduplikowanej przeglądarki. Znalezione na blogu 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/')
źródło
# session_id = driver.session_id
to sposób, w jaki możesz pobrać identyfikator sesji okna chrome przy użyciu interfejsu Python Selenium API. Wydaje mi się, że każda karta w sesji chrome nie ma unikalnego identyfikatora.To jest możliwe. Ale musisz trochę to zhakować, jest kod Co musisz zrobić to uruchomić samodzielny serwer i "załatać" RemoteWebDriver
źródło
Wygląda na to, że selen oficjalnie nie wspiera tej funkcji. Ale Tarun Lalwani stworzył działający kod Java, aby zapewnić tę funkcję. Skorzystaj - http://tarunlalwani.com/post/reusing-existing-browser-session-selenium-java/
Oto działający przykładowy kod skopiowany z powyższego linku:
Twój test musi mieć RemoteWebDriver utworzony z istniejącej sesji przeglądarki. Aby utworzyć ten sterownik, wystarczy znać „informacje o sesji”, tj. Adres serwera (w naszym przypadku lokalny), na którym działa przeglądarka i identyfikator sesji przeglądarki. Aby uzyskać te szczegóły, możemy utworzyć jedną sesję przeglądarki z selenem, otworzyć żądaną stronę, a na koniec uruchomić rzeczywisty skrypt testowy.
Nie wiem, czy istnieje sposób na uzyskanie informacji o sesji, która nie została stworzona przez selen.
Oto przykład informacji o sesji:
Adres zdalnego serwera: http: // localhost: 24266 . Numer portu jest inny dla każdej sesji. Identyfikator sesji: 534c7b561aacdd6dc319f60fed27d9d6.
źródło
Zainspirowany odpowiedzią Erica, oto moje rozwiązanie tego problemu dla selenu 3.7.0. W porównaniu z rozwiązaniem dostępnym pod adresem http://tarunlalwani.com/post/reusing-existing-browser-session-selenium/ , zaletą jest to, że za każdym razem, gdy łączę się z istniejącą sesją, nie będzie pustego okna przeglądarki.
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']
Aby z niego skorzystać:
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))
źródło
Wszystkie dotychczasowe rozwiązania nie posiadały określonej funkcjonalności. Oto moje rozwiązanie:
źródło
Rozwiązanie JavaScript:
Udało mi się dołączyć do istniejącej sesji przeglądarki przy użyciu tej funkcji
Dokumentację można znaleźć tutaj .
źródło
Dostałem rozwiązanie w Pythonie, zmodyfikowałem klasę webdrivera bazującą na klasie PersistenBrowser, którą znalazłem.
https://github.com/axelPalmerin/personal/commit/fabddb38a39f378aa113b0cb8d33391d5f91dca5
wymień moduł webdriver /usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py
Ej. używać:
źródło
Używam Rails + Cucumber + Selenium Webdriver + PhantomJS i używam poprawionej przez małpę wersji Selenium Webdriver, która utrzymuje otwartą przeglądarkę PhantomJS między testami. Zobacz ten wpis na blogu: http://blog.sharetribe.com/2014/04/07/faster-cucumber-startup-keep-phantomjs-browser-open-between-tests/
Zobacz także moją odpowiedź na ten post: Jak wykonać polecenie w już otwartej przeglądarce z pliku ruby
źródło
Przy użyciu
selenium-webdriver
klienta JavaScript jest to całkiem proste :Najpierw upewnij się, że masz uruchomiony serwer WebDriver. Na przykład pobierz ChromeDriver , a następnie uruchom
chromedriver --port=9515
.Po drugie, utwórz sterownik w ten sposób :
var driver = new webdriver.Builder() .withCapabilities(webdriver.Capabilities.chrome()) .usingServer('http://localhost:9515') // <- this .build();
Oto pełny przykład:
var webdriver = require ('selenium-webdriver');
źródło