Selenium Python 不关闭 child window
Selenium Python does not close the child window
我的网页在点击时会打开新的浏览器 window。我可以获得 2 个句柄,但是 driver.close() 总是关闭 first/main window.
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("file:///D:/blackhole/print.html")
han = driver.window_handles
print("handles:", han) # gets 1 handle
time.sleep(2)
click_btn = driver.find_element_by_link_text('Print')
click_btn.click()
han = driver.window_handles
print("handles:", han) # gets 2 handles
driver.switch_to_window = han[1] # first element is always first window handle
driver.close() # main window close
下面调用新的网页代码window
<a href="print.html"
onclick="window.open('popprint.html',
'newwindow',
'width=300,height=250');
return false;"
>Print</a>
Firefox 也有同样的行为。
Python3.6.7
driver.close()
只关闭当前的window。
要关闭所有 Windows 并退出网络驱动程序,请改为调用 driver.quit()
。
Selenium 无法关闭 active window 即 新打开的 window 因为实际上你还没有以干净的方式切换到 新开的 window。
解决方案
关于Tab/Window的几句话 switching/handling:
switch_to_window(window_name)
is deprecated for quite some time now and you need to use driver.switch_to.window
- 始终跟踪 Parent Window 句柄,以便您可以根据用例稍后返回。
- 在 Tabs/Windows.
之间切换之前始终使用 WebDriverWait with expected_conditions as number_of_windows_to_be(num_windows)
- 始终跟踪 Child Window 句柄,以便您可以在需要时遍历。
- 在提取 页面标题.[=51= 之前,始终使用 WebDriverWait 并将
expected_conditions
作为 title_contains("partial_page_title")
]
这是你自己的代码,上面提到了一些小的调整:
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Firefox(executable_path=r'C:\WebDrivers\geckodriver.exe')
driver.get("file:///D:/blackhole/print.html")
parent_han = driver.window_handles
driver.find_element_by_link_text('Print').click()
WebDriverWait(driver, 10).until(EC.number_of_windows_to_be(2))
all_han = driver.window_handles
new_han = [x for x in all_han if x != parent_han][0]
driver.switch_to.window(new_han)
driver.close()
您可以在 Selenium Switch Tabs
中找到详细的讨论
我的网页在点击时会打开新的浏览器 window。我可以获得 2 个句柄,但是 driver.close() 总是关闭 first/main window.
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("file:///D:/blackhole/print.html")
han = driver.window_handles
print("handles:", han) # gets 1 handle
time.sleep(2)
click_btn = driver.find_element_by_link_text('Print')
click_btn.click()
han = driver.window_handles
print("handles:", han) # gets 2 handles
driver.switch_to_window = han[1] # first element is always first window handle
driver.close() # main window close
下面调用新的网页代码window
<a href="print.html"
onclick="window.open('popprint.html',
'newwindow',
'width=300,height=250');
return false;"
>Print</a>
Firefox 也有同样的行为。 Python3.6.7
driver.close()
只关闭当前的window。
要关闭所有 Windows 并退出网络驱动程序,请改为调用 driver.quit()
。
Selenium 无法关闭 active window 即 新打开的 window 因为实际上你还没有以干净的方式切换到 新开的 window。
解决方案
关于Tab/Window的几句话 switching/handling:
switch_to_window(window_name)
is deprecated for quite some time now and you need to usedriver.switch_to.window
- 始终跟踪 Parent Window 句柄,以便您可以根据用例稍后返回。
- 在 Tabs/Windows. 之间切换之前始终使用 WebDriverWait with expected_conditions as
- 始终跟踪 Child Window 句柄,以便您可以在需要时遍历。
- 在提取 页面标题.[=51= 之前,始终使用 WebDriverWait 并将
expected_conditions
作为title_contains("partial_page_title")
] 这是你自己的代码,上面提到了一些小的调整:
from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Firefox(executable_path=r'C:\WebDrivers\geckodriver.exe') driver.get("file:///D:/blackhole/print.html") parent_han = driver.window_handles driver.find_element_by_link_text('Print').click() WebDriverWait(driver, 10).until(EC.number_of_windows_to_be(2)) all_han = driver.window_handles new_han = [x for x in all_han if x != parent_han][0] driver.switch_to.window(new_han) driver.close()
您可以在 Selenium Switch Tabs
中找到详细的讨论
number_of_windows_to_be(num_windows)