Java и Selenium - установите переключатель в списке по тексту - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь выбрать записи в списке по тексту. Записи li также имеют идентификаторы, но я бы хотел использовать вместо этого текст.

У меня есть следующий фрагмент HTML-кода:

<fieldset felt id="bosted"
  <ul class="feltliste ng-scope">
    <li> 
      <label id="lblbostedleierKommunalt" for="bostedleierKommunalt" class="label ">
         Leier kommunal bolig
      </label>
    </li>(verdi, tekst) in bostedTyper -->
    <li>
      <label id="lblbostedleierPrivat" for="bostedleierPrivat" class="label ">
         Leier bolig
        <div class="hjelpetekst ng-scope ng-isolate-scope" ng-class="{'hjelpetekst--utvidet': visHjelpetekst}" id="leierPrivat-hjelpetekst " ng-if="verdi === 'LEIER_PRIVAT'">
          <button title="Vis hjelpetekst" type="button" ng-click="visEllerSkjulHjelpetekst($event)" aria-describedby="leierPrivat-hjelpetekst ">
          <span class="bare-skjermleser" translate=""><span class="ng-scope">Vis hjelpetekst</span></span>
          <est-ikon type="sporsmalstegn"><svg focusable="false"><use xlink:href="#ikon-sporsmalstegn"></use></svg>
        </div>

Текстовые записи в приведенном выше примере:

Лейер коммунал болигLeier bolig

Вариант 1: Я пытаюсь сделать это так:

driver.findElement(By.cssSelector("id='bosted' li[text=" + text + "]")).click();

Я пробовал "значение" и другие варианты. Но я продолжаю получать сообщение «Указан неверный или недопустимый селектор».

Вариант 2: Я также пробовал это решение, взятое из ответа на аналогичный вопрос здесь:

List<WebElement> options = bosted.findElements(By.tagName("li"));
    for (WebElement option : options) {
        if (option.getText().equals(bosituasjon)) {
                option.click();
                break;
        }
    }

Кроме того, что я думаю, что это выглядит грязно и не очень элегантно, оно тоже не работает. При просмотре тестового набора кажется, что он пытается щелкнуть запись над целевой записью на странице. (Хотя я не уверен в этом.) Однако он не возвращает никаких ошибок.

Тем не менее, он находит все текстовые записи, и цикл if попадает и выполняет строку option.click ().

Но что-то явно не так, так как он не переходит кзапись списка на странице, и эта опция не выбрана.

Кроме того, если я использую .sendkeys (Keys.ENTER) вместо .click (), я получаю ошибку «элемент не взаимодействует».

Ответы [ 4 ]

0 голосов
/ 07 ноября 2019

Нет опции текста, использующей селектор css. Вместо этого следует использовать Xpath.

driver.findElement(By.xpath("//*[@id='bosted']//li[contains(.,'" + text + "')]")).click()
0 голосов
/ 07 ноября 2019

используйте приведенный ниже настраиваемый xpath, это почти так же быстро, как использование идентификатора или имени класса.

driver.findElement(By.xpath("//label[contains(text(),'Leier kommunal bolig')]")).click();
0 голосов
/ 07 ноября 2019

Селекторы CSS не позволяют выбирать элементы по внутреннему тексту. Вместо этого используйте XPath-селектор.

PS - если вам все еще нужно использовать второй вариант, вам следует обрезать текст перед сравнением. Например, option.getText().trim().equals(bosituasjon), потому что текст в html может принимать сложные формы.

PPS - Если вы считаете, что ваш второй вариант еще недостаточно элегантен, вы можете применить Steam API и сделать свой код похожим наэто:

   List<WebElement> options = bosted.findElements(By.tagName("li"));
   options.stream().filter(i -> i.getText().trim().equals(bosituasjon)).findFirst().get().click();
0 голосов
/ 07 ноября 2019

Вы должны использовать value в своем селекторе, а не text.

driver.findElement(By.cssSelector("id='bosted' li[value=" + text + "]")).click();

В любом случае, вы можете использовать XPath селектор, который использует идентификатор внутри.

driver.findElement(By.xpath("//fieldset[@id = 'bosted']/descendant::li[text() = '" + text + "']")).click();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...