其他测试框架 分享:Web UI 自动化应用测试框架 - 概览

卡农Lucas · 2015年01月26日 · 最后由 卡农Lucas 回复于 2015年01月27日 · 2456 次阅读

之前为我们部门做的一个 UI 框架。
不能纯粹解读为框架,主要是做了一些简单的分层设计,以解决稳定性、降低复杂性、提升可维护性以及快速构建测试用例等实际问题。

主要部分:

  1. 测试数据。主要提供测试类库需要用到的数据,前端做到数据驱动。
  2. 测试服务。测试服务类主要提供一组 API,达到重用的目的。
  3. 页面封装。对具体的 Web 页面进行抽象和封装,提供统一的接口,降低逻辑的编写门槛,组件重用以及更好的可维护和可读性。
  4. Selenium Web Driver。底层用的 WebDriver。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 6 条回复 时间 点赞

内容太少了, 有个代码例子吗

可以更深入的分享一下。

有创新点么?

@squallff 应该没什么创新点。

本人水平比较有限,还请高手指点啊!

原来想做的简单一点,尽可能简单,稳定一点。
现在来看稳定性也只有 75%。(超时,等待,或者业务逻辑)

  1. 元素采用了延迟初始化。
  2. 通用的等待方法。
  3. 封装页面。
  4. 封装控件。
  5. 回调函数。
  6. 通用类库。
  7. 数据转换及暂存。

下面是一个简单的代码片段。

public class AItemControl : BaseControl
{
    private Lazy<IWebElement> _headElement;
    private Lazy<IWebElement> _test1Element;
    private Lazy<IWebElement> _test1UlElement;
    private Lazy<IWebElement> _test1Element;
    private Lazy<IWebElement> _test1Element;

    private By _headElemBy;
    private By _test1ElemBy;
    private By _test1UlElemBy;
    private By _test1ElemBy;
    private By _test1ElemBy;

    public AItemControl(IWebDriver driver)
        : base(driver)
    {
        InitBy();
        InitLazy();
    }

    private void InitBy()
    {
        _headElemBy    = By.ClassName("");
        _test1Element  = By.XPath("");
        _test1UlElemBy = By.Id("");
        _test1ElemBy   = By.Id("");
        _test1ElemBy   = By.Id("");
    }

    private void InitLazy()
    {
        LazyInitialization(out _headElement  , _headElemBy);
        LazyInitialization(out _test1Element , _test1Element);
        LazyInitialization(out _test1UlElemBy, _test1UlElemBy);
        LazyInitialization(out _test1ElemBy  , _test1ElemBy);
        LazyInitialization(out _test1ElemBy  , _test1ElemBy);
    }

    public bool IsSelected()
    {
        IWebElement headDiv = _headElement.Value;

        IWebElement bodyDiv = headDiv.FindElement(
            By.CssSelector(""));

        return bodyDiv.Displayed;
    }

    public void Select()
    {
        if (!IsSelected())
        {
            Misc.Action_LazyClick(_headElement);
        }
    }

    public string GetTicketCity()
    {
        return Misc.Action_LazyGetText(_test1Element);
    }

    public IEnumerable<string> GetAddresses()
    {
        IWebElement ul = _addressUlElement.Value;

        foreach (IWebElement e in ul.FindElements(By.TagName("li")))
        {
            yield return e.Text;
        }
    }
}

Lazy 这个想法很好,这也正是 PageObjectFactory 本身帮我们做了的事情。PageObject 中的元素本身就是延迟加载,并且可以使用查询 cache
http://relevantcodes.com/pageobjects-and-pagefactory-design-patterns-in-selenium/#CacheLookup

如果我们对第三方框架多了解一些,很多美好的想法,都已经实现了。这也正是在 ctrip 比较难过的事情,很多框架各种封装,所谓简单,都已经改变了一些标准和第三方框架本身的设计,面目全非,经不起推敲,而繁琐。

@cosyman 恩,同意蓝天同学的观点。很多项目前期还是对框架缺乏深入的了解,调研不够;有的人(比如我)总想自己写写,重复造轮子的事情很多。我觉得学会整合资源,坚持 K.I.S.S 原则。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册