javascript 编剧条件页面.waitForNavigation

vs91vp4v  于 2023-02-28  发布在  Java
关注(0)|答案(3)|浏览(130)

当自动登录时,我点击一个元素,它可能会导致导航到另一个页面,但在密码无效的情况下,它只会在同一页面上显示错误消息,而实际上不会导致导航。
我试过:

await Promise.all([
      this.page.submitButton.click(),
      this.page.waitForNavigation()
    ]);

但是在没有导航的情况下会失败。我想拦截响应,检查登录是否成功/失败,但可能有更明确的方法来做到这一点?

myzjeezk

myzjeezk1#

这段代码应该给予你一个例子,说明如何理解你是停留在同一页还是导航:

await this.page.submitButton.click();

try {
    await this.page.waitForNavigation();
    // if we are here it means login was successful
} catch(e) {
    // if we are here it means login failed
}
1tuwyuhd

1tuwyuhd2#

我认为除了this.page.submitButton.click()之外,您不需要其他代码。
点击功能会等待你的导航。所以你可以在点击后检查你是否在同一个网址。

await this.page.submitButton.click(); // This will wait for a possible navigation

if(this.page.url() == destinationOnValidLogin) {
 // Good login stuff
} else {
 // Login failed
}
wb1gzix0

wb1gzix03#

看起来你对await有两个相互竞争的承诺--一个是出现错误消息,另一个是导航,只有一个最初会解决,因此我们可以使用Promise.any来避免过多的等待或代码分支。

await submitButton.click({
  noWaitAfter: true, // since we are handling potential navigation ourselves
});

// adding custom then callbacks to distinguish between the two
const navigationPromise = page.waitForURL('**').then(() => true);
const errorMessagePromise = messageLocator.isVisible().then(() => false);

const isLoggedIn = await Promise.any([
  navigationPromise,
  errorMessagePromise,
]);

// at this stage we have either new page loaded OR login form with error message displayed

请参阅waitForURL方法的waitUntil选项,以更精确地控制您感兴趣的页面导航事件。

相关问题