如何在selenium webdriver中处理ExtJS的组合框

时间:2013-04-30 09:26:31

标签: extjs selenium-webdriver

我有一个基于ExtJS的UI。我已经知道在ExtJS中,组合框不是一个真正的组合框,而是输入文本字段,下拉框图像和列表的组合。现在我能够识别控件,但我坚持从列表中选择值。在HTML源代码中,我看到列表显示为单独的div,并在我们点击下拉列表时附加到源的末尾。在下面找到下拉控件的HTML源代码。 {

<div id="ext-gen678" class="x-form-field-wrap x-form-btn-plugin-wrap" style="width: 556px;">
<div id="ext-gen676" class="x-form-field-wrap x-form-field-trigger-wrap x-trigger-wrap-focus" style="width: 521px;">
<input id="ext-gen677" type="hidden" name="GHVOg:#concat#~inputFld~ISGP_UNIV:ft_t_isgp.prnt_iss_grp_oid:0" value="">
<input id="GHVOg:Mixh8:0" class="x-form-text x-form-field gs_dropDown_input gs_req x-form-invalid x-form-focus" type="text" autocomplete="off" size="24" style="width: 504px;">
<img id="trigger-GHVOg:Mixh8:0" class="x-form-trigger x-form-arrow-trigger" alt="" src="../../ext/resources/images/default/s.gif">

}

在下面的下拉列表的HTML源代码中找到:

<div id="ext-gen726" class="x-layer x-combo-list x-resizable-pinned" style="position: absolute; z-index: 12007; visibility: visible; left: 294px; top: 370px; width: 554px; height: 123px; font-size: 11px;">
<div id="ext-gen727" class="x-combo-list-inner" style="width: 554px; margin-bottom: 8px; height: 114px;">
<div class="x-combo-list-item"></div>
<div class="x-combo-list-item">12h Universe</div>
<div class="x-combo-list-item">1h Universe</div>
<div class="x-combo-list-item">24h Universe</div>
<div class="x-combo-list-item">2h Universe</div>
<div class="x-combo-list-item x-combo-selected">4h Universe</div>

现在我在从列表中选择值时遇到问题,因为列表的div元素未附加到控件。 另请参阅屏幕截图,其中我有多个类似的控件[命名为&#34;为Universe添加安全性&#34;] Screenshot of the ExtJS UI

在屏幕截图中,您可以看到多个下拉菜单[为Universe添加安全性]突出显示,并且所有下拉列表中都显示相同的值。那么如何从下拉列表中识别这些值。 我想知道ExtJS如何使用组合框小部件维护下拉div元素的映射,以便我可以使用相同的逻辑来识别列表。谁能告诉我怎样才能在selenium webdriver中做这件事?

4 个答案:

答案 0 :(得分:3)

您是否注意到页面上只有一个可见x-combo-list? (如果您可以同时打开两个组合列表,请告诉我们)

因此,您只需关心可见的x-combo-list

Css选择器:.x-combo-list[style*='visibility: visible;'] .x-combo-list-item

Xpath://*[contains(@class, 'x-combo-list') and contains(@style, 'visibility: visible;')]//*[contains(@class, 'x-combo-list-item')]

// untested java code, just for the logic
public void clickComboItem(WebElement input, String target) {
    input.click(); // click input to pop up the combo list
    List<WebElement> comboItems = driver.findElements(By.cssSelector(".x-combo-list[style*='visibility: visible;'] .x-combo-list-item"));
    for (int i = 0; i <= comboItems.size(); i++) {
        WebElement item = comboItems.get(i);
        if (item.getText().eqauls(target)) {
            item.click();
            break;
        }
    }
}
// compilable C# version
public void ClickComboItem(IWebElement input, string target) {
    input.Click();
    IList<IWebElement> comboItems = driver.findElements(By.CssSelector(".x-combo-list[style*='visibility: visible;'] .x-combo-list-item"));
    comboItems.First(item => item.Text.Trim() == target).Click();
}

答案 1 :(得分:0)

我可以建议的是:

你抓住了所有的输入,如:

List<WebElement> inputList = driver.findElements(By.cssSelector("input cssSelector")); // you must complete this cssSelector
WebElement input = inputList.get(0); // get the 1st input
input.click(); //click on the first input and the option list appears.

你会抓住所有“选项”,如:

List<WebElement> optionList = driver.findElements(By.cssSelector(".x-combo-list-item")); // get all options
WebElement option = optionList.get(1);
option.click();
input.sendKeys(option.getText()); //getText() get the html inner value

这只是 Java 中的一个示例,如果您想为所有foreach自动填充此填充,您实际上可以使用循环inputs

答案 2 :(得分:0)

我使用JavaScriptExecutor,我的SelectRandomOption看起来像这样:

public void SelectRandomOption()
{
    String randomOptionIndex = "Math.floor(Math.random()*Ext.getCmp('" + ExtJSIdOfComboBox + "').getStore().getCount()-1)";
    String randomOptionValue = "Ext.getCmp('" + ExtJSIdOfComboBox + "').getStore().getAt(" + randomOptionIndex + ").getData()['model']";
    String jsScript = "Ext.getCmp('" + ExtJSIdOfComboBox + "').setValue(" + randomOptionValue + ");";
    js.ExecuteScript(jsScript);
}

答案 3 :(得分:0)

我基本上使用了上面标记的答案,但它需要适应Ext Js 4.1。

它基本上是相同的方法,但你需要寻找一个标有“x-boundlist”类的可见div

我使用了xpath并使用了类似这样的查询:

.//div[@class[contains(.,'x-boundlist')]]

然后检索并点击符合您所需条目的li:

.//li[normalize-space(text())='combobox entry text']

我已经将normalize-space放在那里,因为如果你不修剪字符串,xpath似乎有问题。该方法执行左+右修剪并删除重复的空格,例如 ' blah blah '会更改为'blah blah'