通过Python3使用Selenium和WebDriver切换选项卡时,“ NoSuchWindowException:没有这样的窗口:窗口已经关闭”

时间:2018-08-09 20:15:00

标签: python selenium selenium-webdriver webdriver webdriverwait

我有一个表单,当我单击它时会在新选项卡中打开。当我尝试导航到该新选项卡时,我不断收到NoSuchWindowException。代码非常简单。 “ myframe”是新标签中最终将被插入信息的框架。我应该再等吗?

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:\Engineering\Jake\MasterControl Completing Pipette CalPM Forms\chromedriver')
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:\ProgramData\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 678, in runfile
    execfile(filename, namespace)

  File "C:\ProgramData\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.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:\ProgramData\Anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 783, in switch_to_default_content
    self._switch_to.default_content()

  File "C:\ProgramData\Anaconda3\lib\site-packages\selenium\webdriver\remote\switch_to.py", line 65, in default_content
    self._driver.execute(Command.SWITCH_TO_FRAME, {'id': None})

  File "C:\ProgramData\Anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 314, in execute
    self.error_handler.check_response(response)

  File "C:\ProgramData\Anaconda3\lib\site-packages\selenium\webdriver\remote\errorhandler.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)

3 个答案:

答案 0 :(得分:1)

根据您的问题和代码试验,当您打算导航到新标签页时,您需要:

  • 切换 New Tab 时,引发 WebDriverWait
  • 再次打算将switch()调整为所需的<iframe>时,您需要再次诱导 WebDriverWait
  • switch()到所需的<iframe>时,尝试使用 ID NAME XPATH 或< em>所需的<iframe>的CSS-SELECTOR 。
  • 经过这些简单修改的​​您自己的代码如下:

    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:\Engineering\Jake\MasterControl Completing Pipette CalPM Forms\chromedriver')
    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)
    WebDriverWait(driver, 5).until(EC.frame_to_be_available_and_switch_to_it((By.ID,"myframe"))) # or By.NAME, By.XPATH, By.CSS_SELECTOR
    

答案 1 :(得分:0)

感谢Debanjan(谨对此深表歉意-刚回到办公室)。我可以通过使用

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

我没有意识到,当我单击打开表单时,另一个窗口在后台非常短暂地打开,然后关闭。这样会将window_handles增加到2,因此进行与等待2个窗口句柄有关的任何操作仍然会引发错误。

答案 2 :(得分:0)

请尝试更新您的 Chrome 版本。我也出现了同样的错误,在chrome 70中发生过,更新到91后就可以了。