Selenium 开关选项卡

Posted

技术标签:

【中文标题】Selenium 开关选项卡【英文标题】:Selenium Switch Tabs 【发布时间】:2019-05-10 10:37:27 【问题描述】:

由于 Firefox 不再支持选项卡的 Control + T,我开始使用 driver.execute_script("window.open('URL', 'new_window')")

我正在尝试显示我打开的不同选项卡的标题并在它们之间切换。对于下面的示例,我希望输出是 facebook、google 并返回到 facebook。现在的输出是 facebook、facebook 和 facebook。

我尝试了这里的答案,但也没有用:Switch back to parent tab using 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)

【问题讨论】:

【参考方案1】:

关于Tab/Window切换/处理的几句话:

始终跟踪 父窗口 句柄,以便您稍后可以根据您的用例需要时返回。

选项卡/窗口之间切换之前,始终使用WebDriverWait 和expected_conditions 作为number_of_windows_to_be(num_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("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

【讨论】:

【参考方案2】:

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 更新了我的答案。【参考方案3】:

我使用driver.getWindowHandles(); 获取所有窗口并使用driver.switchTo().window(handle); 切换到所需的窗口。

【讨论】:

【参考方案4】:

此命令始终会将您带到最近在 chrome 中打开的新标签页。在最新版本的 Chrome 和 Mac 上的 Pytest 上测试。

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

【讨论】:

以上是关于Selenium 开关选项卡的主要内容,如果未能解决你的问题,请参考以下文章

markdown Python Selenium - 打开新选项卡/焦点选项卡/关闭选项卡

如何切换到 Selenium 中的活动选项卡?

Selenium - 单击链接会打开一个新选项卡

使用Selenium框架,如何在现有选项卡中执行进程?

获取打开的选项卡 Selenium/Java 的 URL

如何使用“--auto-open-devtools-for-tabs”在 selenium webdriver 中从元素选项卡切换到网络选项卡?