Selenium Python не закрывает дочернее окно - PullRequest
0 голосов
/ 16 декабря 2018

У меня есть веб-страница, открывающая новое окно браузера по клику.Я могу получить 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

Ниже кода веб-страницы, который вызывает новое окно

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

То же поведение для Firefoxтакже.Python 3.6.7

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Selenium не может закрыть активное окно , т. Е. вновь открытое окно , потому что практически вы не переключились на недавно открытое окно в чистом виде.

Решение

Несколько слов о переключении / обработке Tab / Window:

  • switch_to_window(window_name) isуже довольно давно устарел, и вам нужно использовать driver.switch_to.window
  • Всегда отслеживайте ручку Parent Window , чтобы вы могли пройтипозже, если требуется в соответствии с вашим сценарием использования.
  • Всегда используйте WebDriverWait с Ожидаемые условия как number_of_windows_to_be(num_windows) перед переключением между Tabs /Windows .
  • Всегда отслеживайте дескрипторы Дочернее окно , чтобы вы могли перемещаться при необходимости.
  • Всегда использовать 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()
    
  • Подробное обсуждение можно найти в Вкладки переключателя селена

0 голосов
/ 16 декабря 2018

driver.close() закрывает только текущее окно.Чтобы закрыть все Windows и выйти из веб-драйвера, вместо этого вызовите driver.quit().

...