What is the process for incorporating a custom action in TestCafe with TypeScript?

I've encountered an issue while trying to implement a custom action. When running tests with the new custom action, I keep receiving an error stating that my custom action is not recognized as a function.

TypeError: testcafe_1.t.customActions.selectFromDropdown is not a function

Let's start from the beginning. I created a definitions.d.ts file to define the custom action:

//definitions.d.ts
import 'testcafe';
declare global {
    interface CustomActions {
        selectFromDropdown: (dropdownSelector: Selector) => TestControllerPromise
    }
}

Next, I added the function implementation in the .testcaferc.ts file:

//.testcaferc.ts
let os = require("os");
import { Selector, ClientFunction, Role, t } from 'testcafe';

module.exports = {
    browsers: ["chrome"],
    src: ["tests/**/*.js", "tests/**/*.feature", "definitions.d.ts", "tests"],
    hostname: "localhost",
    customActions: {
        async selectFromDropdown(dropdownSelector: Selector) {
            await this.click(dropdownSelector);
        }
    }
};

This custom action can be used like this:

await t.customActions.selectFromDropdown(Selector('#dropdownSelector'));

In my test file, I have a simple test scenario where I open a page and invoke the custom action:

//01_basic.ts

import { Selector, ClientFunction, t } from 'testcafe';
import { startPage } from '../../../pages/start-page';


const startSettings = startPage.getStartSettings();

fixture('11-01 - Customercard SMS, functionality')
    .beforeEach(async () => {
        await startPage.selectPage(startPage.customerCardPageButton);   
    });

test('00 - Custom action click', async (t) => {
   t.customActions.selectFromDropdown(Selector('#dropdownSelector'));
})

To run the test, I use the command:

npx testcafe chrome .\tests\01_basic.ts --test "00 - Custom action click" 

If you have any insights on what might be causing this issue, please let me know. I'm still relatively new to TestCafe and TypeScript.

Answer №1

Your TestCafe setup file has the extension *.ts. Keep in mind that TestCafe only supports configuration files with extensions like *.js, *.cjs, and *json. Check out the details here: Configuration File.

If you still prefer using this specific extension for your setup file, make sure to pre-compile it before running tests. Also, please note that TestCafe will only read the configuration file if it's named .testcaferc and located at the root of your repository. Otherwise, you'll need to manually specify the path to the configuration file using the --config-file option.

Similar questions

If you have not found the answer to your question or you are interested in this topic, then look at other similar questions below or use the search

Issue: The inject() function can only be executed within an injection context. Issue: An untruthy value was expected to be truth

I'm currently in the process of setting up a unit test for my app.component. I've imported all the necessary components, but I keep encountering an error that's puzzling me. I activated "preserveSymlinks": true in my angular.json file, but t ...

Encountering challenges with reusing modules in Angular2

I am currently working on an angular2 website with a root module and a sub level module. However, I have noticed that whatever modules I include in the root module must also be re-included in the sub level module, making them not truly reusable. This is w ...

Tips for fixing TypeScript compiler error TS2339: Issue with accessing 'errorValue' property in Angular 5 project

Within a component, I have developed a function to manage errors returned from a Rest Service and determine the corresponding error message to display to the user. This method accepts an error object (custom data structure from the service), navigates to e ...

You need to provide 1 type argument(s) for the Generic type ModuleWithProviders<T> in Angular 10 Swagger Codegen

Currently, I am generating Codegen proxies using . Upon implementing this in Angular 10, I encountered the following error. How can this issue be resolved? The error message reads: 'Generic type 'ModuleWithProviders' requires 1 type argume ...

Is it possible to use Array.map within a template literal to dynamically generate CSS rules for multiple media queries?

In this scenario, I am attempting to iterate through props to generate css rules for multiple media queries. How to Use <FlexContainerExperimental direction="column" mediaQueries={[ {mediaQueryMinWidth: props.theme.minWidthLargeDevice, ...

How can nested json be sorted effectively based on two specific fields?

Example Data: [{ 'ID': objID(abc123), 'Department': 'IT', 'Employees': [ { 'ID': 3, 'StartDate': '24-12-2022T08:30', 'active': true }, { ...

How to set the type of an object property to a string based on a string from an array of strings in TypeScript

Great { choices: ['Bob', 'Chris', 'Alice'], selectedChoice: 'Alice', } Not So Good { choices: ['Bob', 'Chris', 'Alice'], selectedChoice: 'Sam', } I've been exp ...

developing a collection of Material UI text fields

My goal is to construct an accordion containing several textfield mui-components. I have developed a unique render function incorporating all the essential tags and syntax for creating a text field component. Now, I am looking to generate an array of text ...

Create duplicates of both the array and its individual elements by value

I'm having trouble figuring out how to properly copy an array along with all its elements. In my model, I have a name and options, both of which are strings. This is what I currently have: const myArrayToDuplicate = [myModel, myModel, myModel] My ...

The type '{ }' does not include the properties 'params', 'isExact', 'path', 'url' from the 'match<Identifiable>' type

Currently, I am utilizing react router and typescript in order to extract the id variable from a route for use in a component. However, typescript is raising an issue: The type '{}' lacks the following properties found in type 'match' ...

Combining Vue-Test-Utils with TypeScript typings for wrapper.vm

So, I ran into an interesting situation. Has anyone ever worked with typescript + vue-test-utils and attempted to change a value for testing purposes like this: wrapper.vm.aCoolRefValueToManipulate = 'something much cooler'? I gave it a shot, a ...

The specified type '{ state: any; dispatch: React.Dispatch<{ type: string; value: any; }>; }' is not compatible with the expected type

I've been working on a UI layout that includes checkboxes on the left, a data table on the right, and a drop zone box. The aim is to keep the table data updated whenever a new file is dropped, and also filter the data based on checkbox selection. I ma ...

Guide to accessing nested form controls within an array and object in Angular Reactive Forms

As a newcomer to Angular, I am in the process of creating a complex form for a food delivery application that I have been developing. The form I am currently working on is designed to allow me to add a new menu item to a restaurant's menu. In this A ...

The feature of getDisplayMedia is not included in TypeScript 3.8

I am currently developing a .Net Core/Angular 8 application in Visual Studio. Within the Angular (ClientApp) section of my project, I have TypeScript 3.5.3 located in node_modules, which includes the following definition in lib.dom.d.ts: interface Navigat ...

``So, you're looking to retrieve a collection of objects that have a OneToMany

Is there a way to retrieve a list of objects with a OneToMany relation using TypeORM's queryBuilder? This is the desired output: { "id": 1, "firstName": "Bob", "lastName": "Sparrow", "orders": [ { "id": 1, "name": "Very Big Or ...

What is a creative way to design a mat-radio-group without traditional radio buttons?

I am looking to create a component that offers users a list of selections with the ability to make only one choice at a time. The mat-radio-group functionality seems to be the best fit for this, but I prefer not to display the actual radio button next to t ...

Angular - Display shows previous and current data values

My Angular application has a variable called modelResponse that gets updated with new values and prints them. However, in the HTML, it also displays all of its old values along with the new ones. I used two-way data binding on modelResponse in the HTML [( ...

Error message displaying Angular Service not able to be injected into component: StaticInjectorError in AppModule

I'm currently attempting to inject a SpotifyService service into a SearchComponent component, where the service requires Http as a parameter. Below is my module setup: @NgModule({ imports: [ BrowserModule, FormsModule, RouterModule ], decla ...

Tips on changing the name of a property within an object using JavaScript

While this question may appear to be a duplicate, there is actually a distinction. I am attempting to provide a new key that does not contain any spaces. {order_id :"123" , order_name : "bags" , pkg_no : "00123#"} My goal is ...

Avoid altering the background color when adjusting the scale view on an apex chart due to changes in graph data

I have developed Apexchart components for line charts that come with a date filter picker feature. This chart is interactive and changes dynamically based on the series data provided. function DisplayChart({ series, xaxis }: { series: any; xaxis?: any }) ...