“NoSuchWindowException: no such window: window was already closed” while switching tabs using Selenium and WebDriver through Python3

I have a form that opens in a new tab when I click on it. When I try to navigate to that new tab, I keep getting a NoSuchWindowException. Code is pretty straightforward. ‘myframe’ is the frame within the new tab that the information will eventually get plugged into. Should I be waiting for something else?

from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait, Select
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException, NoSuchElementException
import time
import pandas as pd

url = *****
driver = webdriver.Chrome(executable_path = r'S:EngineeringJakeMasterControl Completing Pipette CalPM Formschromedriver')
driver.get(url)

wait = WebDriverWait(driver, 5)    

window_before = driver.window_handles[0]
driver.find_element_by_id('portal.scheduling.prepopulate').click()
window_after = driver.window_handles[1]
driver.switch_to_window(window_after)
driver.switch_to_default_content()
wait.until(EC.frame_to_be_available_and_switch_to_it('myframe'))

Traceback (most recent call last):

  File "<ipython-input-308-2aa72eeedd51>", line 1, in <module>
    runfile('S:/Engineering/Jake/MasterControl Completing Pipette CalPM Forms/Pipette Completing CalPM Tasks.py', wdir='S:/Engineering/Jake/MasterControl Completing Pipette CalPM Forms')

  File "C:ProgramDataAnaconda3libsite-packagesspyder_kernelscustomizespydercustomize.py", line 678, in runfile
    execfile(filename, namespace)

  File "C:ProgramDataAnaconda3libsite-packagesspyder_kernelscustomizespydercustomize.py", line 106, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "S:/Engineering/Jake/MasterControl Completing Pipette CalPM Forms/Pipette Completing CalPM Tasks.py", line 150, in <module>
    create_new_cal_task(asset_number)

  File "S:/Engineering/Jake/MasterControl Completing Pipette CalPM Forms/Pipette Completing CalPM Tasks.py", line 130, in create_new_cal_task
    driver.switch_to_default_content()

  File "C:ProgramDataAnaconda3libsite-packagesseleniumwebdriverremotewebdriver.py", line 783, in switch_to_default_content
    self._switch_to.default_content()

  File "C:ProgramDataAnaconda3libsite-packagesseleniumwebdriverremoteswitch_to.py", line 65, in default_content
    self._driver.execute(Command.SWITCH_TO_FRAME, {'id': None})

  File "C:ProgramDataAnaconda3libsite-packagesseleniumwebdriverremotewebdriver.py", line 314, in execute
    self.error_handler.check_response(response)

  File "C:ProgramDataAnaconda3libsite-packagesseleniumwebdriverremoteerrorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)

NoSuchWindowException: no such window: window was already closed
  (Session info: chrome=68.0.3440.106)
  (Driver info: chromedriver=2.40.565498 (ea082db3280dd6843ebfb08a625e3eb905c4f5ab),platform=Windows NT 6.1.7601 SP1 x86_64)

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

As per your question and your code trials when you intend to navigate to a new tab you need to:

  • Induce WebDriverWait while switching to the New Tab.
  • Again when you intend to switch() to the desired <iframe> you need to induce WebDriverWait again.
  • While you switch() to the desired <iframe> try to use either ID, NAME, XPATH or CSS-SELECTOR of the desired <iframe>.
  • Your own code with these simple modification will be as follows:
    from selenium import webdriver
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    
    url = "your_url"
    driver = webdriver.Chrome(executable_path = r'S:EngineeringJakeMasterControl Completing Pipette CalPM Formschromedriver')
    driver.get(url)
    windows_before  = driver.current_window_handle
    driver.find_element_by_id('portal.scheduling.prepopulate').click()
    WebDriverWait(driver, 5).until(EC.number_of_windows_to_be(2))
    windows_after = driver.window_handles
    new_window = [x for x in windows_after if x != windows_before][0]
    # driver.switch_to_window(new_window) <!---deprecated>
    driver.switch_to.window(new_window)
    WebDriverWait(driver, 5).until(EC.frame_to_be_available_and_switch_to_it((By.ID,"myframe"))) # or By.NAME, By.XPATH, By.CSS_SELECTOR

Method 2

Thanks Debanjan (and apologies for late response – just got back to office). I was able to fix this by using

While True:
    try:
        [navigate to the new frame, wait for a specific element to show up]
        break
    except (NoSuchWindowException, NoSuchElementException):
        pass

I had not realized that when I clicked to open the form, another window opened very briefly in the background, and then closed. This increased the window_handles to 2, so doing anything relating to waiting for 2 window handles still kept throwing an error.

Method 3

Please try to update your chrome version. The same error occurred for me, which happened in chrome 70, after an update to 91, it is ok.


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x