如何在selenium webdriver中选择所有extjs下拉值

时间:2013-07-19 07:32:57

标签: selenium-webdriver

我正在尝试从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>

2 个答案:

答案 0 :(得分:2)

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

此处大多数组合列表元素都是不可见的,因此ele.getText()不会为您提供任何内容。因此,您将无法将文本与所需文本进行比较。

但是,解决方法是,在不使用ele.getText()来获取文本的情况下,您可以尝试使用元素的textContent属性来获取文本。此外,Selenium不会点击不可见元素,因此您需要使用Actions click()而不是普通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;
        }
    }
}

答案 1 :(得分:0)

要解决此问题,我们可以按以下方式使用xpath。未选择国家/地区的原因是它不可见,对于不可见元素,selenium无法执行该操作。 我们必须首先通过单击输入框使国家/地区列表可见。列表可见后,我们可以选择列表中的任何国家/地区。

// 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 +"']"));
}