.$eval is like running document.querySelector
eg:
// html file
<h1 class=".App-title">Hello</h1>// test file
const html = await page.$eval('.App-title', e => e.innerHTML);
expect(html).toBe('Hello');page.waitForSelector('selector') waits for selector loading. It throws node error if not found. This is not valid test case.
I prefer
// test file
const element = await page.$('selector') ? true : false;
expect(element).toBe(true);page.click('selector') clicks the selector
await page.type('selector', data to be typed) types the data into selector input