18

我正在尝试使用 selenium for python 在浏览器中打开一个新选项卡或一个新窗口。如果打开新选项卡或新窗口并不重要,重要的是打开浏览器的第二个实例。

我已经尝试了几种不同的方法,但都没有成功。

  1. 切换到一个不存在的窗口,希望它会在找不到所述窗口时打开一个新窗口:

    driver.switch_to_window(None)

  2. 遍历打开的窗口(虽然目前只有一个)

    for handle in driver.window_handles:
        driver.switch_to_window(handle)
    
  3. 试图模拟键盘按键

    from selenium.webdriver.common.keys import Keys
    driver.send_keys(Keys.CONTROL + 'T')
    

特别是这个问题是似乎不可能将密钥直接发送到浏览器,只能发送到这样的特定元素:

driver.find_element_by_id('elementID').send_keys(Keys.CONTROL + 'T')

然而,当这样的命令被发送到一个元素时,它似乎什么都不做。我试图找到页面上最顶层的 HTML 元素并将密钥发送到该元素,但再次遇到了失败:

driver.find_element_by_id('wrapper').send_keys(Keys.CONTROL + 'T')

我在网上找到的另一个版本,无法验证其有效性或缺乏,因为我不确定需要导入的类/模块

act = ActionChains(driver)
act.key_down(browserKeys.CONTROL)
act.click("").perform()
act.key_up(browserKeys.CONTROL)

具有不同语法的非常相似的东西(我不确定其中一个或两个是否是正确的语法)

actions.key_down(Keys.CONTROL)
element.send_keys('t')
actions.key_up(Keys.CONTROL)
4

6 回答 6

24

你如何做这样的事情

driver = webdriver.Firefox() #First FF window
second_driver = webdriver.Firefox() #The new window you wanted to open

根据您要与之交互的窗口,您相应地发送命令

print driver.title #to interact with the first driver
print second_driver.title #to interact with the second driver

对于所有反对的选民:


OP要求“ it is only important that a second instance of the browser is opened.”。这个答案不包括每个人的用例的所有可能要求。下面的其他答案可能适合您的特定需求。

于 2013-06-26T16:44:12.353 回答
18

您可以使用execute_script打开新窗口。

driver = webdriver.Firefox()
driver.get("https://linkedin.com")
# open new tab
driver.execute_script("window.open('https://twitter.com')")
print driver.current_window_handle

# Switch to new window
driver.switch_to.window(driver.window_handles[-1])
print " Twitter window should go to facebook "
print "New window ", driver.title
driver.get("http://facebook.com")
print "New window ", driver.title

# Switch to old window
driver.switch_to.window(driver.window_handles[0])
print " Linkedin should go to gmail "
print "Old window ", driver.title
driver.get("http://gmail.com")
print "Old window ", driver.title

# Again new window
driver.switch_to.window(driver.window_handles[1])
print " Facebook window should go to Google "
print "New window ", driver.title
driver.get("http://google.com")
print "New window ", driver.title
于 2014-07-09T13:52:37.900 回答
9

我建议CTRL + N在 Firefox 上使用命令来减少内存使用量,而不是创建新的浏览器实例。

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

browser = webdriver.Firefox()
body = browser.find_element_by_tag_name('body')
body.send_keys(Keys.CONTROL + 'n')

Dhiraj已经提到了切换和控制窗口的方式。

于 2015-02-27T13:19:20.177 回答
1
driver = webdriver.Chrome()
driver.execute_script("window.open('');")
driver.get('first url')

driver.switch_to.window(driver.window_handles[1])
driver.get('second url')
于 2019-10-16T06:58:24.490 回答
0

在 JavaScript 中,窗口和选项卡之间没有区别。

driver.window_handles认为两者相同。

但是,如果需要打开一个新窗口,有几种方法:(有关所需的导入,请参阅 [3])

  1. 模拟 ctrl+N。在新版本中不起作用。看到这个评论

    (
            ActionChains(driver)
            .key_down(Keys.CONTROL)
            .send_keys('n')
            .key_up(Keys.CONTROL)
            .perform()
            )
    

    或者

    body = driver.find_element_by_tag_name('body')
    body.send_keys(Keys.CONTROL + 'n')
    
  2. 按住 shift 键,然后单击页面上的链接——仅当页面上有任何链接时才有效。

    (
            ActionChains(driver)
            .key_down(Keys.SHIFT)
            .click(driver.find_element_by_tag_name("a"))
            .key_up(Keys.SHIFT)
            .perform()
            )
    

    如果没有,可以创建一个...(修改当前页面!)

    driver.execute_script('''{
        let element=document.createElement("a");
        element.href="about:home";
        element.id="abc"
        element.text="1";
        document.body.appendChild(element);
        element.scrollIntoView();
        }''')
    
    (
            ActionChains(driver)
            .key_down(Keys.SHIFT)
            .click(driver.find_element_by_id("abc"))
            .key_up(Keys.SHIFT)
            .perform()
            )
    

    ...或导航到一个页面。(如果您在会话开始时执行此操作,或者打开一个新选项卡执行此操作并稍后关闭它,这不是问题)

    driver.get("data:text/html,<a href=about:blank>1</a>")
    (
            ActionChains(driver)
            .key_down(Keys.SHIFT)
            .click(driver.find_element_by_tag_name("a"))
            .key_up(Keys.SHIFT)
            .perform()
            )
    

    看起来像一个黑客。

  3. (对于 Firefox)关闭“在选项卡中打开链接而不是新窗口”选项,然后执行window.open().

    设置到在新选项卡中打开浏览器链接,在新窗口中打开外部链接 | Firefox 支持论坛 | Mozilla 支持Browser.link.open_newwindow - MozillaZine 知识库

    browser.link.open_newwindow - 用于 Firefox 选项卡中的链接

    3 = 将新窗口转移到新选项卡(默认)
    2 = 允许链接打开新窗口
    1 = 强制新窗口进入同一选项卡

    此选项应设置为 2。 [2]

    请注意,根据https://github.com/SeleniumHQ/selenium/issues/2106#issuecomment-320238039-permalink 无法使用FirefoxProfile[1]设置选项。

    options=webdriver.FirefoxOptions()
    options.set_preference("browser.link.open_newwindow", 2)
    driver=Firefox(firefox_options=options)
    
    driver.execute_script("window.open()")
    
  4. 对于 Selenium 4.0.0(预发布。目前您可以使用例如安装它pip install selenium==4.0.0b4),可以执行以下操作:

    driver.execute(
        selenium.webdriver.remote.command.Command.NEW_WINDOW,
        {"type": "window"}
    )
    

    取自这个答案的技术。


[1]:在当前版本中,由于某种原因,这有效并设置browser.link.open_newwindow为 2

fp = webdriver.FirefoxProfile()
fp.set_preference("browser.link.open_newwindow", 3)
fp.default_preferences["browser.link.open_newwindow"]=3
fp.DEFAULT_PREFERENCES["browser.link.open_newwindow"]=3
driver=Firefox(firefox_profile=fp)

虽然这使期权价值保持在 3

driver=Firefox()

[2]:如果该值设置为3window.open()将在新选项卡而不是新窗口中打开。

[3]:所有必需的导入:

from selenium import webdriver
from selenium.webdriver import Firefox, FirefoxProfile
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains

[4]:此答案仅涵盖如何打开新窗口。要切换到该新窗口并返回,请使用WebDriverWaitand driver.switch_to.window(driver.window_handles[i])。有关详细信息,请参阅 https://stackoverflow.com/a/51893230/5267751

于 2021-08-18T05:13:19.073 回答
0
 driver.switch_to.new_window()

将打开一个新窗口。

然后你可以在网上搜索

driver.get("https://google.com")
于 2022-02-21T18:56:01.727 回答