Не удалось найти элемент по частичному тексту ссылки с использованием Java и Selenium

Используя geckodriver 0.23.0, firefox 64.0.2, selenium 3.12, java 8, я не могу найти элемент по частичному тексту ссылки. Рамка не используется. Текст ссылки: «Аккаунты (1)». На странице Просмотр всех учетных записей есть только один экземпляр того же текста.

HTML:

<li>    
      <a href="/accounting/view_all_accounts?_t=039f18daf35b4a00f0093dd17aa70730be385f6f&amp;to_render=account" class="first accounting_page_menu  ">Accounts (1)</a>
      <ul>
        <li>
          <a href="/accounting/details?_t=e3d4ea94f5ed862d95196a620f1147be13b02979&amp;to_render=account" class="first accounting_page_menu ">Primary</a>
        </li>

        <li>
        <a onclick="javascript: ModalUtil.loadEditableModal('/accounting/details_new_account', false, false, true);" class="add-accounts">Add New Account...</a>
        </li>
        <li>
        <a href="/accounting/view_all_accounts?_t=039f18daf35b4a00f0093dd17aa70730be385f6f&amp;to_render=account" class="first accounting_page_menu ">View All Accounts</a>
        </li>
      </ul>
  </li>

Код, который я использую для поиска элемента: «Счета (n)», где n = 1, 2, 3...

driver.findElement(By.partialLinkText("Accounts (")).click();

Я пробовал с "Учетные записи" и с "Учетные записи (", и они оба возвращают один и тот же 404 не найден - такой ошибки элемента нет

Журнал консоли:

1547499923019   webdriver::server   DEBUG   -> POST /session/bed7e7d2-d849-4bd0-ab17-fdca3fb080f9/element {
  "value": "Accounts ",
  "using": "partial link text"
}
1547499923020   Marionette  TRACE   0 -> [0,315,"WebDriver:FindElement",{"using":"partial link text","value":"Accounts "}]
1547499923241   Marionette  TRACE   0 <- [1,315,{"error":"no such element","message":"Unable to locate element: Accounts ","stacktrace":"WebDriverError@chrome://mario ... entError@chrome://marionette/content/error.js:388:5\nelement.find/</<@chrome://marionette/content/element.js:339:16\n"},null]
1547499923240   webdriver::server   DEBUG   <- 404 Not Found {"value":{"error":"no such element","message":"Unable to locate element: Accounts ","stacktrace":"WebDriverError@chrome://marionette/content/error.js:178:5\nNoSuchElementError@chrome://marionette/content/error.js:388:5\nelement.find/</<@chrome://marionette/content/element.js:339:16\n"}}

person Ivana    schedule 15.01.2019    source источник
comment
Если поиск учетных записей по частичному тексту ссылки не работает, значит, что-то не так. Вы пробовали добавить ожидание? Вы уверены, что нет IFRAME? Вы уверены в капитализации?   -  person JeffC    schedule 17.01.2019
comment
Попробуйте запустить $x("//a[.='Accounts (1)']") в консоли разработчика. Находит что-нибудь?   -  person JeffC    schedule 17.01.2019


Ответы (1)


Как вы упомянули, вы пытаетесь найти элемент с текстом как Accounts (n), где n = 1, 2, 3... и еще пару элементов с linkText поскольку Добавить новую учетную запись и Просмотреть все учетные записи существуют, вместо использования partialLinkText было бы лучше использовать XPath, и вы можете использовать следующее решение:

  • XPath:

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//li/a[@class='first accounting_page_menu' and starts-with(@href,'/accounting/view_all_accounts?')][starts-with(.,'Accounts')]"))).click();
    

Обновлять

Согласно обсуждению официальные стратегии поиска для веб-драйвера Селектор текста частичной ссылки предпочтительнее, чем селектор XPath. Однако согласно этому варианту использования из-за наличия похожих текстов ссылок было бы проще построить XPath.

person DebanjanB    schedule 15.01.2019
comment
Хороший ответ ... но лучше ли использовать XPath, чем partialLinkText? - person Moshe Slavin; 16.01.2019
comment
@MosheSlavin Добавил обновление к ответу. Дайте мне знать, если это ответит на ваш встречный вопрос. - person DebanjanB; 16.01.2019
comment
Я видел это обсуждение, поэтому мой ответ и комментарий ... Я должен сказать, что многому у вас учусь!!! Благодарность - person Moshe Slavin; 16.01.2019
comment
Что меня смущает в отношении частичного текста ссылки, так это невозможность найти уникальное имя: ---- Добавить новую учетную запись - не имеет s в конце -> не должно быть обнаружено при поиске «Учетные записи» или «Учетные записи» (« ---- Просмотр Новые Аккаунты – в конце нет пробела -› не следует искать по поиску «Аккаунты» или «Аккаунты» («--- Я что-то здесь пропустил? - person Ivana; 16.01.2019
comment
@Ivana Поскольку ваш целевой текст — Accounts (n), таргетинг на частичный текст Accounts может включать в себя Accounts (1) и View All Accounts оба. С другой стороны, я бы решительно избегал Accounts (, так как ( может вызвать большой хаос в Стратегия поиска. Поэтому я бы рекомендовал xpath или cssSelector. - person DebanjanB; 16.01.2019
comment
@Ivana Проголосуйте за ответ, если этот/любой ответ полезен/был вам полезен для будущих читателей. - person DebanjanB; 17.01.2019