Selenium测试框架 我认为它行!
老早就想写一些Selenium测试框架的搭建,但是时间和想法都不太成熟。今天就大概粗略的和大家分享一下。
本文的背景假设读者有一定的selenium使用经验。
1.元素定位
大家都知道,网页这个东西在浏览器里展现出来的是一个完整的xml,所以可以通过xml的访问方式,字符串查询,正则等来访问xml。
selenium支持的遍历模式有:
1 public class By 2 { 3 protected By(); 4 protected By(Func<ISearchContext, IWebElement> findElementMethod, Func<ISearchContext, ReadOnlyCollection<IWebElement>> findElementsMethod); 5 6 public static bool operator !=(By one, By two); 7 public static bool operator ==(By one, By two); 8 9 protected string Description { get; set; } 10 protected Func<ISearchContext, IWebElement> FindElementMethod { get; set; } 11 protected Func<ISearchContext, ReadOnlyCollection<IWebElement>> FindElementsMethod { get; set; } 12 13 public static By ClassName(string classNameToFind); 14 public static By CssSelector(string cssSelectorToFind); 15 public override bool Equals(object obj); 16 public virtual IWebElement FindElement(ISearchContext context); 17 public virtual ReadOnlyCollection<IWebElement> FindElements(ISearchContext context); 18 public override int GetHashCode(); 19 public static By Id(string idToFind); 20 public static By LinkText(string linkTextToFind); 21 public static By Name(string nameToFind); 22 public static By PartialLinkText(string partialLinkTextToFind); 23 public static By TagName(string tagNameToFind); 24 public override string ToString(); 25 public static By XPath(string xpathToFind); 26 }
大家可以看到最后一个是通过xpath,其他的例如classname,cssselector等估计也是通过xpath来实现的。大家可以去具体看看webdrvier实现的源码,验证一下思想,如果后续有时间,我会剖析一下webdriver的源代码。
好了,有了xpath,就可以定位网页上的元素了。
我们可以将当前这个元素放在一个xml里,并且存储格式如下:
1 <Root> 2 <HomePage> 3 <Element> 4 <Name>Logo</Name> 5 <XPath>//*[@id="logo"]/h1/a/img</XPath> 6 </Element> 7 </HomePage> 8 </Root>
进而可以写出一个获取Logo的方法:
1 /// <summary> 2 /// A xml reader to access xml to get xpath of the target element 3 /// </summary> 4 /// <param name="pageName">The name of the page which has target element</param> 5 /// <param name="name">The name of target element</param> 6 /// <returns>The xpath of target element</returns> 7 static string GetElementXPath(string pageName, string name) 8 { 9 using (var outReader = XmlReader.Create("XXXXXXX.xml")) 10 { 11 while (outReader.Read()) 12 { 13 if (outReader.NodeType == XmlNodeType.Element) 14 { 15 if (outReader.Name == pageName) 16 { 17 using (var innerReader = outReader.ReadSubtree()) 18 { 19 while (innerReader.Read()) 20 { 21 if (innerReader.Name == "Name") 22 { 23 innerReader.Read(); 24 if (innerReader.ReadContentAsString() == name) 25 { 26 if (innerReader.ReadToNextSibling("XPath")) 27 { 28 innerReader.Read(); 29 return innerReader.ReadContentAsString(); 30 } 31 } 32 } 33 } 34 } 35 } 36 } 37 } 38 } 39 40 return null; 41 }
进而可以定义出一个全局的xpath变量:
1 public static readonly string LOGOIMAGE= GetElementXPath("HomePage", "Logo");
2.网页的viewer化
1 public class CNBlogHomePage : PageBase 2 { 3 public CNBlogHomePage(IWebDriver webDriver) : base(webDriver) { } 4 5 public IWebElement Logo 6 { 7 get 8 { 9 return _webDriver.FindElement(By.XPath(LOGOIMAGE)); 10 } 11 } 12 }
PageBase在这:
1 public abstract class PageBase 2 { 3 public IWebDriver _webDriver; 4 5 public PageBase(IWebDriver webDriver) 6 { 7 _webDriver = webDriver; 8 } 9 }
3.测试case的书写
1[TestMethod] 2[TestProperty("TestcaseId", "00000")] 3[TestProperty("Description", "XXXXXXXXXXXX")] 4public void CreateUser() 5{ 6 using (var browser = new ChromeDriver()) 7 { 8 CNBlogHomePage home=new CNBlogHomePage (browser); 9 home.Logo.Click(); 10 11 12 .................. 13 } 14 }
匆匆完毕,收工。其中定有不足之处,请大家指正。
几点后记:
1.对于多浏览测试,可以对webdriver的种类就行封装,通过指定浏览器类型,版本来调用相应的浏览器。缺点是在单机上不好安装多版本浏览器。
2.配置grid,架设一系列虚拟机,安装纯净的各种环境。缺点是需要配置管理工作。
3.对于某些测试,不需要打开浏览器的,可以对Element进行封装,绕过webdriver,直接download web page source进行分析,增加性能。
4.可以开发一个自动viewer的可视化工具,自动将热点element转换为code
5.浏览器driver的实现是非托管的,所以在某些时候要注意反复多开的清理工作。
本文来源 我爱IT技术网 http://www.52ij.com/jishu/5497.html 转载请保留链接。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
