TestCafe:单页应用程序的页面模型

Posted

技术标签:

【中文标题】TestCafe:单页应用程序的页面模型【英文标题】:TestCafe: Page Models for Single Page Applications 【发布时间】:2021-11-16 09:12:14 【问题描述】:

我一直在努力寻找在 TestCafe 中表示单页应用程序的最佳方式,想知道是否有人可以帮助我?

目前我的结构如下(当然是假页面名称)。为了讨论起见,我在这里大大简化了它,但你应该开始看到的问题是,随着应用程序变得越来越大,主页开始导入越来越多。这些进口中的每一个都有进口,进口可能更多。因此,级联效应导致 TestCafe 在启动测试时急剧变慢。

强制测试本身导入他们使用的所有“部分”是否更有意义?对于涉及多个部分的较长工作流程测试怎么办?那还有意义吗?

任何建议将不胜感激!

import Selector, t from 'testcafe';
import 
    ConsumerSection,
    ManufacturerSection,
    SupplierSection,
    <AndSoOn>
 from './CarPageSections';

export class CarPage extends BasePage 

    // BasePage contains all of the Header, Footer, NavBar, SideBar, Action Flyouts

    CarSelectionTimer: Selector;
    ModelSelectionModal: ModelSelectionModal;
    SomeOtherModal: SomeOtherModal;

    // Section Selectors
    sectionPanels = 
        ConsumerSection: null as ConsumerSection,
        ManufacturerSection: null as ManufacturerSection,
        SupplierSection: null as SupplierSection,
        <AndSoOn>: null as <AndSoOn>
    ;

    sections = 
        ConsumerSection: null as SectionControl,
        ManufacturerSection: null as SectionControl,
        SupplierSection: null as SectionControl,
        <AndSoOn>: null as SectionControl
    ;

    constructor() 
        this.CarSelectionTimer = Selector('#car-selection-timer');

        // Sections
        this.sections = 
            ConsumerSection: new SectionControl('Consumer'),
            ManufacturerSection: new SectionControl('Manufacturer'),
            SupplierSection: new SectionControl('Supplier'),
            <AndSoOn>: new SectionControl('<AndSoOn>')
        ;

        this.sectionPanels = 
            ConsumerSection: new ConsumerSection(this.sections.ConsumerSection.control),
            ManufacturerSection: new ManufacturerSection(this.sections.ManufacturerSection.control),
            SupplierSection: new SupplierSection(this.sections.SupplierSection.control),
            <AndSoOn>: new <AndSoOn>(this.sections.<AndSoOn>.control)
        ;

        this.ModelSelectionModal = new ModelSelectionModal();
        this.SomeOtherModal = new SomeOtherModal();
    

    async SomeActionToPerformOnThePage(params) 
        // DO STUFF
    

    async SomeOtherActionToPerformOnThePage(params) 
        // DO STUFF
    

注意事项:

    具有上述 ConsumerSection(control) 等参数的构造函数。 使用文件导出多个对象/类以简化测试(或其他模型)中的导入。

需要考虑的问题:

    是否应该将每个模型与其他模型分离? 如果没有耦合模型,您如何使其尽可能易于使用?在其他测试框架中,您可以根据给定的方法/操作交还新的页面类型:即 LoginPage.Submit() 返回 HomePage()。

【问题讨论】:

【参考方案1】:

如果没有完整的页面模型,很难确定问题的原因。您的问题与此类似:https://github.com/DevExpress/testcafe/issues/4054。请检查该 Github 线程并应用其中的建议。 如果这没有帮助,请分享您的整页模型。如果你不能在这里分享,你可以发送到 support@devexpress.com

【讨论】:

我对此有几个问题,至少还有一个潜在问题。您如何处理具有带参数的构造函数的类? “导出默认新的 ClassNameHere();”无效,并且参数值在使用之前不会存在: 示例 - 具有多个部分的页面传递父控件选择器以使子选择器更智能。此外,这似乎不允许使用聚合器文件进行导出/导入。那是对的吗?一个文件:export * from 'file1';从'file2'导出*;从'file3'导出*; 建议的解决方案是针对该问题的。看起来您的页面模型和您对页面模型的要求比提到的问题更复杂。所以,也许,解决方法是不合适的。请与我们分享您的测试和页面模型。您可以使用以下链接在我们的 Github 存储库中创建一个单独的问题:github.com/DevExpress/testcafe/issues/… 如果您无法共享您的项目/测试/页面模型,您可以将其发送到 support@devexpress.com

以上是关于TestCafe:单页应用程序的页面模型的主要内容,如果未能解决你的问题,请参考以下文章

了解单页应用

移动Web单页应用开发实践——页面结构化

Vue路由器单页应用,页面是不是应该重新加载?

3.2.8 Google Tag Manager实战指南——虚拟页面跟踪单页应用

vue单页应用在页面刷新时保留状态数据的方法

我在 vuejs 单页应用程序上刷新页面