什么是硒包装器?
What is a Selenium wrapper?
它是否环绕 Selenium 并提供更简单或不同的方法来调用 Selenium 的功能?
我在 Google 上查了一下,我能找到的最好的信息是这个 https://www.ontestautomation.com/using-wrapper-methods-for-better-error-handling-in-selenium/。
这并没有明确解释什么是 Selenium 包装器,但提供了足够的信息来帮助理解它是什么。
“包装器”的 definitions 之一是:
In the context of software engineering, a wrapper is defined as an entity that encapsulates and hides the underlying complexity of another entity by means of well-defined interfaces.
因此,您可能使用的任何实现 Selenium 代码的自定义代码都可以理解为包装器。
例如,Katalon Studio 是一种在底层使用 Selenium 的测试工具,即 Katalon 的 WebUI
class 方法是对 Selenium 方法的包装。以下两段代码是等价的——它们做同样的事情:
- 硒(和 Java)
WebElement element = driver.findElement(By.cssSelector("css-selector-of-the-element"));
element.click();
- 卡塔隆
WebUI.click(testObject) //testObject defined elsewhere
这只是一个简单的示例,但它展示了如何在更简单的命令背后隐藏复杂性。
“Wrapper”更像是一种软件开发设计模式,开发人员在必要时在代码库中使用。
您可以在本书中阅读更多内容:
在自动化测试范围内,还有其他术语。我将解释移动自动化。
Driver(Espresso、UIAutomator、Robotium、XCUITest)- 从测试接收命令并以可理解的方式将它们发送到应用专用界面
您向 GUI 驱动程序发送了一个按下按钮的命令 - 它通过 API 接受它并发送到应用程序(我们在 GUI 中看到点击按钮)。
通过一个或多个驱动程序与被测应用程序交互(提高可用性或增加可能性)的另一个应用程序(在驱动程序之上,我们在此上下文中称其为 上层结构)比如 Appium、Calabash。
Frameworks(JUnit、TestNG、Cucumber)- 允许我们准备、启动和收集有关测试执行的所有信息的应用程序
它看起来像这样:
框架 -> 我们的测试 -> 上层结构 -> 驱动程序 -> 我们应用程序中的 GUI
我知道这个问题已经得到回答,但我可以看到它从未被接受为答案。现在,上面的答案准确地解释了包装器是什么:封装。这本身也意味着它隐藏了另一个实体的潜在复杂性(在这种情况下是 Selenium classes)。
但是让我详细说明并给你一个实际的例子。
我已经围绕 Selenium 构建了一个框架,并在我的公司内部使用它制作了一个 nuget 包。但这是一个关于如何通过 class 包装 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 是一个静态的 class,它在框架内部实现了 Selenium 的大部分方法,并带有断言和等待实现。我的框架中有几层复杂性。但你也可以让它变得简单。我的方法 click 也包含在另一个 class 中,它实现了两种方法,一种是找到元素,另一种是等待元素出现在屏幕上。两者都是 Selenium 方法和断言的其他包装器。
如果您只对一个应用程序进行测试并且不会进一步使用 Selenium,那么框架不适合您。此外,包装器在您的测试解决方案之外会有点多余。
我想说的是,包装器仅在您多次使用它的上下文中才有用(例如单击或查找元素等)
它是否环绕 Selenium 并提供更简单或不同的方法来调用 Selenium 的功能?
我在 Google 上查了一下,我能找到的最好的信息是这个 https://www.ontestautomation.com/using-wrapper-methods-for-better-error-handling-in-selenium/。
这并没有明确解释什么是 Selenium 包装器,但提供了足够的信息来帮助理解它是什么。
“包装器”的 definitions 之一是:
In the context of software engineering, a wrapper is defined as an entity that encapsulates and hides the underlying complexity of another entity by means of well-defined interfaces.
因此,您可能使用的任何实现 Selenium 代码的自定义代码都可以理解为包装器。
例如,Katalon Studio 是一种在底层使用 Selenium 的测试工具,即 Katalon 的 WebUI
class 方法是对 Selenium 方法的包装。以下两段代码是等价的——它们做同样的事情:
- 硒(和 Java)
WebElement element = driver.findElement(By.cssSelector("css-selector-of-the-element"));
element.click();
- 卡塔隆
WebUI.click(testObject) //testObject defined elsewhere
这只是一个简单的示例,但它展示了如何在更简单的命令背后隐藏复杂性。
“Wrapper”更像是一种软件开发设计模式,开发人员在必要时在代码库中使用。
您可以在本书中阅读更多内容:
在自动化测试范围内,还有其他术语。我将解释移动自动化。
Driver(Espresso、UIAutomator、Robotium、XCUITest)- 从测试接收命令并以可理解的方式将它们发送到应用专用界面
您向 GUI 驱动程序发送了一个按下按钮的命令 - 它通过 API 接受它并发送到应用程序(我们在 GUI 中看到点击按钮)。
通过一个或多个驱动程序与被测应用程序交互(提高可用性或增加可能性)的另一个应用程序(在驱动程序之上,我们在此上下文中称其为 上层结构)比如 Appium、Calabash。
Frameworks(JUnit、TestNG、Cucumber)- 允许我们准备、启动和收集有关测试执行的所有信息的应用程序
它看起来像这样:
框架 -> 我们的测试 -> 上层结构 -> 驱动程序 -> 我们应用程序中的 GUI
我知道这个问题已经得到回答,但我可以看到它从未被接受为答案。现在,上面的答案准确地解释了包装器是什么:封装。这本身也意味着它隐藏了另一个实体的潜在复杂性(在这种情况下是 Selenium classes)。
但是让我详细说明并给你一个实际的例子。
我已经围绕 Selenium 构建了一个框架,并在我的公司内部使用它制作了一个 nuget 包。但这是一个关于如何通过 class 包装 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 是一个静态的 class,它在框架内部实现了 Selenium 的大部分方法,并带有断言和等待实现。我的框架中有几层复杂性。但你也可以让它变得简单。我的方法 click 也包含在另一个 class 中,它实现了两种方法,一种是找到元素,另一种是等待元素出现在屏幕上。两者都是 Selenium 方法和断言的其他包装器。
如果您只对一个应用程序进行测试并且不会进一步使用 Selenium,那么框架不适合您。此外,包装器在您的测试解决方案之外会有点多余。
我想说的是,包装器仅在您多次使用它的上下文中才有用(例如单击或查找元素等)