1

我在页面上有这个选择:

<select multiple="" class="recipientsList" name="Recipients[]" id="To" style="display: none;">
    <option value="User-6" class="">Coordinator, Test</option>
    <option value="Course-4" class="">New Course 1</option>
    <option value="UserType-6" class="">Coordinators</option>
    <option value="UserTypeInCourse-4-6" class="">New Course 1 Coordinator</option>
</select>

我正在运行这个测试:

public IWebDriver WebDriver
{
    get 
    { 
        // gets the current WebDriver instance, set up elsewhere at the beginning
        // of the fixture
        return ScenarioContext.Current.WebDriver(); 
    }
}

public void SelectTest()
{
    // code to navigate to proper page

    var options = WebDriver.FindElements(By.CssSelector("select.recipientsList option"));

    Assert.That(options, Is.Not.Empty, "No options found.");
    Assert.That(!options.Any(option => string.IsNullOrEmpty(option.Text)), "Some or all options have blank text.");
    // Actual useful assert
}

第二个断言失败,因为options集合中的所有元素都将空字符串作为其 Text 对象。如果我删除添加display:none;样式的页面上的 JavaScript,它会起作用。这不是一个永久的解决方案,因为这个选择需要被隐藏,因为它是由FCBKcomplete扩展的。

如何在 .NET 中使用 Selenium 2/WebDriver 获取隐藏选择选项的文本?

4

2 回答 2

2

WebDriver 旨在模拟真实的用户交互。如果某些东西不可见,那么真正的用户就看不到它,WebDriver 也看不到它。

您可以模拟用户操作 - 单击、悬停或任何使您的选择可见的操作 - 然后找到您选择的选项并检查它们。

于 2011-02-04T19:25:49.413 回答
1

我遇到了同样的问题。我发现如果我检索所有元素并循环遍历它们,我可以确定哪些元素被设置为由 JS 或 CSS 显示,然后与它们交互。

我有一个具有相同名称并附加了动态 ID 的表单字段,例如“fieldname_”+id 作为字段 ID。这是示例代码:

List<WebElement> displayNames = driver.findElements(By.xpath("//input[starts-with(@id, 'calendarForm_calendarDisplayNameM')]"));

int name_count = 1;
for (WebElement thisDisplayName : displayNames) {
    RenderedWebElement element = (RenderedWebElement)thisDisplayName;
    if (element.isDisplayed()) {
        String calendarDisplayNameText = testCalendarName + "_display_" + name_count; 
        thisDisplayName.sendKeys(calendarDisplayNameText);
        name_count++;
    }
}
于 2011-04-06T12:32:03.803 回答