如何使用Selenium / Watir自动化DevExpress组合框?

时间:2015-04-10 19:30:20

标签: selenium combobox devexpress watir

DevExpress以非常奇怪的方式构建组合框。 Selenuim和Watir(包括页面对象)内置的标准标识不会将其视为选择列表。 那你怎么能成功地自动化这些呢?

3 个答案:

答案 0 :(得分:0)

事实证明,DevExpress将组合框构建为一个文本框,其中包含多个与之关联的分层表,但不在HTML树的文本框下。 交互都是通过嵌入式脚本完成的。

我发现自动化此对象的最简单方法是识别文本框和包含项目列表的最低表(第3个表格)。

例如

(使用Watir和Page Objects)

table(:list,:id => 'ComboBoxValue_DDD_L_LBT')
text_field(:state, :id => 'ComboBoxValue_I') #:name => 'State')

我还没有找到在这些级别获得更好ID的方法,但我们正在解决这个问题。 然后您的选择代码如下所示:

self.state_element.click
row = list_element.find { |row| row[0].text == value }
row.click

答案 1 :(得分:0)

请注意,使用Selenium,您可以在客户端中执行任意javascript来查询和设置控件的状态(如果为控件启用了客户端)。这是我如何从名为localeSelectList的组合框中提取(和设置)所选文本的方法:

// unit test code, c#
[TestMethod]
public void SomeTestMethod()
{
    IWebDriver ff = new FirefoxDriver();
    ff.Navigate().GoToUrl(homeUrl);
    // find the element as an iWebElement
    IWebElement localeBox =  ff.FindElement(By.CssSelector("#localeSelectList"));
    Assert.IsTrue(localeBox.Enabled);

    // get the text from the control via javascript
    var locale = Util.GetControlText(ff, localeSelectList);
    Assert.IsTrue(locale == "English");
    // set the text in the control via javascript
    Util.SetControlText(ff, localeSelectList, "German");
    // verify the text was set
    locale = Util.GetControlText(ff, localeSelectList);
    Assert.IsTrue(locale == "German");
}

// helper methods, Util class
static public string GetControlText(IWebDriver driver, string controlName)
   {
       string script = string.Format("return {0}.GetText();", controlName);
       var controlText = ((IJavaScriptExecutor)driver).ExecuteScript(script);
       return controlText.ToString();
   }
static public void SetControlText(IWebDriver driver, string controlName, string controlText)
   {
       string script = string.Format("{0}.SetValue('{1}');", controlName, controlText);
       ((IJavaScriptExecutor)driver).ExecuteScript(script);
   }

与通过基元(点击,按键等)与扩展进行交互并不完全相同,因为它不会为这些事件触发事件处理程序,但如果您的扩展程序使用&#39 ;的valueChanged'事件而不是原始处理程序它与它非常接近。 另请注意:您可以使用客户端javascript来查找和返回使用jquery / css选择器和id的元素,如下所示:

IWebElement element = (IWebElement) ((IJavaScriptExecutor)driver).ExecuteScript("return $('#.myElementId');")

答案 2 :(得分:0)

对于多个分层表来说是正确的,但我想补充一点,它们仅在单击组合框时可见。首先

            var cmbParameterGruppen = webDriver.FindElement(By.Id("phContent_ParameterGruppenComboBox_I"));
            cmbParameterGruppen.Click();

然后

            var tblItems = webDriver.FindElement(By.Id("phContent_ParameterGruppenComboBox_DDD_L_LBT"));

            var parameterGruppen = tblItems.FindElements(By.XPath(".//*"));
            var count = parameterGruppen.Count;
            Debug.WriteLine($"Count = {count}");
            if(count > 0)
                parameterGruppen[count - 1].Click();

我选择最后一行。