2

我正在尝试从 extjs 组合框中选择一个选项。
在下面的代码listElements中,仅提供可见选项(显示在屏幕上)而不是所有选项。
此处仅限于选择屏幕中可用的选项之一。
我想选择列表底部的值。
我没有找到任何选项来下拉列表以选择所需的选项。

 List<WebElement> listElements = TestUtil.getWebDriver().findElements((By.className("x-boundlist-item")));
        for(WebElement ele : listElements){
            if(ele.getText().equals(TestUtil.getValue(DateTimeConstants.TIMEZONE_INPUT_VALUE))){
                ele.click();
                break;
            }
        }

请找到html:

这是组合框 html:

<input id="currentTimezone-inputEl" class="x-form-field x-form-text x-form-focus x-field-form-focus x-field-default-form-focus" type="text" style="width: 100%; -moz-user-select: text;" name="dateTimeData.selectedTimezone" value="-- Please Select --" autocomplete="off" aria-invalid="false" data-errorqtip="">  

选项如下所示:

<div id="ext-gen1024" class="x-reset">
<div id="ext-gen1074" class="x-reset">
<div id="ext-gen1076" class="x-css-shadow" role="presentation" style="z-index: 19000; left: -9999px; top: -9995px; width: 355px; height: 296px; box-shadow: 0px 0px 4px rgb(136, 136, 136); display: none;"></div>
<div id="ext-gen1079" class="x-css-shadow" role="presentation" style="z-index: 19000; left: 20px; top: 321px; width: 355px; height: 296px; box-shadow: 0px 0px 4px rgb(136, 136, 136); display: none;"></div>
<div id="boundlist-1022" class="x-boundlist x-boundlist-floating x-layer x-boundlist-default" tabindex="-1" style="left: 20px; top: 317px; width: 355px; z-index: 19001; height: 300px; display: none;">
<div id="boundlist-1022-listEl" class="x-boundlist-list-ct" style="overflow: auto; height: 299px;">
<ul>
<li class="x-boundlist-item" role="option">Africa/Abidjan</li>
<li class="x-boundlist-item" role="option">Africa/Accra</li>
<li class="x-boundlist-item" role="option">Africa/Addis_Ababa</li>
<li class="x-boundlist-item" role="option">Africa/Algiers</li>
<li class="x-boundlist-item" role="option">Africa/Asmara</li>

<li class="x-boundlist-item x-boundlist-selected" role="option">America/St_Lucia</li>
</div>
</div>
</div>
4

2 回答 2

2

是的,我可以重现这个问题。原因是 Selenium 不会点击不可见元素,每个不可见元素的文本也会为空。

在这里,大多数组合列表元素都是不可见的,因此ele.getText()不会为您提供任何东西。因此,您将无法将文本与您想要的文本进行比较。

但是,解决方法是,不使用ele.getText()获取文本,您可以尝试使用textContent元素的属性来获取文本。此外,Selenium 不会点击不可见元素,因此您需要使用Actions click()而不是 normal click()。下面是如何做到这一点。

List<WebElement> listElements = TestUtil.getWebDriver().findElements((By.cssSelector(".x-boundlist:not([style*='display: none'])")));
    for(WebElement ele : listElements){
        if(ele.getAttribute("textContent").equals(TestUtil.getValue(DateTimeConstants.TIMEZONE_INPUT_VALUE))) {
            // print out ele.getAttribute("textContent") if you want
            // ele.click(); ElementNotVisible exception may be thrown
            new Actions(TestUtil.getWebDriver()).click(ele).perform();
            break;
        }
    }
}
于 2013-07-19T22:41:08.083 回答
0

为了解决这个问题,我们可以通过以下方式使用 xpath。没有选择一个国家的原因是它不可见,并且对于不可见的元素,硒无法执行该操作。我们必须首先通过单击输入框使国家列表可见。一旦列表可见,我们可以选择列表中的任何国家。

// Code to make the country list visible
WebElement element = driver.findElement(By.xpath("//div[contains(@id, 'boundlist')]"));
element.click();

//To click on some country in the drop down 
driver.findElement(By.xpath("//div[contains(@id, 'boundlist')]//ul//li[text() = 'Africa/Abidjan']")).click();

//To make a reusable method
public void selectCountry(String countryName)
{
    driver.findElement(By.xpath("//div[contains(@id, 'boundlist')]//ul//li[text() = '" +countryName +"']"));
}
于 2013-07-21T06:44:43.187 回答