Обрабатывать несколько окон в Python

Я работаю над проектом автоматизации селена с использованием Python.

Я столкнулся с проблемой, которая обрабатывает несколько окон браузера.

Сценарий выглядит следующим образом. Когда я нажимаю ссылку на домашней странице, открывается новое окно. В открывшемся окне я не могу выполнять никаких действий, потому что все еще фокусируюсь на веб-драйвере домашней страницы.

Кто-нибудь может показать мне, как изменить фокус с фонового окна на недавно открытое окно?

Возможное решение - driver.switch_to.window(), но для этого требуется имя окна. Как узнать название окна? Если это неправильный способ сделать это, кто-нибудь может привести несколько примеров кода для выполнения этого действия?

Ответ 1

Вы можете сделать это с помощью методов window_handles и switch_to_window.

Перед тем, как щелкнуть ссылку, сначала сохраните дескриптор окна как

window_before = driver.window_handles[0]

после нажатия на ссылку сохранить дескриптор окна только что открытого окна как

window_after = driver.window_handles[1]

затем выполните переход к окну methow, чтобы перейти к вновь открытому окну

driver.switch_to_window(window_after)

и аналогичным образом вы можете переключаться между старым и новым окном. Ниже приведен пример кода

import unittest
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By

class GoogleOrgSearch(unittest.TestCase):

     def setUp(self):
         self.driver = webdriver.Firefox()

    def test_google_search_page(self):
         driver = self.driver
         driver.get("http://www.cdot.in")
         window_before = driver.window_handles[0]
         print window_before
         driver.find_element_by_xpath("//a[@href='http://www.cdot.in/home.htm']").click()
         window_after = driver.window_handles[1]
         driver.switch_to_window(window_after)
         print window_after
         driver.find_element_by_link_text("ATM").click()
         driver.switch_to_window(window_before)


    def tearDown(self):
    self.driver.close()

if __name__ == "__main__":
unittest.main()

Ответ 2

window_handles должен дать вам ссылки на все открытые окна.

this - это то, что документ должен сказать о переключении окон.

Ответ 3

В дополнение к уже полученным ответам, чтобы открыть новую вкладку, можно использовать команду javascript window.open().

Например:

# Opens a new tab
self.driver.execute_script("window.open()")

# Switch to the newly opened tab
self.driver.switch_to.window(self.driver.window_handles[1])

# Navigate to new URL in new tab
self.driver.get("https://google.com")
# Run other commands in the new tab here

Затем вы можете закрыть исходную вкладку следующим образом

# Switch to original tab
self.driver.switch_to.window(self.driver.window_handles[0])

# Close original tab
self.driver.close()

# Switch back to newly opened tab, which is now in position 0
self.driver.switch_to.window(self.driver.window_handles[0])

Или закройте вновь открытую вкладку

# Close current tab
self.driver.close()

# Switch back to original tab
self.driver.switch_to.window(self.driver.window_handles[0])

Надеюсь, что это поможет.

Ответ 4

Мы можем обрабатывать разные окна, перемещаясь между именованными окнами с помощью метода switchTo:

driver.switch_to.window("windowName")

<a href="somewhere.html" target="windowName">Click here to open a new window</a>

В качестве альтернативы вы можете передать "дескриптор окна" в метод switchTo(). window(). Зная это, его можно перебирать через каждое открытое окно следующим образом:

for handle in driver.window_handles:
    driver.switch_to.window(handle)

Ответ 5

например вы можете взять

driver.get('https://www.naukri.com/')

поскольку это текущее окно, мы можем назвать его

main_page = driver.current_window_handle

если есть всплывающее окно по крайней мере 1, кроме текущего окна, вы можете попробовать этот метод и поставить условие if в операторе break, нажав n пробную версию для индекса

for handle in driver.window_handles:
    if handle != main_page:
        print(handle)
        login_page = handle
        break

driver.switch_to.window(login_page)

Теперь, какие бы учетные данные вы не применили, предоставьте их после входа в систему. Окно исчезнет, но вы должны перейти к окну главной страницы, и все готово.

driver.switch_to.window(main_page)
sleep(10)