提问人:LuisM-Hernandez 提问时间:11/18/2023 最后编辑:LuisM-Hernandez 更新时间:11/18/2023 访问量:48
剧作家评估功能关闭 Web 浏览器
Playwright evaluate function close the web browser
问:
我没有太多经验,但开始使用 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);但它不起作用
答:
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()
更多提示:
- 不要使用硬编码的等待,而是使用定位器断言,因为它们是动态的,不会不必要地等待。
- 不要使用 $$ 来识别对象,使用定位器作为其动态,这样您就不会遇到“过时元素引用错误”之类的问题(如果您来自硒世界,您会理解它!
- 不要使用像“length”这样的JS级别属性,而是使用像count这样的剧作家API方法来获得更可靠和一致的结果。
评论
0赞
LuisM-Hernandez
11/25/2023
感谢你们俩的帮助。在阅读了你的两个答案后,我做了更多的挖掘,我发现我的问题是剧作家有一个内置的 3 秒时间限制。我必须添加一个test.setTimeout(200000);它现在运行良好。
评论