如果在已经打开的网页里面,我点击了一个链接,这个链接在新的标签页打开,如何能得到新的标签页其返回的数据收发数据。

发布于:2024-07-05 ⋅ 阅读:(22) ⋅ 点赞:(0)

要在已打开的网页中点击一个链接并在新标签页中打开,然后捕获新标签页中的所有HTTP请求和响应,你可以使用Selenium库结合selenium-wire插件。下面是一个示例代码,展示了如何实现这一功能:

 

```python

import json

from selenium import webdriver

from selenium.webdriver.common.keys import Keys

from selenium.webdriver.chrome.service import Service

from selenium.webdriver.chrome.options import Options

from selenium.webdriver.common.by import By

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC

from selenium_wire import webdriver as wire_webdriver

 

# 设置ChromeDriver路径

service = Service('path/to/chromedriver')

 

# 配置Chrome选项

chrome_options = Options()

# 如果需要无头模式,取消注释以下行

# chrome_options.add_argument('--headless')

 

# 使用selenium-wire初始化WebDriver

driver = wire_webdriver.Chrome(service=service, options=chrome_options)

 

try:

    # 打开初始页面

    driver.get('https://www.example.com')

 

    # 等待页面加载完成

    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, 'body')))

 

    # 假设我们要点击的链接的CSS选择器为'a.new-tab-link'

    link = driver.find_element(By.CSS_SELECTOR, 'a.new-tab-link')

 

    # 使用JavaScript在新标签页中打开链接

    driver.execute_script("window.open(arguments[0]);", link.get_attribute('href'))

 

    # 切换到新打开的标签页

    driver.switch_to.window(driver.window_handles[-1])

 

    # 等待新页面加载完成

    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, 'body')))

 

    # 捕获新页面的所有请求

    for request in driver.requests:

        if request.method == 'GET' and request.response.status_code == 200:

            try:

                response_json = json.loads(request.response.body.decode('utf-8'))

                print(f"Request URL: {request.url}")

                print("Response JSON:")

                print(json.dumps(response_json, indent=4))

            except json.JSONDecodeError:

                pass

 

finally:

    # 清理资源

    driver.quit()

```

 

但是,上面的代码有一个问题,那就是它直接使用`window.open`方法在新标签页中打开链接,而这种方法并不会触发Selenium的监听,因此你不会捕捉到新标签页中的任何请求。为了真正解决这个问题,你应该使用`link.send_keys(Keys.CONTROL + '\n')`来模拟用户按Ctrl+N的行为,或者使用`Keys.CONTROL + 't'`来打开新标签页,然后在新标签页中导航到链接的目标URL。然而,这需要更复杂的代码来处理窗口焦点和切换,因为Selenium需要在正确的窗口上下文中才能监听到请求。

 

以下是使用`send_keys`方法在新标签页中打开链接的改进版本:

 

```python

import time

import json

from selenium import webdriver

from selenium.webdriver.common.keys import Keys

from selenium.webdriver.chrome.service import Service

from selenium.webdriver.chrome.options import Options

from selenium.webdriver.common.by import By

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC

from selenium_wire import webdriver as wire_webdriver

 

service = Service('path/to/chromedriver')

chrome_options = Options()

 

driver = wire_webdriver.Chrome(service=service, options=chrome_options)

 

try:

    driver.get('https://www.example.com')

    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, 'body')))

    

    # 假设链接的选择器为'a.new-tab-link'

    link = driver.find_element(By.CSS_SELECTOR, 'a.new-tab-link')

    

    # 在新标签页中打开链接

    original_window = driver.current_window_handle

    link.send_keys(Keys.CONTROL + '\n')

    

    # 等待新标签页加载

    WebDriverWait(driver, 10).until(lambda driver: len(driver.window_handles) > 1)

    

    # 切换到新标签页

    new_window = [window for window in driver.window_handles if window != original_window][0]

    driver.switch_to.window(new_window)

    

    # 等待新页面加载完成

    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, 'body')))

    

    # 捕获新页面的所有请求

    for request in driver.requests:

        if request.method == 'GET' and request.response.status_code == 200:

            try:

                response_json = json.loads(request.response.body.decode('utf-8'))

                print(f"Request URL: {request.url}")

                print("Response JSON:")

                print(json.dumps(response_json, indent=4))

            except json.JSONDecodeError:

                pass

 

finally:

    driver.quit()

```

 

在这个版本中,我们使用`send_keys`来模拟用户在链接上按Ctrl+N的行为,从而在新标签页中打开链接。我们还使用了`WebDriverWait`来等待新标签页的出现,并在新标签页加载完成后才开始捕获请求。这样,我们就能确保所有相关的请求都被捕获到了。

```


网站公告

今日签到

点亮在社区的每一天
去签到