我的公司正在使用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,但编写代码仍然很乏味。是否有任何可用于简化常见任务的包装方法,如:
答案 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);
}
}
}
}
}