我尝试过各种命令,例如
driver.switch_to_window("_blank")
或者
driver.switch_to_window(None)
但这些都不起作用。这应该怎么做?谢谢。
经过大量的谷歌搜索,我发现了在 Firefox 中对我有用的东西,并且它是如此简单(优雅,也许?)以至于几乎可笑。这里是:
>>> from selenium import webdriver
>>> driver = webdriver.Firefox()
>>> driver.execute_script("window.open('');") <--- JAVASCRIPT!
看看这个问题。好像图书馆不支持标签管理atm。
但评分第二高的答案确实提供了解决方案。我认为您可以轻松地将其转换为 Python。
我已经通过这种方式解决了这个问题:
a_elem = driver.find_element_by_link_text("Link with _blank")
self.driver.get(a_elem.get_attribute('href'))
我遇到了同样的问题,我对找到的其他解决方案并不满意,所以我做了一个上下文管理器来处理。这允许:
with link_in_new_window(driver, link_element):
driver.foo() # this is in the new window opened from the link
driver.foo() # this is back in the original window
..我觉得这很方便。
from contextlib import contextmanager
from selenium.common import exceptions
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
# Fundamentally, this shift-clicks to open a new window, and
# hits ctrl-w to close it when done, using ActionChains.
@contextmanager
def link_in_new_window(driver, element):
"""Open a clickable element in a new window for this context
This opens a clickable element in a new window, and switches
`driver` to that window for the duration of the context.
The window is closed afterward, and the driver switched back
to the original window.
If the 'as' clause is used, the handle of the parent (original)
window is provided as the value.
Selenium doesn't provide a useful interface to firefox's tabs
due to some technical complications, so we use new windows
instead of new tabs. The memory hit isn't too significant.
:type driver: selenium.webdriver.Firefox
:type element: selenium.webdriver.remote.webelement.WebElement
:returns: Parent's Window Handle
"""
known_handles = set(driver.window_handles)
original_handle = driver.current_window_handle
action = ActionChains(driver)
# Open link in new window (shift-click element)
# Sometimes, shift would be ignored. move_to_element helped.
action.move_to_element(element)
.key_down(Keys.SHIFT)
.click(element)
.key_up(Keys.SHIFT)
.perform()
# Find the new window handle. ..anyone know a better way?
timeout = time.time() + 10
new_handles = set(driver.window_handles) - known_handles
while time.time() < timeout and not new_handles:
new_handles = set(driver.window_handles) - known_handles
time.sleep(0.5)
if not new_handles or len(new_handles) != 1:
msg = "Expected one handle, found {}"
raise RuntimeError(msg.format(len(new_handles)), new_handles)
new_handle = new_handles.pop()
driver.switch_to.window(new_handle)
try:
# User code will be executed here
yield original_handle
finally:
# close window, if it still exists (ctrl-w)
try:
driver.switch_to.window(new_handle)
action = ActionChains(driver)
action.key_down(Keys.CONTROL).send_keys('w').perform()
except exceptions.NoSuchWindowException:
pass
# in any case, switch back to the original window
driver.switch_to.window(original_handle)