之前为我们部门做的一个 UI 框架。 不能纯粹解读为框架,主要是做了一些简单的分层设计,以解决稳定性、降低复杂性、提升可维护性以及快速构建测试用例等实际问题。
主要部分:
内容太少了, 有个代码例子吗
可以更深入的分享一下。
有创新点么?
@squallff 应该没什么创新点。
本人水平比较有限,还请高手指点啊!
原来想做的简单一点,尽可能简单,稳定一点。 现在来看稳定性也只有 75%。(超时,等待,或者业务逻辑)
下面是一个简单的代码片段。
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 原则。