剧作家评估功能关闭 Web 浏览器

Playwright evaluate function close the web browser

提问人:LuisM-Hernandez 提问时间:11/18/2023 最后编辑:LuisM-Hernandez 更新时间:11/18/2023 访问量:48

问:

我没有太多经验,但开始使用 playwright,它使用暂停方法手动运行,但是当我自动运行它时,它会快速关闭浏览器。需要注意的是,当我手动执行时,确实需要时间。知道我能做什么吗?

const { test, expect } = require('@playwright/test');

test('has title', async ({ page }) => {


  
  //Opens zillow and log the user in
  await page.goto('https://www.zillow.com');
  // await page.pause();

  // //It closes the google popup
  await page.frameLocator('iframe[title="Sign in with Google Dialog"]').getByLabel('Close').click();
  await page.getByRole('link', { name: 'Sign In' }).click();
  
  //Add your email and password to the fill strings
  await page.getByPlaceholder('Enter email').fill("NEED EMAIL");
  await page.getByPlaceholder('Enter password').fill("NEED PASS");
  await page.getByRole('button', {name: 'Sign in'}).click();
  await page.waitForTimeout(2000);
  
  //Searchbar fill
  await page.getByRole('button', { name: 'Got it!' }).click();
  await page.getByPlaceholder('Enter an address, neighborhood, city, or ZIP code').fill("Chattanooga");
  await page.waitForTimeout(2000);
  await page.getByRole('button', {name: 'Submit Search'}).click();
  await page.waitForTimeout(2000);
  // await page.pause();
  
  const ulElement = await page.$$('.List-c11n-8-84-3__sc-1smrmqp-0.StyledSearchListWrapper-srp__sc-1ieen0c-0.doa-doM.fgiidE.photo-cards.photo-cards_extra-attribution li');
if (ulElement.length > 0) {
 // Process each li element in the array
 for (const liElement of ulElement) {
   const textContent = await page.evaluate(li => li.textContent, liElement);

   if (textContent?.includes('37421')) {
     const button = await liElement.$('button');
     if (button) {
       await button.click();
       console.log('Text content of li element:', textContent);
     }
   }
 }

} else {
 console.log('No li elements found inside the ul with role="list".');
}
});

我尝试添加超时,例如 await page.waitForTimeout(2000);但它不起作用

JavaScript 自动化 剧作家

评论

0赞 ggorlen 11/18/2023
如果没有用户名和密码,即使将代码移动到问题中,它仍然是不可重现的。
0赞 LuisM-Hernandez 11/18/2023
明白了,谢谢你让我知道,我把代码移到了原来的问题。关于用户名和密码,我使用的是个人用户名和密码,我从那里删除了信息并添加了单词,以便用户可以输入他们的 zillow 帐户,然后它应该运行

答:

0赞 Vishal Aggarwal 11/18/2023 #1

使用 toBeVisible 验证登录/提交后状态,而不是硬编码等待。

toBeVisible 是一个定位器断言,这意味着它将等待并重试对象达到预期状态,直到超时。

注意:您可以根据情况调整超时参数值。

几个用法示例

// A specific element is visible.
await expect(page.getByText('Welcome'+ userName)).toBeVisible({timeout:5000})

// At least one item in the list is visible.
await expect(page.getByTestId('todo-item').first()).toBeVisible()

// At least one of the two elements is visible, possibly both.
await expect(
    page.getByRole('button', { name: 'Sign in' })
        .or(page.getByRole('button', { name: 'Sign up' }))
        .first()
).toBeVisible()

更多提示:

  1. 不要使用硬编码的等待,而是使用定位器断言,因为它们是动态的,不会不必要地等待。
  2. 不要使用 $$ 来识别对象,使用定位器作为其动态,这样您就不会遇到“过时元素引用错误”之类的问题(如果您来自硒世界,您会理解它!
  3. 不要使用像“length”这样的JS级别属性,而是使用像count这样的剧作家API方法来获得更可靠和一致的结果。

评论

0赞 LuisM-Hernandez 11/25/2023
感谢你们俩的帮助。在阅读了你的两个答案后,我做了更多的挖掘,我发现我的问题是剧作家有一个内置的 3 秒时间限制。我必须添加一个test.setTimeout(200000);它现在运行良好。