【问题标题】:Selenium won't open a new URL in a new tab (Python & Chrome)Selenium 不会在新选项卡中打开新 URL(Python 和 Chrome)
【发布时间】:2016-09-02 11:36:52
【问题描述】:

我想使用 Selenium WebDriver 和 Python 在不同的选项卡中打开很多 URL。

我不确定出了什么问题:

driver = webdriver.Chrome()
driver.get(url1)
time.sleep(5)
driver.find_element_by_tag_name('body').send_keys(Keys.CONTROL+'t')
url2 = 'https://www.google.com'
driver.get(item2)

我查阅了教程,在我看来,这段代码应该可以满足我的需求。实际发生的是浏览器打开,url1 按原样打开,一个新标签按原样打开 url2 然后加载到原始标签而不是新标签(即使新标签似乎活跃的)。

(我正在使用 Chrome,因为在使用 Firefox 时,我根本无法加载任何 URL。Firefox 打开但没有获取请求的 url。我试图找到解决方案,但无济于事。)

我可以在我的代码中更改什么来让新 URL 在新标签页中打开吗?

感谢您的帮助!

【问题讨论】:

    标签: python google-chrome selenium


    【解决方案1】:

    ChromeDriver 中存在一个错误,导致 ctrl/command+T 无法正常工作:

    作为一种解决方法,您可以做的是在新选项卡中打开一个链接,然后使用switch_to.window()切换到新窗口。工作样本:

    from selenium import webdriver
    from selenium.webdriver import ActionChains
    from selenium.webdriver.common.keys import Keys
    
    driver = webdriver.Chrome()
    driver.get("https://www.google.com")
    
    # open a link in a new window
    actions = ActionChains(driver)
    about = driver.find_element_by_link_text('About')
    actions.key_down(Keys.CONTROL).click(about).key_up(Keys.CONTROL).perform()
    
    driver.switch_to.window(driver.window_handles[-1])
    driver.get("https://stackoverflow.com")
    

    现在最后一个driver.get() 将在新打开的选项卡中执行。

    【讨论】:

    • 谢谢,但该错误似乎与 ctrl-t 根本没有打开新标签有关。我可以很好地打开一个新标签,但不能在该标签中加载网址。我试过你的代码,但我可能没有正确理解它。 find_element_by_link 行出现错误(无法定位元素)。我正在加载一个 html 页面(页面源),我不确定这是否会有所不同。
    • @SamH123 好的,在您的情况下,您只需在打开新标签后执行driver.switch_to.window(driver.window_handles[-1])
    【解决方案2】:

    这是一个简单的方法,独立于平台:

    代码:

    driver.execute_script("window.open('http://google.com', 'new_window')")
    

    切换回原来的标签页:

    代码:

    driver.switch_to_window(driver.window_handles[0])
    

    检查当前标题以确保您在正确的页面上:

    代码:

    driver.title
    

    对于其他一切,玩得开心!

    【讨论】:

    • 我正在使用 Chrome 网络驱动程序,它实际上会在新标签页中打开,非常感谢
    • 我正在使用带有 geckodriver 0.24.0 的 Firefox v67.0.4,它会打开一个新窗口,但不是一个新选项卡
    • 如果我想打开 2 个新标签,代码不起作用,它只会打开 1 个新标签。
    • @baermathias,代码是否打开新标签或新窗口取决于用户设置。
    • @SafwanSamsudeen 应该如何配置用户设置?
    【解决方案3】:

    另一种打开新窗口的方法是使用 JavaScript 和窗口处理程序在它们之间切换。

    driver = webdriver.Chrome()
    
    # Open a new window
    # This does not change focus to the new window for the driver.
    driver.execute_script("window.open('');")
    
    # Switch to the new window
    driver.switch_to.window(driver.window_handles[1])
    driver.get("http://stackoverflow.com")
    
    # close the active tab
    driver.close()
    
    # Switch back to the first tab
    driver.switch_to.window(driver.window_handles[0])
    driver.get("http://google.se")
    
    # Close the only tab, will also close the browser.
    driver.close()
    

    如果您在执行时查看浏览器,它将看起来像新窗口具有焦点,但对于 webdriver,它没有。不要被视觉所迷惑。还记得在关闭选项卡时选择一个新的窗口处理程序,因为它会将driver.current_window_handle 设置为

    selenium.common.exceptions.NoSuchWindowException: 
        Message: no such window: target window already closed from unknown error: web view not found
      (Session info: chrome=<Your version of chrome>)
      (Driver info: chromedriver=<Your chrome driver version> (<string of numbers>),platform=<Your OS>)
    

    .close() 上,如果您在该阶段尝试对驱动程序执行操作,它将引发该错误。

    【讨论】:

      【解决方案4】:

      你需要为此最大化你的 chrome

      from selenium import webdriver
      from selenium.webdriver import ActionChains
      from selenium.webdriver.common.keys import Keys
      
      driver = webdriver.Chrome()
      driver.maximize_window()
      driver.get("https://www.google.com/")
      
      e = driver.find_element_by_tag_name("body")
      ActionChains(driver).key_down(Keys.CONTROL).click(e).send_keys("k").key_up(Keys.CONTROL).perform()
      

      这里key_down(Keys.CONTROL) 将按住 ctrl 键,以获取页面我点击页面正文的焦点,然后点击k

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-09-24
        • 2014-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多