这种方法更好吗?我可以再改进一下吗?

时间:2011-03-31 08:26:18

标签: c# webdriver selenium-webdriver

最近我开始涉足Selenium 2.0(又名WebDriver)的C#。 对于那些不了解Selenium的人,它允许您使用html id,name,class等来控制Web应用程序的UI对象。

所以你可以点击一个元素 -

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

但是你也可以使用html名称或类或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 个答案:

答案 0 :(得分:2)

我会将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 :(得分:1)

至少应该为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);

如果找到元素的可能性更大,请考虑将位置方法作为代理人传递,如Florian的答案所示。