遍历父元素时检查与子元素相关的条件 - Protractor

Check condition related to child element while traversing parents - Protractor

我有一个 HTML 片段如下:

...
<div class="show-div account">
  <ul >
    <li>
      <a href="/account/login">Login</a>
    </li>
    <li>
      <a href="/account/register">Register</a>
    </li>
  </ul>
</div>
...

我想检查点击登录按钮后是否点击了登录页面。我从文档中了解到,以下内容应该有效,但不会。

    const loginAction = await accountIcon.element(by.className('show-div')).$('ul').$$('li').filter(async function(elem) {
      const a = elem.element(by.css('a'));
      const attr = await a.getAttribute('href');
      return attr.includes('/account/login');
    }).first().$('a');
    await loginAction.click();
    const url = await browser.getCurrentUrl();
    expect(url).endsWith('/account/login');

我正在使用 "protractor": "7.0.0" 和 Angular 10。这些是由 JHipster 框架自动生成的。我不确定是否需要使用 async/await 机制。考虑到 ElementFinder API,我应该,但大多数示例都没有使用它。

(顺便说一句,SELENIUM_PROMISE_MANAGER 已禁用)

如有任何帮助,我将不胜感激。提前致谢。

您的第一个问题可能是您的定位器。过滤不了,那么链接可能有问题,element...element.all...first().element()

如果 url 是静态的,您可以将其用作定位器,并避免这一切

let elem = $('[href="/account/login"]')

第二种可能的问题,点击后可能需要等待。否则 getCurrentUrl 可能 return 原来的 url 因为它还没有加载新页面。在这种情况下,我可以向您推荐 wait for that url

var EC = protractor.ExpectedConditions;
// Waits for the URL to contain 'foo'.
await browser.wait(EC.urlContains('/account/login'), 15000);

在脚本的这一部分,如果 url 从未出现,它将失败并显示明确的错误,表明 url 不存在。否则,您不需要声明 url。如果脚本通过,这可能会为您提供 url 存在的保证,无需断言