Selenium Python 不关闭子窗口

Nut*_*tan 6 selenium window-handles python-3.x selenium-webdriver webdriverwait

我有一个网页,点击后会打开新的浏览器窗口。我可以获得 2 个句柄,但是 driver.close() 总是关闭第一个/主窗口。

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
Run Code Online (Sandbox Code Playgroud)

下面的网页代码调用新窗口

<a href="print.html"  
onclick="window.open('popprint.html', 
                    'newwindow', 
                    'width=300,height=250'); 
        return false;"
>Print</a>
Run Code Online (Sandbox Code Playgroud)

Firefox 也有同样的行为。Python 3.6.7

Deb*_*anB 4

Selenium无法关闭活动窗口,即新打开的窗口,因为实际上您还没有以干净的方式切换到新打开的窗口。

解决方案

关于选项卡/窗口切换/处理的几句话:

  • switch_to_window(window_name)现在已被弃用相当长一段时间了,您需要使用driver.switch_to.window
  • 始终跟踪父窗口句柄,以便您可以根据您的用例在以后需要时返回。
  • 始终将WebDriverWait预期条件一起使用,就像在Tabs/Windowsnumber_of_windows_to_be(num_windows)之间切换之前一样。
  • 始终跟踪子窗口句柄,以便您可以在需要时遍历。
  • 始终像提取页面标题之前一样使用WebDriverWaitexpected_conditionstitle_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()
    
    Run Code Online (Sandbox Code Playgroud)
  • 您可以在Selenium Switch Tabs中找到详细讨论