剧作家脚本在循环元素时超时
Playwright script timing out when looping through elements
我收到一个错误:Timeout of 30000ms exceeded.
我如何与剧作家合作才不会超时?如果可能的话,我不想增加超时时间。代码循环遍历 <a href
的大列表,确保没有死的 link 和其他不需要的内容。它按预期工作,只是在 link 检查的前 30 秒后它崩溃了。我只能检查前 15 links 左右。
--snip--
test("Test all links do not 404", async ({ page }) => {
const genericTests = new GenericTests(page);
//await page.setDefaultTimeout( 1000 * 60 * 5 ); (changing the timeout here did not work)
await genericTests.testAllLinks()
});
export class GenericTests {
--snip--
async testAllLinks() {
let context = await this.page.context();
//await context.setDefaultTimeout( 1000 * 60 * 5 ); (changing the timeout here did not work)
let allLinks = this.page.locator("a[href]");
let allLinksCount = await allLinks.count();
for(var i=0; i<allLinksCount; i++) {
let nthLink = await this.allLinks.nth(i);
//snip logic to verify the link, deal with duplicates etc..
let [newPage] = await Promise.all([
context.waitForEvent("page"),
nthLink.click({"modifiers": ["Control"], "force": true})
]);
//await newPage.setDefaultTimeout( 1000 * 60 * 5 ); (changing the timeout here did not work)
await newPage.waitForLoadState();
await newPage.bringToFront();
const page404 = new Page404(newPage);
page404.testPageForVariousProblems();
//snip logic to check for 404s
}
}
}
这里有两个超时..
示例中显示的超时不相关,因为每个浏览器实例和每个导航都在快速执行并且没有超时,整体测试和整体测试套件超时。
有一个可以在第一个代码块中更改的每次测试超时:
test("Test all links do not 404", async ({ page }) => {
test.setTimeout(0); // <-- here
--snip--
这也可以全局更改(见下文),但对于这种特殊情况,这最有意义。
并且 playwright.config.ts 中的所有测试都有一个全局设置:
// playwright.config.ts
import { PlaywrightTestConfig } from '@playwright/test';
const config: PlaywrightTestConfig = {
timeout: 30000
,globalTimeout: 600000 // <-- entire test suite
--snip--
};
export default config;
代码执行良好,无需额外说明代码“按预期工作”以及问题中所述。
通常情况下,添加额外的超时时间并不是一个好主意,测试应该在 30 秒内完成。但对我有用的是 -
test.describe('Failover tool', async () => {
test('my pet test', async ({ failoverClusterUpdatesPage }) => {
test.setTimeout(0);
await whateverTest();
});
});
在超时中传递 0 将覆盖现有的 30 秒限制并将其设置为无限期。
我收到一个错误:Timeout of 30000ms exceeded.
我如何与剧作家合作才不会超时?如果可能的话,我不想增加超时时间。代码循环遍历 <a href
的大列表,确保没有死的 link 和其他不需要的内容。它按预期工作,只是在 link 检查的前 30 秒后它崩溃了。我只能检查前 15 links 左右。
--snip--
test("Test all links do not 404", async ({ page }) => {
const genericTests = new GenericTests(page);
//await page.setDefaultTimeout( 1000 * 60 * 5 ); (changing the timeout here did not work)
await genericTests.testAllLinks()
});
export class GenericTests {
--snip--
async testAllLinks() {
let context = await this.page.context();
//await context.setDefaultTimeout( 1000 * 60 * 5 ); (changing the timeout here did not work)
let allLinks = this.page.locator("a[href]");
let allLinksCount = await allLinks.count();
for(var i=0; i<allLinksCount; i++) {
let nthLink = await this.allLinks.nth(i);
//snip logic to verify the link, deal with duplicates etc..
let [newPage] = await Promise.all([
context.waitForEvent("page"),
nthLink.click({"modifiers": ["Control"], "force": true})
]);
//await newPage.setDefaultTimeout( 1000 * 60 * 5 ); (changing the timeout here did not work)
await newPage.waitForLoadState();
await newPage.bringToFront();
const page404 = new Page404(newPage);
page404.testPageForVariousProblems();
//snip logic to check for 404s
}
}
}
这里有两个超时.. 示例中显示的超时不相关,因为每个浏览器实例和每个导航都在快速执行并且没有超时,整体测试和整体测试套件超时。
有一个可以在第一个代码块中更改的每次测试超时:
test("Test all links do not 404", async ({ page }) => {
test.setTimeout(0); // <-- here
--snip--
这也可以全局更改(见下文),但对于这种特殊情况,这最有意义。
并且 playwright.config.ts 中的所有测试都有一个全局设置:
// playwright.config.ts
import { PlaywrightTestConfig } from '@playwright/test';
const config: PlaywrightTestConfig = {
timeout: 30000
,globalTimeout: 600000 // <-- entire test suite
--snip--
};
export default config;
代码执行良好,无需额外说明代码“按预期工作”以及问题中所述。
通常情况下,添加额外的超时时间并不是一个好主意,测试应该在 30 秒内完成。但对我有用的是 -
test.describe('Failover tool', async () => {
test('my pet test', async ({ failoverClusterUpdatesPage }) => {
test.setTimeout(0);
await whateverTest();
});
});
在超时中传递 0 将覆盖现有的 30 秒限制并将其设置为无限期。