Использование Selenium 2 IWebDriver для взаимодействия с элементами на странице - PullRequest
6 голосов
/ 11 января 2011

Я использую IWebDriver Selenium для написания модульных тестов на 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?

Ответы [ 2 ]

8 голосов
/ 11 января 2011

Как упоминает 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();

        }
    }
}

Однако следует отметить пару вещей о классе Support.Даже если вы скачали последнюю бета-версию, 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.

2 голосов
/ 11 января 2011

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

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

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