"NoSuchWindowException: no such window: window was already closed" 通过 Python3 使用 Selenium 和 WebDriver 切换选项卡
"NoSuchWindowException: no such window: window was already closed" while switching tabs using Selenium and WebDriver through Python3
我有一个表单,当我单击它时会在新选项卡中打开它。当我尝试导航到该新选项卡时,我不断收到 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)
根据您的问题和代码试验,当您打算导航到新标签页时,您需要:
- 在切换到新标签时WebDriverWait。
- 同样,当您打算
switch()
到所需的 <iframe>
时,您需要再次引发 WebDriverWait。
- 当您
switch()
想要 <iframe>
时尝试使用 ID、NAME、XPATH 或 CSS-SELECTOR 所需的 <iframe>
.
您自己的代码经过这些简单的修改后将如下所示:
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) <!---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
感谢 Debanjan(对于迟到的回复表示歉意 - 刚刚回到办公室)。我能够通过使用
来解决这个问题
While True:
try:
[navigate to the new frame, wait for a specific element to show up]
break
except (NoSuchWindowException, NoSuchElementException):
pass
我没有意识到,当我点击打开表格时,另一个 window 在后台非常短暂地打开,然后关闭。这将 window_handles 增加到 2,所以做任何与等待 2 window 句柄相关的事情仍然会抛出错误。
请尝试更新您的 chrome 版本。我也出现了同样的错误,发生在chrome70,更新到91后就ok了
我有一个表单,当我单击它时会在新选项卡中打开它。当我尝试导航到该新选项卡时,我不断收到 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)
根据您的问题和代码试验,当您打算导航到新标签页时,您需要:
- 在切换到新标签时WebDriverWait。
- 同样,当您打算
switch()
到所需的<iframe>
时,您需要再次引发 WebDriverWait。 - 当您
switch()
想要<iframe>
时尝试使用 ID、NAME、XPATH 或 CSS-SELECTOR 所需的<iframe>
. 您自己的代码经过这些简单的修改后将如下所示:
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) <!---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
感谢 Debanjan(对于迟到的回复表示歉意 - 刚刚回到办公室)。我能够通过使用
来解决这个问题While True:
try:
[navigate to the new frame, wait for a specific element to show up]
break
except (NoSuchWindowException, NoSuchElementException):
pass
我没有意识到,当我点击打开表格时,另一个 window 在后台非常短暂地打开,然后关闭。这将 window_handles 增加到 2,所以做任何与等待 2 window 句柄相关的事情仍然会抛出错误。
请尝试更新您的 chrome 版本。我也出现了同样的错误,发生在chrome70,更新到91后就ok了