Вкладки переключателя Selenium

Поскольку Firefox больше не поддерживает Control + T для вкладки, я начал использовать driver.execute_script ("window.open ('URL', 'новое_окно')")

Я пытаюсь отобразить заголовок другой вкладки, которую я открываю, и переключаюсь между ними. В приведенном ниже примере я ожидаю, что результатом будет facebook, google и обратно в facebook. Прямо сейчас вывод - facebook, facebook и facebook.

Я попробовал ответить здесь, но он тоже не сработал: Вернитесь на родительскую вкладку с помощью selenium webdriver

from selenium import webdriver

driver = webdriver.Firefox()
driver.get("http://www.facebook.com/")
print(driver.title)

driver.execute_script("window.open('http://google.com', 'new_window')")
print(driver.title)

driver.switch_to.window(driver.window_handles[0])
print(driver.title)

ОБНОВЛЕНО: Я попробовал следующий код, но он все равно не сработал.

from selenium import webdriver

driver = webdriver.Firefox()
driver.get("http://www.facebook.com/")
print(driver.title)
window_before = driver.window_handles[0]

driver.execute_script("window.open('http://google.com', 'new_window')")
window_after = driver.window_handles[1]
driver.switch_to.window(window_after)
print(driver.title)
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
0
5 544
4

Ответы 4

window.open откроет ссылку в новой вкладке. Драйвер Selenium Firefox не имеет возможности переключаться между вкладками, поскольку для них есть только один дескриптор окна (в отличие от Chrome, у которого их 2). Если вы дадите команде window() параметр 'specs' с шириной и высотой, он откроет новое окно, и вы сможете переключиться.

После открытия нового окна драйвер по-прежнему сосредоточен на первом, вам нужно сначала переключиться в новое окно.

size = driver.get_window_size();
driver.execute_script("window.open('http://google.com', 'new_window', 'height=argument[0], width=argument[1]')", size['height'], size['width'])
driver.switch_to.window(driver.window_handles[1])
print(driver.title)

Я все еще не могу распечатать заголовок второго окна после переключения. Вместо того, чтобы снова печатать facebook, теперь он просто ничего не отображает.

tada23 09.12.2018 08:43

@ tada23 Обновил мой ответ.

Guy 09.12.2018 09:40

Я использовал driver.getWindowHandles();, чтобы заставить все окна и driver.switchTo().window(handle); переключиться на нужное.

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

  • Всегда отслеживайте дескриптор Родительское окно, чтобы при необходимости можно было вернуться назад в соответствии с вашим вариантом использования.

  • Всегда используйте WebDriverWait с ожидаемые_условия как number_of_windows_to_be(num_windows) перед переключением между Вкладки / Окна.

  • Всегда отслеживайте дескрипторы Дочернее окно, чтобы вы могли перемещаться, когда это необходимо.

  • Всегда используйте WebDriverWait с ожидаемые_условия как 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("http://www.facebook.com/")
    print("Initial Page Title is: %s" %driver.title)
    windows_before  = driver.current_window_handle
    driver.execute_script("window.open('http://google.com')")
    WebDriverWait(driver, 10).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, 20).until(EC.title_contains("G"))
    print("Page Title after first window switching is: %s" %driver.title)
    driver.close()
    driver.switch_to.window(windows_before)
    WebDriverWait(driver, 20).until(EC.title_contains("F"))
    print("Page Title after second window switching is: %s" %driver.title)
    driver.quit()
    
  • Консольный вывод:

    Initial Page Title is: Facebook – log in or sign up
    Page Title after first window switching is: Google
    Page Title after second window switching is: Facebook – log in or sign up
    

Эта команда всегда переносит вас на недавно открытую новую вкладку в Chrome. Протестировано в последних версиях Chrome и Pytest на Mac.

selenium.switch_to.window(selenium.window_handles[-1])

Другие вопросы по теме