在 OS X 中使用 Selenium WebDriver 如何打开和关闭新标签页?

19

我正在使用Python 2.7中的Firefox Webdriver在Windows上模拟打开(Ctrl+t)和关闭(Ctrl + w)新标签页。

这是我的代码:

from selenium import webdriver  
from selenium.webdriver.common.keys import Keys

browser = webdriver.Firefox()
browser.get('https://www.google.com')
main_window = browser.current_window_handle
# open new tab
browser.find_element_by_tag_name('body').send_keys(Keys.CONTROL + 't')
browser.get('https://www.yahoo.com')

# close tab
browser.find_element_by_tag_name('body').send_keys(Keys.CONTROL + 'w')

如何在Mac上实现相同的功能? 根据这个评论,应该使用browser.find_element_by_tag_name('body').send_keys(Keys.COMMAND + 't')来打开一个新标签页,但我没有Mac进行测试,那么相当于Ctrl-w的等效操作是什么呢?
谢谢!

关闭标签页的快捷键是 Command + 'w'。你可以把 Command 键看作是控制键的替代品。我猜你得向朋友借一个来测试你的代码... - JunYoung Gwak
它在Chrome上不起作用?! - Saige Zhang
7个回答

15

打开一个新标签页:

browser.get('http://www.google.com')

关闭一个标签页:

browser.close()

切换到一个选项卡:

browser.swith_to_window(window_name)

+1 for browser.close(); 我以为这是对浏览器对象进行垃圾回收的操作,没有意识到它是关闭选项卡的方法。 - Steve Byrne
@StevenByrne 实际上,如果您在循环运行后不手动退出进程(例如,在Python中使用sys.exit(0)),无论是driver.close()还是driver.quit()都会导致内存泄漏。 - alien_frog
抱歉,我的错误。driver.quit() 将防止内存泄漏。当您只有一个选项卡时,driver.close() 等同于 driver.quit() - alien_frog

13

您可以选择要关闭哪个窗口:

window_name = browser.window_handles[0]

切换窗口:

browser.switch_to.window(window_name=window_name)

然后关闭它:

browser.close()

13

没有什么比运行JavaScript更容易和更清晰的了。

打开新标签页: driver.execute_script("window.open('');")


2
非常感谢!但是您的命令打开了一个新窗口,而不是一个新标签页。如果您能向我展示如何使用JS打开一个新标签页,我将接受您的答案。 - user2314737

7

以下是基于Python 2.7和Chrome驱动程序的内容,汇总了上面的答案。

通过以下方式打开新标签页:driver.execute_script("window.open('"+URL+"', '__blank__');")其中URL是一个字符串,例如"http://www.google.com"。

通过以下方式关闭标签页:driver.close() [注意,当你只有1个标签页时,这也可以作为driver.quit()使用]。

在标签页之间导航:driver.switch_to_window(driver.window_handles[0])driver.switch_to_window(driver.window_handles[1])


2

打开新标签页:

browser.execute_script("window.open('"+your url+"', '_blank')")

切换到新标签页:

browser.switch_to.window(windows[1])

3
名称错误:'windows'未定义。 - user2738183
windows = browser.window_handles - Parvat . R

1
这个方法对我很有效。当我使用 driver.close 并没有切回旧窗口时,新打开的标签页并没有关闭 [我仍然不知道原因是什么]。
driver.execute_script("window.open('');") # Open an empty tab
driver.switch_to.window(driver.window_handles[1]) # Switch to that tab (given you only have two tabs)
driver.get(new_tab_url) # Open url in the new tab
# Do your stuff here###

####################### 
driver.close() # close the new tab
driver.switch_to.window(driver.window_handles[0]) #This step is also important, go back to your old tab (given you have only two tabs)

为什么在使用close()之后需要切换选项卡?我不理解那部分的工作原理。 - undefined
如果你有多个窗口打开,比如0、1、2、3(1是从0打开的)。当你关闭时,你会在1号窗口。你可能会切换到2号窗口而不是0号窗口。我不确定也没有去检查,所以我使用了这个方法。你可以跳过这一步,看看会发生什么,然后决定相应地更改代码。如果你这样做,请在这里进行编辑。 - undefined

0

在我看来,以上所有答案都没有确切地解决原始问题,即关闭窗口中的一个标签页而不是关闭整个窗口或打开一个空白标签页。

我的解决方案:

browser.switch_to.window("tab1") #change the tab1 to the id of the tab you want to close
browser.execute_script("window.close('','_parent','');")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接