使用Selenium Chrome切换到第二个标签页 - About:Blank
如何正确切换到第二个标签页?
现在我在一个网站上点击一个链接,这样会打开一个新窗口,但这个标签页显示的是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()