它是否围绕 Selenium 提供了一种更简单或不同的调用 Selenium 功能的方法?
我在谷歌上查了一下,我能找到的最好的信息是这个https://www.ontestautomation.com/using-wrapper-methods-for-better-error-handling-in-selenium/。
这并没有明确解释 Selenium 包装器是什么,但提供了足够的信息来帮助理解它是什么。
它是否围绕 Selenium 提供了一种更简单或不同的调用 Selenium 功能的方法?
我在谷歌上查了一下,我能找到的最好的信息是这个https://www.ontestautomation.com/using-wrapper-methods-for-better-error-handling-in-selenium/。
这并没有明确解释 Selenium 包装器是什么,但提供了足够的信息来帮助理解它是什么。
“包装器”的定义之一是:
在软件工程的上下文中,包装器被定义为一个实体,它通过定义良好的接口封装和隐藏另一个实体的底层复杂性。
因此,您可能使用的任何实现 Selenium 代码的自定义代码都可以理解为包装器。
例如,Katalon Studio 是一个在底层使用 Selenium 的测试工具,即 Katalon 的WebUI
类方法是 Selenium 方法的包装器。以下两段代码是等价的——它们做同样的事情:
WebElement element = driver.findElement(By.cssSelector("css-selector-of-the-element"));
element.click();
WebUI.click(testObject) //testObject defined elsewhere
这只是一个简单的示例,但它显示了如何将复杂性隐藏在更简单的命令后面。
我知道这个问题已经得到回答,但我可以看到它从未被接受为答案。现在,上面的答案准确地解释了包装器是什么:封装。这本身也意味着它隐藏了另一个实体(在本例中为 Selenium 类)的底层复杂性。
但让我详细说明并给你一个实际的例子。
我已经围绕 Selenium 构建了一个框架,并在我的公司内部用它制作了一个 nuget 包。但这是一个关于如何通过类包装 Selenium 的示例。使用委托,您可以简化许多调用方法:
private delegate void ValidationMethodDelegate(By locator, int timeout = ELEM_TIMEOUT);
//This method actions a delegate for regularly used methods with a By locator parameter,
//the value of the selector and the selector type which is a built-in framework enum
private void ActionMethod(ValidationMethodDelegate delegateMethod, string selectorValue, SelectorType selectorType)
{
if (!string.IsNullOrWhiteSpace(selectorValue))
{
switch (selectorType)
{
case SelectorType.Id:
delegateMethod(By.Id(selectorValue));
break;
case SelectorType.Xpath:
delegateMethod(By.XPath(selectorValue));
break;
case SelectorType.TagName:
delegateMethod(By.TagName(selectorValue));
break;
case SelectorType.CssSelector:
delegateMethod(By.CssSelector(selectorValue));
break;
case SelectorType.ClassName:
delegateMethod(By.ClassName(selectorValue));
break;
case SelectorType.LinkText:
delegateMethod(By.LinkText(selectorValue));
break;
case SelectorType.PartialLinkText:
delegateMethod(By.PartialLinkText(selectorValue));
break;
default:
break;
}
}
else
{
throw new AssertionException($"{this.GetType().Name}::{MethodBase.GetCurrentMethod().Name}():: Selector Value : '{selectorValue}' cannot be null or empty.");
}
}
//Example on how the delegate is used
public void Click(string selectorValue, SelectorType selectorType)
{
ActionMethod(PageHelper.Click, selectorValue, selectorType);
}
PageHelper 是一个静态类,它在框架内部实现了 Selenium 的大多数带有断言和等待实现的方法。我的框架中有几层复杂性。但你也可以让它变得简单。click for me 方法也包含在另一个类中,该类实现了两种方法,一种是通过查找元素,另一种是等待元素出现在屏幕上。两者都是 Selenium 方法和断言的其他包装器。
如果您只对一个应用程序进行测试并且不会进一步使用 Selenium,那么框架不是您的解决方案。在您的测试解决方案之外,包装器也是一种冗余。
我会说包装器仅在您对其进行多次使用的上下文中才有用(例如单击或查找元素等)
“Wrapper”更像是一种软件开发设计模式,开发人员在必要时在代码库中使用它。
您可以在书中阅读更多内容:
在自动化测试的范围内,还有其他术语。我将解释移动自动化。
驱动程序(Espresso、UIAutomator、Robotium、XCUITest) - 从测试接收命令并以可理解的方式将它们发送到应用程序专用界面
您向 GUI 驱动程序发送了一个按下按钮的命令 - 它通过 API 接受它并发送到应用程序(我们在 GUI 中看到对按钮的点击)。
另一个应用程序(在驱动程序之上,我们在此上下文中称其为上层结构)通过一个或多个驱动程序(增加可用性或增加可能性)与被测应用程序交互,例如 Appium、Calabash。
框架(JUnit、TestNG、Cucumber)——允许我们准备、启动和收集有关测试执行的所有信息的应用程序
它看起来像这样:
框架 -> 我们的测试 -> 上层结构 -> 驱动程序 -> 我们应用程序中的 GUI