0

最近我开始涉足 C# 的 Selenium 2.0(又名 WebDriver)。对于那些不了解 Selenium 的人,它允许您使用 html id、名称、类等来控制 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 语句并使用更好的东西....

4

2 回答 2

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);
}
于 2011-03-31T08:37:59.190 回答
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 的回答建议将 location 方法作为委托传递。

于 2011-03-31T08:36:31.823 回答