如何使用Firefox驱动程序处理Python selenium中的多个窗口

时间:2018-06-13 19:22:40

标签: python-3.x selenium selenium-webdriver selenium-chromedriver geckodriver

我想在Python Selenium中学习 WINDOW 处理。

我的任务是:

首先打开' Google.com'。

第二次开放' Yahoo.com'在新窗口

第三次切换回第一个窗口,然后点击Gmail链接。

第四步切换到第二个窗口,然后点击财务链接。

以下代码对我有用:

browser.get("http://www.google.co.in")
browser.execute_script("window.open('https://www.yahoo.com')")
browser.switch_to_window(browser.window_handles[0])
print(browser.title)
gmail=browser.find_element_by_class_name("gb_P")
gmail.click()
browser.switch_to_window(browser.window_handles[1])
print(browser.title)
fin=browser.find_element_by_link_text("Finance")
fin.click()

但是当我尝试将序列更改为任务时:

首先打开' Google.com'。

第二次开放' Yahoo.com'在新窗口

第三个保留在同一窗口中,然后点击财务链接。

第四次切换到第一个窗口,然后点击Gmail链接。

以下已更改的任务代码,其中在新窗口中打开yahoo.com然后点击财务链接,然后切换到包含Google.com的主窗口,然后点击Gmail链接并不# 39;工作:

browser.get("http://www.google.co.in")
browser.execute_script("window.open('https://www.yahoo.com')")
browser.switch_to_window(browser.window_handles[1])
print(browser.title)
fin=browser.find_element_by_link_text("Finance")
fin.click()
browser.switch_to_window(browser.window_handles[0])
print(browser.title)
gmail=browser.find_element_by_class_name("gb_P")
gmail.click()

但是,如果我在切换到 Yahoo 标签后刷新页面,则此功能仅适用于 Chrome 驱动程序,而不适用于 Firefox < / strong>司机。

browser.get("http://www.google.co.in")
print(browser.current_window_handle)
browser.execute_script("window.open('https://www.yahoo.com')")
print(browser.current_window_handle)

WebDriverWait(browser, 10).until(EC.number_of_windows_to_be(2))


browser.switch_to_window(browser.window_handles[1])
print(browser.current_window_handle)
print(browser.title)

browser.refresh()

fin=browser.find_element_by_link_text("Finance")
fin.click()
print(browser.window_handles)

WebDriverWait(browser,10000)

browser.switch_to_window(browser.window_handles[0])
print(browser.title)
print(browser.current_window_handle)
gmail=browser.find_element_by_class_name("gb_P")
gmail.click()

1 个答案:

答案 0 :(得分:0)

根据您更新的问题,关于标签/窗口切换/处理的几句话:

  • 始终跟踪父窗口句柄,以便您可以遍历其余的用例。
  • 始终将 WebDriverWait 期望条件一起用作number_of_windows_to_be(num_windows)
  • 始终跟踪子窗口句柄,以便您可以根据需要进行遍历。
  • 以下是您自己的代码,上面提到了一些小调整:

    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    #other lines of code
    browser.get("http://www.google.co.in")
    print("Initial Page Title is : %s" %browser.title)
    windows_before  = browser.current_window_handle
    print("First Window Handle is : %s" %windows_before)
    browser.execute_script("window.open('https://www.yahoo.com')")
    WebDriverWait(browser, 10).until(EC.number_of_windows_to_be(2))
    windows_after = browser.window_handles
    new_window = [x for x in windows_after if x != windows_before][0]
    browser.switch_to_window(new_window)
    print("Page Title after Tab Switching is : %s" %browser.title)
    print("Second Window Handle is : %s" %new_window)
    
  • 控制台输出:

    Initial Page Title is : Google
    First Window Handle is : CDwindow-34D74AB1BB2F0A1A8B7426BF25B86F52
    Page Title after Tab Switching is : Yahoo
    Second Window Handle is : CDwindow-F3ABFEBE4907CFBB3CD09CEB75ED570E
    

浏览器快照:

TAB_SWITCH

现在您已经拥有了 Window Handles ,因此您可以轻松切换到任何 TAB 来执行任何操作。