Adakah yang tahu jika Selenium (sebaiknya WebDriver) dapat berkomunikasi dan bertindak melalui browser yang sudah berjalan sebelum meluncurkan Selenium Client?
Maksud saya jika Selenium dapat berkomunikasi dengan browser tanpa menggunakan Server Selenium (dengan dapat berupa Internet Explorer diluncurkan secara manual misalnya).
selenium
selenium-webdriver
webdriver
communication
Angel Romero
sumber
sumber
Ini adalah jawaban duplikat ** Hubungkan kembali ke driver dengan python selenium ** Ini berlaku pada semua driver dan untuk 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
Dan Anda terhubung ke driver Anda lagi.
driver.get("http://www.mrsmart.in")
sumber
selenium.common.exceptions.SessionNotCreatedException: Message: Session is already started
Cuplikan ini berhasil memungkinkan untuk menggunakan kembali browser yang ada, namun tetap menghindari peningkatan browser duplikat. Ditemukan di blog 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/')
sumber
# session_id = driver.session_id
adalah cara Anda dapat mengambil id sesi dari jendela chrome menggunakan api selenium python. Saya rasa setiap tab di sesi chrome tidak memiliki ID unik.Itu mungkin. Tetapi Anda harus meretasnya sedikit, ada kode Yang harus Anda lakukan adalah menjalankan server yang berdiri sendiri dan "menambal" RemoteWebDriver
sumber
Tampaknya fitur ini tidak didukung secara resmi oleh selenium. Namun, Tarun Lalwani telah membuat kode Java yang berfungsi untuk menyediakan fitur tersebut. Lihat - http://tarunlalwani.com/post/reusing-existing-browser-session-selenium-java/
Berikut adalah kode contoh yang berfungsi, disalin dari tautan di atas:
Pengujian Anda harus memiliki RemoteWebDriver yang dibuat dari sesi browser yang ada. Untuk membuat Driver itu, Anda hanya perlu mengetahui "info sesi", yaitu alamat server (lokal dalam kasus kami) tempat browser berjalan dan id sesi browser. Untuk mendapatkan detail ini, kita dapat membuat satu sesi browser dengan selenium, membuka halaman yang diinginkan, dan akhirnya menjalankan script pengujian yang sebenarnya.
Saya tidak tahu apakah ada cara untuk mendapatkan info sesi untuk sesi yang tidak dibuat oleh selenium.
Berikut adalah contoh info sesi:
Alamat server jarak jauh: http: // localhost: 24266 . Nomor port berbeda untuk setiap sesi. ID Sesi: 534c7b561aacdd6dc319f60fed27d9d6.
sumber
Terinspirasi oleh jawaban Eric, inilah solusi saya untuk masalah ini untuk selenium 3.7.0. Dibandingkan dengan solusi di http://tarunlalwani.com/post/reusing-existing-browser-session-selenium/ , keuntungannya adalah tidak akan ada jendela browser kosong setiap kali saya terhubung ke sesi yang ada.
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']
Untuk menggunakannya:
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))
sumber
Semua solusi sejauh ini kurang memiliki fungsi tertentu. Inilah solusi saya:
sumber
Solusi Javascript:
Saya berhasil melampirkan ke sesi browser yang ada menggunakan fungsi ini
Dokumentasi dapat ditemukan di sini .
sumber
Saya mendapat solusi dengan python, saya memodifikasi kelas webdriver berdasarkan kelas PersistenBrowser yang saya temukan.
https://github.com/axelPalmerin/personal/commit/fabddb38a39f378aa113b0cb8d33391d5f91dca5
ganti modul webdriver /usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py
Ej. menggunakan:
sumber
Saya menggunakan Rails + Cucumber + Selenium Webdriver + PhantomJS, dan saya telah menggunakan versi Selenium Webdriver yang di-patch, yang membuat browser PhantomJS tetap terbuka di antara pengujian. Lihat entri blog ini: http://blog.sharetribe.com/2014/04/07/faster-cucumber-startup-keep-phantomjs-browser-open-between-tests/
Lihat juga jawaban saya untuk posting ini: Bagaimana cara menjalankan perintah pada browser yang sudah dibuka dari file ruby
sumber
Ini cukup mudah menggunakan
selenium-webdriver
klien JavaScript :Pertama, pastikan Anda menjalankan server WebDriver. Misalnya, unduh ChromeDriver , lalu jalankan
chromedriver --port=9515
.Kedua, buat driver seperti ini :
var driver = new webdriver.Builder() .withCapabilities(webdriver.Capabilities.chrome()) .usingServer('http://localhost:9515') // <- this .build();
Berikut contoh lengkapnya:
var webdriver = membutuhkan ('selenium-webdriver');
sumber