【问题标题】:Selenium not able to open new Window/TabSelenium 无法打开新窗口/选项卡
【发布时间】:2018-10-31 07:58:29
【问题描述】:

我目前正在尝试使用 selenium 抓取网站。 我有一个包含元素的表格,我想单击每个元素,在新窗口/选项卡中打开链接,处理此窗口/选项卡,关闭它并单击下一个元素等。到目前为止,我可以单击表,打开链接并处理页面。 很遗憾,我无法在新窗口或标签中打开链接。

我无法向元素发送键盘命令。 我也试过了

action = ActionChains(self.driver)
    action.move_to_element(ele)\
    .key_down(Keys.SHIFT)\
    .click(ele)\
    .key_up(Keys.SHIFT)\
    .perform()

这以某种方式仅在当前窗口中打开链接(我没有得到新的窗口句柄,仍然只有一个)。 如果有任何帮助,我将不胜感激。

编辑:我也无法使用浏览器手动打开新窗口/标签中的链接。

【问题讨论】:

  • 我没有看到您使用 CTRL+T 打开选项卡?
  • 但是我必须向元素发送 CTRL+T 对吗?我无法向元素发送键盘命令。我收到错误消息:消息:未知错误:无法聚焦元素。我试过 element.send_keys(Keys.CONTROL + 'T')
  • 该错误是因为您失去了页面的焦点。使用 driver.WebDriverWait(driver,10).until(EC.presence_of_element_located(By.CLASS_NAME,'classname'))
  • 我尝试了以下方法: id = ele.get_attribute('id') ele=WebDriverWait(self.driver,10).until(EC.presence_of_element_located((By.ID,id))) ele .send_keys(Keys.CONTROL + 'T') 我仍然收到无法聚焦元素错误。 ele 被作为参数发送给函数。
  • @Prany 他正在尝试使用 SHIFT+ 在新选项卡中打开链接,而不是使用 CTRL+T。当您使用 CTRL+T 时,它会打开一个没有 URL 的新选项卡。他必须获取 URL(如果可能),然后将其发送到新标签。

标签: python selenium web-crawler


【解决方案1】:

访问 URL,例如https://www.google.co.in 然后点击一个元素,例如link with text 作为 Gmail 在新窗口/标签中打开链接,您可以按照以下解决方案使用 action_chains 类:

  • 代码块:

    from selenium import webdriver
    from selenium.webdriver.support.wait import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.action_chains import ActionChains
    from selenium.webdriver.common.keys import Keys
    
    options = webdriver.ChromeOptions() 
    options.add_argument("start-maximized")
    options.add_argument('disable-infobars')
    driver=webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
    driver.get('https://www.google.co.in')
    print("Page Title is : %s" %driver.title)
    mail_link = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.LINK_TEXT, "Gmail")))
    ActionChains(driver).key_down(Keys.CONTROL).click(mail_link).key_up(Keys.CONTROL).perform() 
    
  • 浏览器快照:

【讨论】:

  • 我找到了一种不同的方法来解决我的问题。显然不可能在新窗口/标签中打开我的链接。该网站是 javascript 生成的,链接位于动态 javascript 表中。我想也许让它在新窗口/标签中打开链接的唯一方法是发送一个 javascript 脚本。
  • @MiepMiep 即使link is in a dynamic javascript table 也没有关系,因为我们已经有一个服务员。粗略的你也可以使用_javascript_。但是我的解决方案是通过 ActionChains 在您的代码试验之后构建的
【解决方案2】:

由于 Gmail 是一个“a”标签,首先获取如下标签并执行操作链

from selenium.webdriver.common.action_chains import ActionChains
gmailtag = webdriver.find_element_by_xpath('path to gmail') # you can use any other methods to get it.

#Now you can run this to open the gmailtag in a new tab
ActionChains(webdriver).key_down(Keys.CONTROL).click(gmailtag).perform()

# this also worked for me
gmailtag.send_keys(Keys.CONTROL+Keys.ENTER)

它将在新标签页中打开 Gmail。它对我有用。

【讨论】: