在C#中使用Selenium 2和Webforms - 是否有任何帮助方法来简化常见任务?

时间:2011-12-09 14:12:23

标签: c# selenium webforms

我的公司正在使用Selenium 2来自动化使用Webforms(以及MVC)进行测试。对于webforms,我们最终在最简单的任务中使用xpath,因为控件ID已更改。我们经常有这样的事情:

driver.clickByXPath("//input[contains(@id,'radioManual')]");
driver.sendKeysByXPath("//input[contains(@id, 'txtName')]", value, true);
driver.sendKeysByXPath("//table[@id='add-external-form']/tbody/tr/td[1]/input", value);

我们现在已经习惯了xpath,但编写代码仍然很乏味。是否有任何可用于简化常见任务的包装方法,如:

  • 选择Radiobutton
  • 从DropDownList
  • 中选择一个选项
  • 在文本框中输入文字
  • 点击链接
  • 选中复选框

2 个答案:

答案 0 :(得分:1)

您可以编写自己的扩展程序。这不是很困难。例如,在文本框中输入文本:

public static IWebElelemt SetTextBoxValue(this IWebElement element, string value)
{
    element.SendKeys(value);
    return element;
} 

并使用它:

driver.FindElement(By.Id("some id")).SetTextBoxValue("Hello");

或扩展到WebDriver:

public static IWebElelemt SetTextBoxValue(this IWebDriver driver,string id, string value)
{
    var element = driver.FindElement(By.Id(id));
    element.SendKeys(value);
    return element;
} 

或者返回父元素的扩展名:

public static IWebElement GetParent(this IWebElement element)
{
   return element.FindElement(By.XPath(".."));
}

这只是一些示例,您也可以通过执行JavaScript来创建执行某些操作的扩展。例如:

public static JavaScriptExecutor Script(this IWebDriver driver)
{
   return driver as JavaScriptExecutor;
}

并像这样使用它:

var count = driver.Script().ExecuteScript("return $('some selector').length;").ToString();

答案 1 :(得分:0)

从我所知道的那些是包装方法。 Selenium中没有clickByXPath或sendKeysByXpath方法。我猜你的公司已经为IWebDriver接口做了一些自定义扩展,以减少代码量。

此外,您不能只说单击my_radio_button,因为您必须传入Selenium的选择器才能找到您要查找的特定单选按钮。与你使用selenium做的其他事情一样,它必须有一些方法来遍历DOM,并知道它正在寻找什么行动。

根据您的编辑,我做了一些事情,可以更轻松地选择选项和输入文字。

首先我通常将所有文本输入字段捕获到List<IWebElement>然后删除任何未显示的字段,因为webdriver无法与隐藏字段交互。然后我有一个随机字符生成器,​​用我的数据填充我的字段。

以下是一个例子:

    public void InputValidText(List<IWebElement> inputList)
    {
        foreach (IWebElement element in inputList)
        {
            if (element.Displayed)
            {
                if (element.GetAttribute("type") == "checkbox")
                {
                    if (!element.Selected)
                    {
                        element.Click();
                    }
                }
                else if (element.TagName == "select")
                {
                    if (element.GetAttribute("id") != "CreditCardYearExp")
                    {
                        SelectElement select = new SelectElement(element);
                        int options = element.FindElements(By.TagName("option")).Count();
                        select.SelectByIndex(new Random().Next(1, options - 1));
                    }
                    else
                    {
                        SelectElement select = new SelectElement(element);
                        int options = element.FindElements(By.TagName("option")).Count();
                        select.SelectByIndex(new Random().Next(3, options - 1));
                    }
                }
                else
                {
                    string inputToValidate = element.GetAttribute("id").ToString();
                        element.Clear();
                        if (Enum.GetNames(typeof(NameInputValidation)).Contains(inputToValidate))
                        {
                            element.SendKeys(ValidContent.GeneralLongTextInput);
                        }
                        else if (Enum.GetNames(typeof(PostalCodeInputValidation)).Contains(inputToValidate))
                        {
                            element.SendKeys(ValidContent.PostalCode);
                        }
                        else if (Enum.GetNames(typeof(PhoneNumberInputValidation)).Contains(inputToValidate))
                        {
                            element.SendKeys(ValidContent.LongPhoneNumber);
                        }
                        else if (Enum.GetNames(typeof(EmailInputValidation)).Contains(inputToValidate))
                        {
                            element.SendKeys(ValidContent.NewEmail);
                        }
                        else if (Enum.GetNames(typeof(AddressInputValidation)).Contains(inputToValidate))
                        {
                            element.SendKeys(ValidContent.GeneralAddress);
                        }
                        else if (Enum.GetNames(typeof(PasswordInputValidation)).Contains(inputToValidate))
                        {
                            element.SendKeys(ValidContent.NewPassword);
                        }
                        else if (Enum.GetNames(typeof(TextAreaValidation)).Contains(inputToValidate))
                        {
                            element.SendKeys(ValidContent.GeneralTextAreaInput);
                        }
                        else if (inputToValidate == "CreditCardTextBox")
                        {
                            element.SendKeys(ValidContent.CreditCard);
                        }
                        else
                        {
                            element.SendKeys(ValidContent.GeneralShortTextInput);
                        }
                }
            }
        }
    }