在c#中使用Selenium 2和Webforms -有没有帮助方法来简化常见的任务?

本文关键字:方法 有帮助 常见 任务 Selenium Webforms | 更新日期: 2023-09-27 18:17:13

我的公司正在使用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,但是代码编写起来仍然很繁琐。是否有任何包装器方法可用来简化常见任务,如:

  • 选择单选按钮
  • 从下拉列表中选择一个选项
  • 在文本框中输入文本
  • 点击链接
  • 选中复选框

在c#中使用Selenium 2和Webforms -有没有帮助方法来简化常见的任务?

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

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();

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

你也不能只是说点击my_radio_button,因为你必须在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);
                        }
                }
            }
        }
    }