当前位置: 首页 > 知识库问答 >
问题:

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

贺宝
2023-03-14

第四,切换到第二个窗口,点击金融链接。

以下代码适用于我:

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()

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

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()

但是如果我在切换到雅虎选项卡后刷新页面,这只在Chrome驱动程序中工作,而不是在Firefox驱动程序中。

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个答案

姚嘉容
2023-03-14

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

>

  • 始终跟踪父窗口句柄,以便可以遍历其馀的用法。
  • 始终将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) <!---deprecated>
    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
    

  •  类似资料:
    • 问题内容: 我用python与selenium结合编写了一个脚本,以从其着陆页中抓取不同文章的链接,并通过跟踪引向其内页的url最终获得每个文章的标题。尽管我在这里解析的内容是静态内容,但我还是使用了selenium来查看它在多处理中的工作方式。 但是,我的意图是使用多处理进行抓取。到目前为止,我知道selenium不支持多处理,但似乎我错了。 我的问题:当使用多处理运行selenium时,如何减

    • 我有一个情况显示在下面的SS。 我正在用selenium(Java)测试一些web应用程序,在一个瞬间我同时得到了4个弹出窗口。我想把他们全部解雇,但实际上我不能得到其中的3个。 我在搜索如何处理多个弹出窗口,发现了这个主题:如何在Selenium中处理多个报警弹出窗口确认?-但那不是我要找的。 第一次driver.switchTo().alert()返回一个警报,我可以将它取消。但是第二次,它是

    • 我目前正在研究一种数据可视化技术,它从电影中获取信息,实时播放并同时创建。为此,我想有两个独立的草图窗口。一个窗口应显示实时播放的电影,另一个窗口应显示正在进行的可视化。 我似乎不知道如何轻松地添加另一个草图窗口,并尝试了一些在处理3中不再工作的示例。 然后我偶然发现了这个例子:https://gist.github.com/atduskgreg/666e46c8408e2a33b09a 尽管我可

    • 问题内容: 我想通过在“处理”中仅使用一个草图来创建两个窗口。 我想做的是,如果我在一个窗口中单击一个按钮,则某些图像会出现在另一个窗口中。 我搜索了Google并找到了一些示例。实际上,我在此“堆栈溢出网络”中发现了相同的问题。这里是链接。 在处理中 http://forum.processing.org/one/topic/multiple- windows-2-4-2011.html中 创建

    • 问题内容: 我在python中有以下代码 我的问题是在test_home_page函数之后,firefox实例关闭并为下一个test_whatever函数再次打开。我该怎么做,以便所有测试用例都从同一firefox实例执行。 问题答案: 在以下位置初始化firefox驱动程序:

    • 问题内容: 昨天我遇到了一个大问题。在我当前的项目中,我使用Oracle JDBC的ojdbc6实现进行连接,但是我还需要处理例如oracle 8数据库,而使用此JAR完全不可能。您可能会说我应该使用ojdbc14例如,这在某些测试中是正确的,但是让我们假设以后我将需要处理来自同一供应商的2种数据库,但是我们知道BOTH和我都没有现有的实现需要同时加载它们。相同的接口(而且,不仅是相同的接口,相同