3

它是否围绕 Selenium 提供了一种更简单或不同的调用 Selenium 功能的方法?

我在谷歌上查了一下,我能找到的最好的信息是这个https://www.ontestautomation.com/using-wrapper-methods-for-better-error-handling-in-selenium/

这并没有明确解释 Selenium 包装器是什么,但提供了足够的信息来帮助理解它是什么。

4

3 回答 3

2

“包装器”的定义之一是:

在软件工程的上下文中,包装器被定义为一个实体,它通过定义良好的接口封装和隐藏另一个实体的底层复杂性。

因此,您可能使用的任何实现 Selenium 代码的自定义代码都可以理解为包装器。

例如,Katalon Studio 是一个在底层使用 Selenium 的测试工具,即 Katalon 的WebUI类方法是 Selenium 方法的包装器。以下两段代码是等价的——它们做同样的事情:

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

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

于 2020-07-01T08:49:25.950 回答
1

我知道这个问题已经得到回答,但我可以看到它从未被接受为答案。现在,上面的答案准确地解释了包装器是什么:封装。这本身也意味着它隐藏了另一个实体(在本例中为 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,那么框架不是您的解决方案。在您的测试解决方案之外,包装器也是一种冗余。

我会说包装器仅在您对其进行多次使用的上下文中才有用(例如单击或查找元素等)

于 2021-01-12T14:57:02.287 回答
0

“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

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

驱动程序(Espresso、UIAutomator、Robotium、XCUITest) - 从测试接收命令并以可理解的方式将它们发送到应用程序专用界面

您向 GUI 驱动程序发送了一个按下按钮的命令 - 它通过 API 接受它并发送到应用程序(我们在 GUI 中看到对按钮的点击)。

另一个应用程序(在驱动程序之上,我们在此上下文中称其为上层结构)通过一个或多个驱动程序(增加可用性或增加可能性)与被测应用程序交互,例如 Appium、Calabash。

框架(JUnit、TestNG、Cucumber)——允许我们准备、启动和收集有关测试执行的所有信息的应用程序

它看起来像这样:

框架 -> 我们的测试 -> 上层结构 -> 驱动程序 -> 我们应用程序中的 GUI

于 2020-11-12T13:51:21.167 回答