Java和Selenium-按文本列表中选择单选按钮

我正在尝试按文本在列表中选择条目。 li条目也有id,但是我想改用文字。

我有以下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(),则会收到“元素不可交互”错误。

dubujiewu 回答:Java和Selenium-按文本列表中选择单选按钮

您应该在选择器中使用value,而不是text

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

无论如何,您可以使用内部使用id的XPath选择器。

driver.findElement(By.xpath("//fieldset[@id = 'bosted']/descendant::li[text() = '" + text + "']")).click();
,

使用下面的自定义xpath,几乎和使用id或类名一样快。

[NSApplication sharedApplication]
,

CSS选择器不允许通过内部文本选择元素。请改用XPath选择器。

PS -如果您仍然需要使用第二个选项,则在进行比较之前应修剪文本。像option.getText().trim().equals(bosituasjon)一样,因为html中的文本可能采用复杂的形式。

P.P.S。-如果您认为第二个选项仍然不够优雅,则可以应用steams api并使代码看起来像这样:

   List<WebElement> options = bosted.findElements(By.tagName("li"));
   options.stream().filter(i -> i.getText().trim().equals(bosituasjon)).findFirst().get().click();
,

使用CSS选择器没有文本选项。您应该改用Xpath。

driver.findElement(By.xpath("//*[@id='bosted']//li[contains(.,'" + text + "')]")).click()
本文链接:https://www.f2er.com/3144596.html

大家都在问