Utilize Promise.race() in Playwright Typescript to anticipate the appearance of one of two locators

Recently, I've delved into the world of Typescript while exploring Playwright for Test Automation. There's a scenario where two elements - Validated and Failed - can appear after some loading. In Selenium, my go-to method is to use WebDriverWait and stop the loop as soon as either element appears. In Typescript, I came across Promise.race() but couldn't quite get it to work. Here's the snippet from my code:

public waitForFinalStatus = async (): Promise<Boolean> => {     
    const [failed, validated] = await Promise.race([
        this.locFailed().waitFor({ timeout: 120000 }).then(() => "Failed"),
        this.locValidated().waitFor({ timeout: 120000 }).then(() => "Passed")
    ]);

    return validated === "Passed";
}

The values of 'failed' and 'validated' statuses are coming out as "E" and "C", respectively, which I find puzzling. I expected that when 'Passed', the value would be "Passed" and the other one would be undefined.

I also have another query here. Suppose the 'Validated' element appears. After the 120-second wait time, the waitFor on locFailed would fail, triggering an error, right? Without proper try-catch handling, could this disrupt the program flow? In Selenium Java, this issue is dealt with internally by WebDriverWait, which ignores NotFoundException so that exceptions thrown due to element unavailability are managed. From what I understand, if the element isn't found within the specified conditions, waitFor simply throws an error. Can you shed some light on this concept?

Answer β„–1

To ensure visibility, you can utilize the or locator.

await verifyVisibility(locFailed.or(locValidated));

Answer β„–2

Possibly the best solution for your specific issue is provided by hardkoded, although it's important to note that Promise.race doesn't return an array, but rather a Promise that resolves to a single value. In this scenario, using Promise.race would result in either "Failed" or "Passed". The array assignment only retrieves the first two characters of the outcome.

To learn more, you can check out MDN's guide on Promise.race.

Will there be an error thrown when waitFor times out after 120 seconds and locFailed fails since there is no proper try-catch block?

By using Promise.race, all promises are equipped with success and error callbacks. Therefore, if any promises reject, it won't result in an unhandled promise rejection, hence avoiding errors or program disruptions.

In a scenario where locValidated().waitFor() successfully resolves, the Promise generated by Promise.race will also resolve with "Passed". If later on, locFailed().waitFor() rejects, there will be no impact on the process.

Answer β„–3

Consider this scenario where a button is conditionally matched, displaying either "Yes" or "OK", and then being clicked:

await page.getByRole('button', { name: 'Yes' }).or(page.getByRole('button', { name: 'OK' })).click();

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

Can you guide me on implementing AWS SDK interfaces in TypeScript?

Attempting to create an SES TypeScript client using AWS definitions file downloaded from this link My approach so far: /// <reference path="../typings/aws-sdk.d.ts" /> var AWS = require('aws-sdk'); var ses:SES = new AWS.SES(); The error ...

Combine the array elements by date in Angular, ensuring no duplicates are present

How can array data be merged based on the date while avoiding duplicates? See the code snippet below: [ { date: [ '2019-12-02 08:00:00', '2019-12-03 08:00:00' ], upload:["47.93", "47.46", "47.40", "47.29" ], download: ["43.90", ...

The 'data' property is absent in the 'never[]' type, whereas it is necessary in the type of product data

Hello, I am new to TypeScript and I'm struggling with fixing this error message: Property 'data' is missing in type 'never[]' but required in type '{ data: { products: []; }; }'. Here is my code snippet: let medias :[] ...

The TN-Models-FP error message states that it is not allowed to use the `create` model without an associated `entity` model

Utilizing the TN-models-fp library to construct a basic api inspired by the provided examples, here is my implementation in api.ts: import { axios } from '../axios-instance' import { createApi } from '@thinknimble/tn-models-fp' import { ...

Tips for preventing duplicate entries in an AG Grid component within an Angular application

In an attempt to showcase the child as only 3 columns based on assetCode, I want to display PRN, PRN1, and PRN2. Below is the code for the list component: list.component.ts this.rowData.push( { 'code': 'Machine 1', &apo ...

Expanding ngFor in Angular 2

Is it possible to pass two arguments with ngFor? Here is an example that I would like to achieve: <mat-card *ngFor="let room of arr; let floor of floorArr"> <mat-card-content> <h3>Room Number: {{room}}</h3> <p>Floor ...

When validating storage content, session value appears as null

I have been working on developing an Ionic app that requires creating a session for user login. The goal is to store the user's name upon logging in, so it can be checked later if the user is still logged in. I have created a model class and a user cl ...

Error message: The property .match cannot be read as it is undefined (AWS Amplify Build Error)

I'm facing an issue when trying to deploy my React/Typescript app using Amazon's AWS Amplify. The build process keeps failing and the error message says: "Cannot read property .match of undefined". I've gone through numerous discussions, bu ...

Why is my Angular Reactive form not retrieving the value from a hidden field?

I've encountered a problem where the hidden field in my form is not capturing the product id unless I manually type or change its value. It consistently shows as "none" when submitting the form. TS https://i.stack.imgur.com/W9aIm.png HTML https://i. ...

Angular - Dividing Values within Input Arrays

In the input field available to users, they can enter multiple inputs separated by commas. <div class="container"> Enter your values:<input type="text" multiple #inputCheck> <input type="submit"(cli ...

Why does the implementation of my interface differ from what is specified in the TypeScript documentation?

Currently delving into the world of TypeScript documentation https://www.typescriptlang.org/docs/handbook/2/classes.html Specifically focusing on the section implements Clauses, an interesting revelation surfaces: A Word of Caution It’s worth noting t ...

Can you identify the specific function type passed through props?

interface IProps { handleCloseModal: React.MouseEventHandler<HTMLButtonElement> returnFunction: () => void; } export default function Modal({ children, returnFunction, handleCloseModal, }: React.PropsWithChildren<IProps>) { cons ...

The type 'undefined' cannot be assigned to the type 'string | Buffer | { key: string | Buffer; passphrase: string; } | GetPublicKeyOrSecret'

Verification Code for JWT This function is used to verify a jwt using typescript. public verify( token: string, secretOrPublicKey?: string | Buffer, options?: jwt.VerifyOptions ): Promise<object | string> { if (!secretOrPublicKey) { ...

Consistentize Column Titles in Uploaded Excel Spreadsheet

I have a friend who takes customer orders, and these customers are required to submit an excel sheet with specific fields such as item, description, brand, quantity, etc. However, the challenge arises when these sheets do not consistently use the same colu ...

The error message "window is not defined" is commonly encountered in Next

Having some trouble with using apexcharts in a next.js application, as it's giving me an error saying 'window is not defined'. If anyone has any insights or solutions, I would greatly appreciate the help. Any ideas on what could be causing ...

Encountering a ReferrenceError when utilizing jQuery with TypeScript

After transitioning from using JavaScript to TypeScript, I found myself reluctant to abandon jQuery. In my search for guidance on how to integrate the two, I came across several informative websites. Working with Visual Studio 2012, here is my initial atte ...

Error Encountered (TypeError): Unable to access attributes of undefined (attempting to read 'appendChild')

I have been working on creating a choropleth Map of AntV using React.js with functional components. This is the code snippet for my chart: import DataSet from '@antv/data-set'; import { Chart } from '@antv/g2'; const CustomerByRegion = ...

How to easily deactivate an input field within a MatFormField in Angular

I've come across similar questions on this topic, but none of the solutions seem to work for me as they rely on either AngularJS or JQuery. Within Angular 5, my goal is to disable the <input> within a <mat-form-field>: test.component.h ...

Acquired this as empty

I encountered a strange error message saying "this is null" and I can't figure out what the issue is. Here is my demo on Stackblitz.com with an example code for your reference. Component ngOnInit() { this.getCurrentLocation(); } getCurrentL ...

Exploring the use of Vue and Typescript - encountering the error message "Property ... is not found in type" twice

In my specific case, I believe the error I am encountering may have a different root cause than the common solutions found for it. Configuration-related issues could be at play. Here is the code snippet: export default { data() { return { asy ...