什么是硒包装器?

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 方法的包装。以下两段代码是等价的——它们做同样的事情:

  1. 硒(和 Java)
WebElement element = driver.findElement(By.cssSelector("css-selector-of-the-element"));
element.click();
  1. 卡塔隆
WebUI.click(testObject) //testObject defined elsewhere

这只是一个简单的示例,但它展示了如何在更简单的命令背后隐藏复杂性。

“Wrapper”更像是一种软件开发设计模式,开发人员在必要时在代码库中使用。

您可以在本书中阅读更多内容:

https://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612/ref=sr_1_2?dchild=1&keywords=software+development+patterns&qid=1605187094&sr=8-2

在自动化测试范围内,还有其他术语。我将解释移动自动化。

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,那么框架不适合您。此外,包装器在您的测试解决方案之外会有点多余。

我想说的是,包装器仅在您多次使用它的上下文中才有用(例如单击或查找元素等)