微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Stripe CardElement 在 Playwright 测试中无法呈现

如何解决Stripe CardElement 在 Playwright 测试中无法呈现

我有一个 React 应用程序,其中包含一个使用 Stripe Elements 的简单信用卡表单,如下所示:

import { Elements,CardElement } from '@stripe/react-stripe-js';

function CardForm() {
  const [stripe,setStripe] = useState(null);

  useEffect(() => {
    setStripe(Stripe(<stripe_key>));
  });

  return (
    <div>
      <script src="https://js.stripe.com/v3/" />
      <Elements stripe={stripe}>
        <CardElement />
      </Elements>
    </div>
  );
}

我还使用 Playwright 在无头 Chromium 浏览器中对我的应用程序运行 e2e 测试。其中一项测试填写信用卡表格。部分测试如下所示:

const frames = page.frames();

// Find the stripe credit card iframe
const cardFrame = find(f => f._name.startsWith('__privateStripeFrame')(frames);

await cardFrame.fill(
  '[data-elements-stable-field-name="cardNumber"]',card.number
);
await cardFrame.fill(
  '[data-elements-stable-field-name="cardExpiry"]',`${card.exp_month}/${card.exp_year}`
);
await cardFrame.fill(
  '[data-elements-stable-field-name="cardCvc"]',card.cvc
);
await cardFrame.fill(
  '[data-elements-stable-field-name="postalCode"]','12345'
);

当我在本地(在无头模式下)运行我的测试时,一切正常,并且 Stripe CardElement iframe 加载并成功填充。但是,当我在 Github Actions 中将测试作为工作流运行时,iframe 无法呈现。即使我等待 10 秒以上,iframe 也永远不会加载。我在调用 useEffectsetStripe 中遇到某种错误,但所有日志都是 JSHandle@error。我认为从不同的域加载 Stripe 脚本可能是一个问题,所以我在浏览器设置中添加了一堆参数,正如一些类似的帖子所建议的那样:

browser = await chromium.launch({
  headless: IS_HEADLESS,chromiumSandBox: false,args: [
    '--no-sandBox','--disable-setuid-sandBox','--disable-web-security','--disable-features=IsolateOrigins,site-per-process','--disable-site-isolation-trials','--allow-running-insecure-content','--ignore-certificate-errors','--allow-insecure-localhost'
  ]
});

但是这些都没有解决问题。同样,这只发生在 CI 中,永远不会在本地重现。我为 CI 测试启用了屏幕录制,以准确查看正在发生的事情,而 CardElement iframe 从不呈现。

编辑:

我还尝试将 stripe 作为模块包含,而不是使用 loadStripe 将其作为脚本包含。当我这样做时,CardElement 确实成功加载,但是当我尝试使用成功输入的卡片信息创建令牌时,createtoken 函数永远挂起。这是我的基本功能

import { loadStripe } from '@stripe/stripe-js';

const stripe = loadStripe(<stripe_pk>);

async function generateCardToken(card) {
  const res = await (await stripe).createtoken(card);

  return res;
};

同样,这个函数在本地运行没有任何问题,在 Playwright 测试中也没有任何问题,所以我认为 generateCardToken 函数没有问题。它只是在 Github Actions 中运行 Playwright 测试时挂起。在这种情况下,createtoken 调用也不会抛出错误,它只是永远挂起等待返回响应。

在这里提供任何帮助,我们将不胜感激。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。