You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Stripe字段程序化访问权限及Selenium测试无法交互Stripe定价表的问题

Stripe字段程序化访问权限及Selenium测试无法交互Stripe定价表的问题

你遇到的问题确实和Stripe元素的iframe嵌套有直接关系!Stripe的定价表、支付表单这类组件都会加载在独立的专属iframe里,而且如果页面上存在多个iframe的话,你之前用//iframe这种模糊定位方式很容易命中错误的iframe,导致后续无法找到目标元素。下面给你一步步拆解解决方案:

一、核心问题分析

  1. Stripe的定价表iframe有专属标识(比如src包含stripe.com/pricing-table),不能直接抓取页面第一个iframe;
  2. 点击定价表按钮后弹出的支付表单,是另一个动态加载的Stripe iframe,同样需要精准定位;
  3. Stripe的组件class(比如.PriceColumn)可能是动态生成的,稳定性不足,建议用更可靠的定位方式(比如data-testid属性)。

二、具体修复步骤

1. 精准定位Stripe定价表的iframe

先运行你注释掉的那段打印iframe信息的代码,确认Stripe定价表iframe的src、id或name属性(通常会包含stripe.com/payments/pricing-table这类特征)。然后把步骤5的iframe定位改成精准匹配:

# 5. 等待并切换到Stripe定价表的专属iframe(精准匹配)
WebDriverWait(self.driver, 10).until(
    EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR, "iframe[src*='stripe.com/pricing-table']"))
)

2. 替换不稳定的元素选择器

Stripe的.PriceColumn可能不是稳定的选择器,建议在切换到定价表iframe后,先打印页面元素信息,找更可靠的定位标识(比如data-testid)。例如如果订阅按钮有data-testid="pricing-table-submit-button",就用这个定位:

# 6. 点击定价表中的订阅按钮(用更稳定的选择器)
WebDriverWait(self.driver, 10).until(
    EC.element_to_be_clickable((By.CSS_SELECTOR, "[data-testid='pricing-table-submit-button']"))
).click()

3. 精准定位支付表单的iframe

点击订阅按钮后,Stripe会动态加载支付表单的iframe,同样要精准定位,它的src通常包含stripe.com/payments/payment-element:

# 8. 等待并切换到Stripe支付表单的专属iframe
WebDriverWait(self.driver, 10).until(
    EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR, "iframe[src*='stripe.com/payments/payment-element']"))
)

4. 支付表单元素的定位优化

Stripe的支付表单元素(比如卡号输入框)建议用data-testid定位,避免动态id的问题:

# 9. 填写支付详情(Stripe测试元素的稳定定位)
WebDriverWait(self.driver, 10).until(
    EC.visibility_of_element_located((By.CSS_SELECTOR, "[data-testid='card-number-element'] input"))
).send_keys("4242424242424242")

三、完整修改后的测试代码示例

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


class TestSIGNUP():
    def setup_method(self, method):
        self.options = webdriver.ChromeOptions()
        self.driver = webdriver.Chrome(options=self.options)
        self.vars = {}

    def teardown_method(self, method):
        self.driver.quit()

    def test_sIGNUP(self):
        try:
            # 1. 导航到本地服务
            self.driver.get("http://localhost:8000/")
            self.driver.set_window_size(1680, 1025)

            # 2. 点击注册按钮
            self.driver.find_element(By.LINK_TEXT, "Sign Up").click()

            # 3. 填写注册表单
            self.driver.find_element(By.ID, "id_email").send_keys("some_email@gmail.com")
            self.driver.find_element(By.ID, "id_password1").send_keys("as;dlfjkasj4asdf")
            self.driver.find_element(By.ID, "id_first_name").send_keys("Bill")
            self.driver.find_element(By.ID, "id_last_name").send_keys("asdfkj")
            self.driver.find_element(By.ID, "id_terms_agreement").click()
            self.driver.find_element(By.CSS_SELECTOR, ".btn").click()

            # 4. 导航到订阅页面
            self.driver.find_element(By.CSS_SELECTOR, ".nav-item:nth-child(2) .is-hidden-tablet-only").click()

            # 5. 等待并切换到Stripe定价表iframe(精准匹配)
            WebDriverWait(self.driver, 10).until(
                EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR, "iframe[src*='stripe.com/pricing-table']"))
            )

            # 6. 点击定价表中的订阅选项(用稳定选择器)
            WebDriverWait(self.driver, 10).until(
                EC.element_to_be_clickable((By.CSS_SELECTOR, "[data-testid='pricing-table-column']"))
            ).click()
            WebDriverWait(self.driver, 10).until(
                EC.element_to_be_clickable((By.CSS_SELECTOR, "[data-testid='pricing-table-submit-button']"))
            ).click()

            # 7. 切回默认页面
            self.driver.switch_to.default_content()

            # 8. 等待并切换到Stripe支付表单iframe
            WebDriverWait(self.driver, 10).until(
                EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR, "iframe[src*='stripe.com/payments/payment-element']"))
            )

            # 9. 填写支付详情(Stripe测试元素的稳定定位)
            WebDriverWait(self.driver, 10).until(
                EC.visibility_of_element_located((By.CSS_SELECTOR, "[data-testid='email-element'] input"))
            ).send_keys("some_email@gmail.com")
            
            # 卡号输入框
            card_input = WebDriverWait(self.driver, 10).until(
                EC.visibility_of_element_located((By.CSS_SELECTOR, "[data-testid='card-number-element'] input"))
            )
            card_input.send_keys("4242424242424242")
            
            # 有效期
            exp_input = WebDriverWait(self.driver, 10).until(
                EC.visibility_of_element_located((By.CSS_SELECTOR, "[data-testid='card-expiry-element'] input"))
            )
            exp_input.send_keys("0934")
            
            # CVC
            cvc_input = WebDriverWait(self.driver, 10).until(
                EC.visibility_of_element_located((By.CSS_SELECTOR, "[data-testid='card-cvc-element'] input"))
            )
            cvc_input.send_keys("123")
            
            # 账单姓名
            name_input = WebDriverWait(self.driver, 10).until(
                EC.visibility_of_element_located((By.CSS_SELECTOR, "[data-testid='billing-name-element'] input"))
            )
            name_input.send_keys("MAX")

            # 10. 提交支付
            WebDriverWait(self.driver, 10).until(
                EC.element_to_be_clickable((By.CSS_SELECTOR, "[data-testid='submit-button']"))
            ).click()

        except Exception as e:
            print(f"An error occurred: {e}")
            # 可选:截图保存错误状态
            self.driver.save_screenshot("error_screenshot.png")
        finally:
            self.driver.quit()

额外提示

  1. 始终用WebDriverWait等待元素,不要用time.sleep(),保证测试稳定性;
  2. 如果不确定iframe或元素的定位,先在浏览器控制台用document.querySelectorAll("iframe")查看所有iframe属性,或者在Selenium中切换到iframe后打印页面源码,确认元素真实属性;
  3. 确保使用Stripe官方提供的测试数据(比如4242 4242 4242 4242是有效的测试卡号)。

备注:内容来源于stack exchange,提问作者md12

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 09:09:28