SAP 电商云 Spartacus UI set delivery mode HTTP put 请求的触发时机

简介: SAP 电商云 Spartacus UI set delivery mode HTTP put 请求的触发时机

看下面这段代码:

context('Group Skipping - Checkout', () => {
  before(() => {
    cy.requireLoggedIn().then(() => {
      checkout.goToProductDetailsPage();
      checkout.addProductToCart();
      checkout.fillAddressForm();
      cy.get('input[type=radio][formcontrolname=deliveryModeId]:not(:disabled)')
        .first()
        .focus()
        .click();
      checkoutNextStep('/checkout/payment-details');
      checkout.fillPaymentForm();
      cy.get('.cx-review-summary-card');
      cy.saveLocalStorage();
    });
  });

21.png

第39行会触发一个 HTTP Put 请求,其触发时机在这篇文章里可以看到。


下列文字描述了一种竟态情况:

  1. line 39 的代码触发了 HTTP put 请求,修改 delivery mode
  2. line 40 行的代码拿到了 radio input 控件实例。 执行完了 first 和 focus 方法。
  3. 此时 HTTP Put 请求使得 Spinner 控件替代了 radio input 按钮,所以后者 detached from DOM.
  4. 在一个 detached from DOM 状态的元素下执行 click 方法,就会出现本文描述的错误。

解决方案

等 HTTP put 操作成功执行之后,再执行下面代码即可:

cy.get('input[type=radio][formcontrolname=deliveryModeId]')
        .first()
        .focus()
        .click(); 

完整的解决方案:

cy.intercept({
        method: 'PUT',
        path: `${Cypress.env('OCC_PREFIX')}/${Cypress.env(
          'BASE_SITE'
        )}/${Cypress.env(
          'OCC_PREFIX_USER_ENDPOINT'
        )}/current/carts/*/deliverymode?deliveryModeId=*`,
      }).as('setDeliveryMode');
      checkout.fillAddressForm();
      cy.wait('@setDeliveryMode');
      cy.get('input[type=radio][formcontrolname=deliveryModeId]')
        .first()
        .focus()
        .click();
      checkoutNextStep('/checkout/payment-details');
      checkout.fillPaymentForm();
      cy.get('.cx-review-summary-card');
      cy.saveLocalStorage();```

思路就是首先用 cy.intercept 监控 path 参数指定的 HTTP put 请求的 endpoint,使用 as 存储成一个别名,然后调用 cy.wait, 传入别名,等待其执行完毕,再执行接下来的 cy.get().click() 即可。


目录
相关文章
|
11月前
|
缓存 负载均衡 前端开发
SAP Spartacus 和 Sticky session 相关的话题
SAP Spartacus 和 Sticky session 相关的话题
|
11月前
|
存储
SAP Emarsys 和 SAP Spartacus 的集成
SAP Emarsys 和 SAP Spartacus 的集成
|
11月前
|
API 开发者
Google Tag Manager (GTM) 和 Adobe AEPL 在 SAP Spartacus 中的应用
Google Tag Manager (GTM) 和 Adobe AEPL 在 SAP Spartacus 中的应用
|
4月前
|
网络架构 开发者 UED
Spartacus 2211 的 provideOutlet 方法扩展 UI
Spartacus 2211 的 provideOutlet 方法扩展 UI
Spartacus 2211 的 provideOutlet 方法扩展 UI
|
4月前
|
JSON 开发者 数据格式
关于 SAP Spartacus LandingPage2Template 区域的 layout 设计实现
关于 SAP Spartacus LandingPage2Template 区域的 layout 设计实现
|
4月前
|
搜索推荐 开发者 UED
关于 SAP Spartacus 层的 UI 设计
关于 SAP Spartacus 层的 UI 设计
|
4月前
|
开发者 UED
SAP Spartacus BREAKPOINT 枚举类型在 Spartacus layout 实现中的作用
SAP Spartacus BREAKPOINT 枚举类型在 Spartacus layout 实现中的作用
|
11月前
|
JavaScript 容器
关于 SAP Spartacus generic-link component 的模板代码
关于 SAP Spartacus generic-link component 的模板代码
|
11月前
|
前端开发 搜索推荐 JavaScript
什么是 SAP Spartacus 的 CMS Page Connector
什么是 SAP Spartacus 的 CMS Page Connector
|
11月前
|
前端开发 JavaScript API
SAP Commerce Accelerator Storefront 到 Spartacus 的 page by page migration 策略
SAP Commerce Accelerator Storefront 到 Spartacus 的 page by page migration 策略