0

我使用通过可见文本从列表框中完美选择项目的代码。

 var selectElement = new SelectElement(TestFramework.FindWebElement(this));
 selectElement.SelectByText(text);

问题是我已经动态更改了项目中的文本。它可能是这样的:

-- item1 -- 或 --- item1 ---

但我需要选择文本包含“item1”的项目。有什么建议么?

4

3 回答 3

3

查看源代码,如果第一次搜索(直接匹配)没有返回任何内容,该SelectByText方法应该去搜索匹配项。如果它没有这样做,请向 Selenium 开发人员提出一个错误并同时编写您自己的扩展方法:containsEquals

/// <summary>
/// Select an option by first searching for a case insensitive direct match then trying a case insenstive contains match.
/// </summary>
/// <param name="selectElement">The SelectElement to use.</param>
/// <param name="searchText">The text to find in the options.</param>
public static void SelectByText(this SelectElement selectElement, string searchText)
{
    var allOptionsThatHaveText =
        selectElement.Options.Where(se => se.Text.Equals(searchText, StringComparison.OrdinalIgnoreCase));

    if (allOptionsThatHaveText.Any())
    {
        foreach (var option in allOptionsThatHaveText)
        {
            option.Click();
        }
        return;
    }

    var optionWithText = selectElement.Options.Where(option => option.Text.IndexOf(searchText, StringComparison.OrdinalIgnoreCase) >= 0);
    if (optionWithText.Any())
    {
        foreach (var option in optionWithText)
        {
            option.Click();
        }
        return;
    }

    throw new NoSuchElementException(string.Format("Cannot find the text: {0} by either a case insenstive match or a case insensitive equals match.", searchText));
}
于 2012-10-23T08:46:21.107 回答
1

您可以使用 XPath 代替 SelectByText 并在 XPath 中使用“包含”。

这是一个例子:

var selectElement = new SelectElement(_driver.FindElement(By.XPath("//*[contains(text(), 'YOUTEXTHERE')]")));
于 2012-10-23T06:15:07.637 回答
0

尝试使用以下代码:-

var option = new SelectElement(browser.FindElement(By.CssSelector("#Menu_ParentMenuID"))).SelectBySubText("item1");
于 2015-01-12T18:14:58.533 回答