Этот подход лучше? Могу ли я улучшить это больше? - PullRequest
0 голосов
/ 31 марта 2011

В последнее время я начал заниматься C # для Selenium 2.0 (он же WebDriver). Для тех, кто не знает о Selenium, он позволяет вам управлять объектами пользовательского интерфейса веб-приложения, используя html id, name, class и т. Д.

Таким образом, вы можете нажать на элемент как -

webDriver.FindElement(By.Id(elementLocator)).Click();

но тогда вы также можете использовать html name или class или XPath, чтобы щелкнуть по элементу. Так что это может быть -

webDriver.FindElement(By.Name(elementLocator)).Click();
webDriver.FindElement(By.Xpath(elementLocator)).Click();

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

 public static void click(IWebDriver webDriver, int elementLocatorType, String elementLocator)
    {
        switch (elementLocatorType)
        {
            case 0:
                webDriver.FindElement(By.Id(elementLocator)).Click();
                break;
            case 1:
                webDriver.FindElement(By.Name(elementLocator)).Click();
                break;
            case 2:
                webDriver.FindElement(By.XPath(elementLocator)).Click();
                break;
        }

    }

и используйте его как -

Commons.click(webDriver, 0, elementLocator)

Мне интересно, смогу ли я улучшить его, скажем, смогу ли я избежать оператора switch и использовать что-то лучше ...

Ответы [ 2 ]

2 голосов
/ 31 марта 2011

Я бы передал вызов By. * Как делегат методу click.Я не знаю фактический тип возврата вызовов By. *, Но если методы возвращают IElement, вы можете сделать это следующим образом:

// Replace IElement by the actual return type of By.Id, By.Name, By.XPath!
public static void click(IWebDriver webDriver, Func<string, IElement> by, String elementLocator)
{
    webDriver.FindElement(by(elementLocator)).Click();
}

Использование:

Commons.click(webDriver, By.Id, elementLocator);
Commons.click(webDriver, By.Name, elementLocator);
Commons.click(webDriver, By.XPath, elementLocator);

Это избавит вас от подверженных ошибкам «магических» чисел.

Альтернатива, использование методов расширения - для удовлетворения комментариев:)

// Replace IElement by the actual return type of By.Id, By.Name, By.XPath!
public static void click(this IWebDriver webDriver, Func<string, IElement> by, String elementLocator)
{
    webDriver.FindElement(by(elementLocator)).Click();
}

// Convenience methods
public static void clickById(this IWebDriver webDriver, String elementLocator)
{
    webDriver.click(By.Id, elementLocator);
}

public static void clickByName(this IWebDriver webDriver, String elementLocator)
{
    webDriver.click(By.Name, elementLocator);
}

public static void clickByXPath(this IWebDriver webDriver, String elementLocator)
{
    webDriver.click(By.XPath, elementLocator);
}
1 голос
/ 31 марта 2011

Самое меньшее, что вы должны сделать, это ввести перечисление для этого elementLocatorType.

Но я бы сделал это так:

public static void ClickElement(this IWebDriver webDriver, Element element)
{
    webDriver.FindElement(element).Click();
}

public static void ClickElementById(this IWebDriver webDriver, string elementLocator)
{
    webDriver.ClickElement(By.Id(elementLocator));
}

public static void ClickElementByName(this IWebDriver webDriver, string elementLocator)
{
    webDriver.ClickElement(By.Name(elementLocator));
}

public static void ClickElementByXPath(this IWebDriver webDriver, string elementLocator)
{
    webDriver.ClickElement(By.XPath(elementLocator));
}

Вы можете использовать это так:

webDriver.ClickElementById(elementLocator1);
webDriver.ClickElementByName(elementLocator2);
webDriver.ClickElementByXPath(elementLocator3);

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

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