使用Selenium Chrome切换到第二个标签页 - About:Blank

-1 投票
2 回答
51 浏览
提问于 2025-04-12 14:22

如何正确切换到第二个标签页?

现在我在一个网站上点击一个链接,这样会打开一个新窗口,但这个标签页显示的是about:blank。

我想在这个页面上做点事情,但Selenium仍然停留在默认的内容上,我该如何切换到下一个窗口呢?

我试着按照这里的文档去做,但自己还是搞不明白,https://www.selenium.dev/documentation/webdriver/interactions/windows

这里输入图片描述

这是我现在的代码,但它只检测到一个标签页是打开的,尽管下面的图片显示有两个。

我在第37行收到了一个错误,

wait.until(EC.number_of_windows_to_be(2))
^^^^^^^^^^ AttributeError: 'NoneType' object has no attribute 'until'

from seleniumbase import Driver
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium import webdriver
import time

URL = 'https://www.fedex.com/fedextrack/?trknbr=123456789012&trkqual=2460234000~123456789012~FX'
driver = Driver(uc=True, external_pdf = True)
driver.get(URL)
driver.maximize_window()

# Setup wait for later
wait = time.sleep(2)

# Select Obtain proof button
WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="obtain-proof-link-id"]'))).click()
wait

# Select View PDF button
original_window = driver.current_window_handle
WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '[class="fdx-c-button fdx-c-button--primary fdx-c-button--responsive fdx-u-pt--4 fdx-u-pb--4"]'))).click()

options = webdriver.ChromeOptions()
options.add_experimental_option("prefs", {
  "download.default_directory": r"C:\\Users\\User1\\Downloads\\BPAAS",
  "download.prompt_for_download": True,
  "download.directory_upgrade": True,
  "safebrowsing.enabled": True
})


WebDriverWait(driver, 5).until(EC.number_of_windows_to_be(2))

# Wait for new window to open and switch to it
wait.until(EC.number_of_windows_to_be(2))
for window_handle in driver.window_handles:
    if window_handle != original_window:
        driver.switch_to.window(window_handle)
        break

print(driver.current_url)

driver.quit()

2 个回答

1

下面的代码应该是可以正常工作的。问题在于,你打开了一个包含PDF文件的标签页,但Selenium无法查看这个PDF,因为它不是一个网页。所以如果你想对这个PDF做些什么,就需要使用其他的库。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

url = 'https://www.fedex.com/fedextrack/?trknbr=123456789012&trkqual=2460234000~123456789012~FX'
driver = webdriver.Chrome()
driver.maximize_window()
driver.get(url)

wait = WebDriverWait(driver, 10)

# Click Obtain proof link
wait.until(EC.element_to_be_clickable((By.ID, "obtain-proof-link-id"))).click()

# Click View PDF button
original_window = driver.current_window_handle
wait.until(EC.element_to_be_clickable((By.XPATH, "//button[text()=' View PDF ']"))).click()

# Wait for new window to open and switch to it
wait.until(EC.number_of_windows_to_be(2))
for window_handle in driver.window_handles:
    if window_handle != original_window:
        driver.switch_to.window(window_handle)
        break

# we're now in the new tab, do stuff
1

这是一种比较“hacky”的方法来实现目标,但我用pyautogui这个库让Chrome窗口获得焦点,然后按下Tab键和回车键。虽然这不是最正确的方法,但加上一些错误处理,你可以避免出错或者继续进行。

把这个代码加到第一篇帖子底部,就可以把文件下载到一个目录里。

# hacky way to download the pdf
def find_chrome_window():
    # Find the active Chrome window
    chrome_windows = gw.getWindowsWithTitle('Google Chrome')
    if chrome_windows:
        return chrome_windows[0]
    else:
        return None

def press_tab_and_enter():
    chrome_window = find_chrome_window()
    if chrome_window:
        # Activate Chrome window
        chrome_window.activate()

        # Simulate pressing Tab and Enter keys
        pyautogui.press('tab')
        time.sleep(0.5)  # Add a small delay between Tab and Enter
        pyautogui.press('enter')
    else:
        print("Chrome window not found.")

if __name__ == "__main__":
    press_tab_and_enter()

撰写回答