Раскрывающийся список веб-драйвера Selenium C # не запускает Javascript - PullRequest
2 голосов
/ 09 августа 2011

Я использую Seleniunm для проверки своей веб-страницы.

У меня есть выпадающий список, для которого я хочу выбрать опцию.Это запускает некоторый Ajax, который получает некоторые данные для соответствующих юнитов.

Это нормально работает при обычном просмотре страницы, но с селеном изменяет параметр в текстовом поле, но Ajax не запускается.

Разметка на странице:

<select id="measure" name="measure">
    <option selected="selected" value="1">Metric</option>
    <option value="2">US Imperial</option>
    <option value="3">UK Imperial</option>
</select>

C # код:

var dropDown = WebDriver.FindElementById("measure");
var selectElement = new SelectElement(dropDown);
selectElement.SelectByValue("3");

Что мне не хватает в плане выбора / щелчка по раскрывающемуся варианту?

Спасибо

Ответы [ 3 ]

1 голос
/ 19 сентября 2016

У меня недавно была такая же проблема с использованием FirefoxDriver. В моей конкретной установке у меня был пузырьковый делегированный обработчик события «change» для тега <html>, который не срабатывал:

document.documentElement.addEventListener("change", handleChange, false);

function handleChange(event) {
    // do stuff
}

Следующий код не вызывал onchange даже при выпадающем меню:

SelectElement select = new SelectElement(element);

select.SelectByText("Foo");

Опция будет выбрана, но никаких изменений не будет даже запущено - даже при установке фокуса на другое поле формы. Я использовал свою собственную мышь, чтобы выбрать новое значение в раскрывающемся списке, прежде чем сработало событие изменения.

Я исправил эту проблему, щелкнув раскрывающийся список, затем щелкнув параметр внутри него:

IWebElement element = // ...

element.Click();

element.FindElements(By.TagName("option"))
       .Single(opt => opt.Text == Value)
       .Click();

Вот удобный метод расширения, который делает то же самое:

public static class IWebElementExtensions
    /// <summary>
    /// Selects an option in a dropdown list by visible option text.
    /// </summary>
    /// <param name="element"></param>
    /// <param name="optionText"></param>
    public static void SelectOptionByText(this IWebElement element, string optionText)
    {
        if (element == null)
            throw new ArgumentNullException("element");

        if (element.TagName != "select")
            throw new ArgumentException("The element must be a <select> tag");

        if (optionText == null)
            throw new ArgumentNullException("optionText");

        var options = element.FindElements(By.TagName("option"))
                             .Where(opt => opt.Text == optionText);

        if (options.Count() == 0)
            throw new NoSuchElementException("Could not find <option>" + optionText + "</option> inside <select id=\"" + element.GetAttribute("id") + "\">");

        if (options.Count() > 1)
            throw new WebDriverException("Too many <option>" + optionText + "</option> tags inside <select id=\"" + element.GetAttribute("id") + "\">");

        element.Click();
        options.Single().Click();
        element.Click();
    }
}

И использовать:

element.SelectOptionByText("Foo");

Преимущества

  • Нет JavaScript-хаков
  • Использует родные события в Selenium

Недостатки

  • Требуется немного больше времени для выполнения
0 голосов
/ 06 февраля 2012

Я обнаружил, что использование jQuery работает лучше, чем класс SelectElement WebDriver.

Попробуй это. Обратите внимание, как я вызываю событие jQuery .change (событие JavaScript onchange). У меня есть другое раскрывающееся меню, которое зависит от этого раскрывающегося списка, поэтому для заполнения зависимого раскрывающегося списка необходимо вызвать это событие. Чтобы заставить это работать, мне также пришлось включить Native Events для моего драйвера Firefox. Я вижу, вы выбираете по значению, а не по тексту опции. Вы должны быть в состоянии изменить мой код JQuery с кодом, который работает для выбора по значению. Кроме того, если вы работаете с элементами управления ASP.NET, использование кода WebDriver не будет работать должным образом, поскольку идентификатор является динамическим в зависимости от браузера. Таким образом, вам придется получить идентификатор с помощью jQuery, используя идентификатор клиента. Я вставил этот код ниже также, если это так для вас.

public static void SetDropdownSelectedOptionValue(IWebDriver driver, string tagId, string newValue)
{
    //new SelectElement(driver.FindElement(By.Id("book-country_id"))).SelectByText(newValue);

    IJavaScriptExecutor js = driver as IJavaScriptExecutor;
    js.ExecuteScript("$('#" + tagId + " option:contains(" + newValue + ")').attr('selected', 'selected')");
    js.ExecuteScript("$('#" + tagId + "').change()");
    //driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(Config.WAIT_TIME));
    System.Threading.Thread.Sleep(1000);
}

Требуется при вызове нативного события onchange.

FirefoxProfile firefoxProfile = new FirefoxProfile();
firefoxProfile.EnableNativeEvents = true;

При использовании элементов управления ASP.NET используйте этот код jQuery, а не явный идентификатор. Конечно, измените этот код, чтобы поместить tagId между ними, чтобы получить селектор jQuery.

$('#<%=dropdownid.ClientID %>')
0 голосов
/ 10 августа 2011

Я использовал FirefoxDriver вместо драйвера InternetExplorer, и теперь все выглядит нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...