Использование Selenium 2 IWebDriver для взаимодействия с элементами на странице

Я использую Selenium IWebDriver для написания модульных тестов на C#.

Таков пример:

IWebDriver defaultDriver = new InternetExplorerDriver();
var ddl = driver.FindElements(By.TagName("select"));

Последняя строка извлекает элемент HTML select, заключенный в элемент IWebElement.

Мне нужен способ имитировать выбор определенного option в этом списке select, но я не могу понять, как это сделать.


После некоторого исследования я обнаружил примеры, когда люди используют класс ISelenium DefaultSelenium для выполнения следующего, но я не использую этот класс, потому что я делаю все с IWebDriver и INavigation (из defaultDriver.Navigate()).

Я также заметил, что ISelenium DefaultSelenium содержит массу других методов, недоступных в конкретных реализациях IWebDriver.

Итак, могу ли я использовать IWebDriver и INavigation вместе с ISelenium DefaultSelenium?


person Andreas Grech    schedule 11.01.2011    source источник


Ответы (2)


Как упоминает ZloiAdun, в пространстве имен OpenQA.Selenium.Support.UI появился прекрасный новый класс Select. Это один из лучших способов получить доступ к элементу выбора и его параметрам, потому что API очень прост. Допустим, у вас есть веб-страница, которая выглядит примерно так

<!DOCTYPE html>
<head>
<title>Disposable Page</title>
</head>
    <body >
        <select id="select">
          <option value="volvo">Volvo</option>
          <option value="saab">Saab</option>
          <option value="mercedes">Mercedes</option>
          <option value="audi">Audi</option>
        </select>
    </body>
</html>

Ваш код для доступа к выбору будет выглядеть так. Обратите внимание, как я создаю объект Select, передавая в его конструктор обычный элемент IWebElement. У вас есть множество методов для объекта Select. Посмотрите в источнике для получения дополнительной информации, пока она не будет должным образом задокументирована.

using OpenQA.Selenium.Support.UI;
using OpenQA.Selenium;
using System.Collections.Generic;
using OpenQA.Selenium.IE;

namespace Selenium2
{
    class SelectExample
    {
        public static void Main(string[] args)
        {
            IWebDriver driver = new InternetExplorerDriver();
            driver.Navigate().GoToUrl("www.example.com");

            //note how here's i'm passing in a normal IWebElement to the Select
            // constructor
            Select select = new Select(driver.FindElement(By.Id("select")));
            IList<IWebElement> options = select.GetOptions();
            foreach (IWebElement option in options)
            {
                System.Console.WriteLine(option.Text);
            }
            select.SelectByValue("audi");

            //This is only here so you have time to read the output and 
            System.Console.ReadLine();
            driver.Quit();

        }
    }
}

Однако следует отметить пару вещей о классе поддержки. Даже если вы загрузили последнюю бета-версию, вспомогательной DLL там не будет. Пакет поддержки имеет относительно долгую историю в библиотеках Java (именно там живет PageObject), но он все еще довольно свеж в драйвере .Net. К счастью, его действительно легко собрать из исходного кода. Я вытащил из SVN, затем сослался на WebDriver.Common.dll из загрузки бета-версии и построен в C# Express 2008. Этот класс не был так хорошо протестирован, как некоторые другие классы, но мой пример работал в Internet Explorer и Firefox.

Есть несколько других вещей, на которые я должен указать, основываясь на вашем коде выше. Во-первых, строка, которую вы использовали для поиска элемента выбора

driver.FindElements(By.TagName("select"));

собирается найти все выбранные элементы. вам, вероятно, следует использовать driver.FindElement без 's'.

Кроме того, очень редко вы будете использовать INavigation напрямую. Вы будете делать большую часть своей навигации, как driver.Navigate().GoToUrl("http://example.com");

Наконец, DefaultSelenium — это способ доступа к старому API Selenium 1.x. Selenium 2 — довольно значительное отличие от Selenium 1, поэтому, если вы не пытаетесь перенести старые тесты на новый API Selenium 2 (часто называемый API WebDriver), вы не будете использовать DefaultSelenium.

person pnewhook    schedule 11.01.2011
comment
+1 Класс Select, на который ссылается ZloiAdun, выполнил свою работу, но я принимаю этот ответ, потому что вы предоставили больше информации. Поскольку Select еще не доступен в общедоступной dll, в настоящее время я использую класс и исключение, связанное с ZloiAdun. Что касается FindElements, мне нужно использовать его, потому что я хочу получить более 1 select. Наконец, спасибо за упоминание проблемы в отношении DefaultSelenium, хотя у меня есть следующий вопрос; Есть ли способ использовать множество методов, которые предлагает DefaultSelenium? - person Andreas Grech; 12.01.2011
comment
+1 за пояснение, что IWebDriver подходит для 2.x. Только начинаю, и большинство демонстраций, которые я мог найти, используют DefaultSelenium. - person Paul Hadfield; 30.03.2011

Вы должны получить все option элементы из select, используя ddl.FindElements(By.TagName("option"));. Затем вы можете перебрать возвращенную коллекцию и выбрать необходимые элементы, используя метод SetSelected класса IWebElement.

Обновление: кажется, что теперь есть реализация Select в C# в WebDriver - раньше это было только на Java. Пожалуйста, взгляните на его code, и этот класс проще использовать

person Sergii Pozharov    schedule 11.01.2011
comment
IWebElement не имеет метода SetSelected. Есть метод Select, но в моем случае он ничего не делает. - person Andreas Grech; 11.01.2011
comment
Я не использую C#, поэтому могу пропустить имена методов — извините за это. Вы пытались использовать класс OpenQA.Selenium.Support.UI.Select? Используете ли вы Select() для опции выбора? - person Sergii Pozharov; 11.01.2011