在遍历父母时检查与子元素相关的条件-量角器

问题描述

我有一个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');

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

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

我将不胜感激。预先感谢。

解决方法

您的第一个问题可能是您的定位器。过滤无法正常进行,则链接可能会出现问题,element...element.all...first().element()

如果该网址是静态网址,则可以将其用作定位器,并避免所有此类情况

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

第二个可能的问题,单击后,您可能需要等待。否则getCurrentUrl可能会返回原始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存在,而无需断言