Appium-UWP FindElementByXPath定位元素总结

上一篇 / 下一篇  2017-11-14 10:01:34 / 个人分类:Appium

  经过几天研究学习,UWP通过FindElementByXPath绝对路径定位终于跑成功了,需要好好总结一下。
1.如何通过工具找到元素的绝对路径
  GitHub网站上WinDriverApp API页面介绍UWP元素检测工具inspect.exe,但这个工具show出来的Ancestors的字母都是小写,如果写为XPath路径,则会在运行过程中抛invalid XPath Expression异常,而且inspect.exe工具show的ancestors字节也会有错误,对于新手来说会找不到解决的方法,不知道哪里出现错误。
  如下是inspect.exe工具检测的Check for update按钮的绝对路径:
  

  inspect.exe工具显示的元素路径跟下面的PageSource.xml有点区别,多了个Desktop 1根节点,还有List Item也不是写在一起的。所以会导致在用XPath定位元素的时候,无法定位到,总是抛出异常。
 那么怎么解决XPath这个问题呢?目前我学到方法是通过App的Page Source来查看这个元素的路径。
  怎么导出App的Page Source呢?
 1) 在UWP自动化测试总结一文中提到了一种,那就是通过以下代码来进行导出:
 //这是C#代码
System.IO.File.AppendAllTexts(@"D:\PageSource.xml",driver.PageSource);
//这是Java代码
System.IO.File.AppendAllTexts("D:\\PageSource.xml",driver.PageSource);

 2)另外一种方式是通过XML相关的文档输出流来进行导出,具体代码如下:
  
   System.Xml.XmlDocument doc=new System.Xml.XmlDocument();
   doc.LoadXml(driver.pageSource.ToString());
   System.Xml.XmlTextWriter writer=new System.Xml.xmlTextWriter(@"D:\AppPageSource.xml",new System.Text.UnicodeEncoding());
   Writer.Formatting=System.Xml.Formatting.Indented;
   doc.WriteContentTo(Writer);


 App的Page Source导出来了,现在需要用xml阅读器把AppPageSource.xml打开,用xml阅读器打开这个xml文档的时候可能会遇到“There is no Unicode byte order mark.Cannot switch to Unicode.”这个问题是因为导出的xml编码格式是UTF-16导致的,可以把文档的编码格式编辑改为UTF-8,然后就可以成功打开。

2.写XPath时需要注意什么
 通过Page Source已经知道了各个元素的路径,可以通过相对路径也可以通过绝对路径来进行定位元素,但在定位元素时需要注意的是:
 1)节点索引值是从1开始,不是从0开始
   我在GitHub网站WinAppDriver页面上的Readme文档中看到Supported Locators to Find UI Elements表格FindElementByXPath一栏中,列出的Example中是//Button[0],而实际上我用在UWP类App定位时失败,所以XPath下的索引值跟Selenium中相同,并不是0开始,而是从1开始。
   而在获取页面元素个数时,要通过索引下标获取对应元素时,这时下标是从0开始的,所以不能搞混了,这个很容易搞混的。
 2)Appium的XPath大小写敏感,需要严格区分
  各个节点类型的首字母,以及属性的首字母都要大写,如下图的Page Source
   


  那我要点击Window->window->Pane->第三个List-下的第一个ListItem下的第二个Button时,则可以写这样写:
//这是绝对路径写法
driver.FindElementByXPath("/Window[@Name=\"Lenovo Companion\"]/Window[@Name=\"Lenovo Companion\"]/Pane/List[3]/ListItem[@Name=\"System Update\"]/Button[@Name=\"Check for updates\"]").Click();
//这是相对路径写法,
driver.FindElementByXpath("//Button[@Name=\"Check for updates\"]").click();

 这里的属性名Name和节点如Window,Pane,List等均需要大写首字母,属性值则是按照引号中的值来写。
由于写相对路径则会解决不了当同一页面上同时有多个相同属性名的按钮,当然也可以通过其他不同属性值来进行区分,如ClassName不同进行区分,还有很多其他方式,看哪种方式方便,使用哪种方式。

3)XPath下的属性值引用的符号可以是单引号也可以是双引号,如下:
 driver.FindElementByXPath("/Window[@Name=\"*****\"]/Window[@Name=\"******\"]/Pane/List[3]/ListItem[@Name=\"System Update\"]/Button[@Name=\"Check for updates\"]").Click();
 这里的@Name=\"***\",也可以写为@Name='***',即上面代码改为:
 driver.FindElementByXPath("/Window[@Name='Lenovo Companion']/Window[@Name='Lenovo Companion']/Pane/List[3]/ListItem[@Name='System Update']/Button[@Name='Check for updates']").Click();

更多的XPath方式可以学习XPath的定位语法。
  


TAG:

 

评分:0

我来说两句

Open Toolbar