• find_element_by_xpath("//android.support.v4.view.ViewPager/android.widget.Linearlayout/android.widget.LinearLayout[3]/android.widget.Button[1]") 从外往里一层一层的剥,最终找到要的元素。...

    1.通过xpath定位元素

    uiautomatorviewer  获取元素路径

    2. 像图片1的元素路径 为:

    find_element_by_xpath("//android.support.v4.view.ViewPager/android.widget.Linearlayout/android.widget.LinearLayout[3]/android.widget.Button[1]")

    从外往里一层一层的剥,最终找到要的元素。

    注意:xpath路径不能从最外层的整个页面开始,那样会报错。要从包含该控件的最上层的class开始写。

    什么是包含该空间的最上层元素呢? 像这里是:android.support.v4.view.ViewPager

    我们点击 android.support.v4.view.ViewPager 就发现 实际就是整个键盘区域

    andriod.support.v4.view.ViewPager

    元素的定位貌似和我们用uiautomatorviewer获取到的不一致。

    android.widget.LinearLayout[3]/android.widget.Button[1]  而不是 android.widget.LinearLayout[2]/android.widget.Button[0]

    笔者认为要 定位第三个android.widget.Linearlayout中的第一个button.

    有一种说法xpath定位元素是从1开始 而不是从0开始

     

    转载于:https://www.cnblogs.com/dongtian/p/9568283.html

    展开全文
  • 1、把下载好的jar包uiautomatorviewer.jar拷贝到安卓安装目录 \Android-sdk\tools\lib 文件夹中替换掉原来的uiautomatorviewer.jar包。 2、双击安卓安装目录下的 \android-sdk\tools\uiautomatorviewer.bat 文件,...
  • android XPath 解析xml

    2011-12-29 12:28:54
    XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。 XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 同时被构建于 XPath 表达之上。 因此,对 XPath 的理解...
    
    

    XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。

    XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 同时被构建于 XPath 表达之上。

    因此,对 XPath 的理解是很多高级 XML 应用的基础。具体学习XPath参照http://www.w3school.com.cn/xpath/index.asp

    XPath只适合用来查询xml的信息,对于完整的解析xml文件的建议不要使用这个方式,最好的解析xml文件应该是sax,pull这两种方式。

    我是在android 2.2系统上做的这个测试,低于2.2不知道行不行。

    下面就具体说下XPath解析xml的步骤:xpathTest.xml 和android dom 解析xml方式 中的DomTest.xml一样

    1、创建InputSources

    2、获得XPathFactory实例。

    3、用XPathFactory实例获取XPath的实例

    4、XPath调用evaluate()方法获取查询出的NodeList

     private void xPathParserXml(){
        	//获取XPathFactory实例
        	XPathFactory factory = XPathFactory.newInstance();
        	//用工程生成XPath实例,解析xml
        	XPath xpath = factory.newXPath();
        	//
    		try {
    			InputSource source = new InputSource(getResources().getAssets().open("xPathTest.xml"));
    	    
    			//第一个参数:需要查询的节点名称,必须要在节点前加“//”
    	    	//第二个参数:查询的输入源
    	    	//第三个参数:返回的类型
    //	    	NodeList nodeList = (NodeList) xpath.evaluate("//group", source, XPathConstants.NODESET);
    //	    	if(nodeList != null && nodeList.getLength() > 0){
    //	    		for(int i = 0;i < nodeList.getLength();i++){
    //	    			Node node = nodeList.item(i);
    //	    			//在这也可以得到<group>的子节点<person>。但是这样不符合xpath的风格。
    //	    			NodeList personList = node.getChildNodes();
    //	    			Element  nodeAttr =(Element)node;
    //	    			String groupName = nodeAttr.getAttribute("name");
    //	    			String num = nodeAttr.getAttribute("num");
    //	    			
    //	    			Log.e("TEST", ""+groupName+"   "+num);
    //	    		}
    //	    	}
    			
    //	    	//获取<person>节点信息
    //	    	NodeList personList = (NodeList) xpath.evaluate("//person", source, XPathConstants.NODESET);
    //	    	if(personList != null && personList.getLength() > 0){
    //	    		for(int i = 0;i < personList.getLength();i++){
    //	    			Element node = (Element)personList.item(i);
    //	    			//在这也可以得到<person>的子节点<chinese>和<english>。
    //	    			NodeList childList = node.getChildNodes();
    //	    			String groupName = node.getAttribute("name");
    //	    			String age = node.getAttribute("age");
    //	    			
    //	    			Log.e("TEST", ""+groupName+"   "+age);
    //	    		}
    //	    	}
    	    	
    	    	//获取<chinese>节点信息
    			NodeList chineseList = (NodeList) xpath.evaluate("//chinese", source, XPathConstants.NODESET);
    	    	if(chineseList != null && chineseList.getLength() > 0){
    	    		for(int i = 0;i < chineseList.getLength();i++){
    	    			Node node = chineseList.item(i);
    	    			String chinese = node.getTextContent();
    	    			Log.e("TEST", ""+chinese);
    	    		}
    	    	}
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (XPathExpressionException e) {
    			e.printStackTrace();
    		}
        	
        }

    注意:xpath.evaluate()不能调用两次,报错误。至于原因不清楚。知道原因的请留言告知,谢谢。

    对已有人提出XPath能不能查询很大的xml文件(超过1M或),这个在理论上应该可以,只要你能解决InputSource可以读取大容量文件问题就可以了。

    具体的方法小弟不知道。

    希望大家多多指点。

    展开全文
  • 1.相关链接:http://blog.csdn.net/fengyang_123456/article/details/62065337 ... 在写脚本的过程中,总是遇到标签没有ID或者name等类似的唯一识别属性,为了能识别到这些对象,只能通过xpath了。可是sdk自带

    1.相关链接:http://blog.csdn.net/fengyang_123456/article/details/62065337

    参考文档:http://blog.csdn.net/kaka1121/article/details/53301517
    在写脚本的过程中,总是遇到标签没有ID或者name等类似的唯一识别属性,为了能识别到这些对象,只能通过xpath了。可是sdk自带的uiautomatorviewer并不能获得xpath。在网上找到一个资源可以自动获取xpath–lazy-uiautomatorviewer.
    jar包下载地址:http://download.csdn.net/detail/kaka1121/9685936
    源码下载地址:https://github.com/lazytestteam/lazyuiautomatorviewer;

    1.下载
    下载好jar包后把uiautomatorviewer.jar拷贝到安卓安装目录下的
    \Android-sdk\tools\lib 文件夹中替换掉原来的uiautomatorviewer.jar包。
    双击安卓安装目录下的 \android-sdk\tools\uiautomatorviewer.bat 文件,启动lazy-uiautomatorviewer。
    2。使用
    打开后的uiautomator view如下显示
    这里写图片描述
    在识别元素时,选择左上角的device screenshot,而不用device screenshot with compressed。第二个是经过压缩后的screenshot,得到xpath也是不全的,通过这个xpath很有可能会识别不到对象。
    这里写图片描述
    得到xpath 之后就可以通过driver.find_element_by_xpath(”)的方法来操作对象了。

    展开全文
  • <div> <a id="1" href="www.baidu.com">我是第1个a标签</a> <p>我是p标签</p> <a id="2" href="www.baidu.com">我是第2个a标签</a> <a id="3" href=...


    <div>
        <a id="1" href="www.baidu.com">我是第1个a标签</a>
        <p>我是p标签</p>
        <a id="2" href="www.baidu.com">我是第2个a标签</a>
        <a id="3" href="www.baidu.com">我是第3个a标签</a>
        <a id="4" href="www.baidu.com">我是第4个a标签</a>
        <p>我是p标签</p>
        <a id="5" href="www.baidu.com">我是第5个a标签</a>
    </div>
    获取第三个a标签的下一个a标签:"//a[@id='3']/following-sibling::a[1]"

    获取第三个a标签后面的第N个标签:"//a[@id='3']/following-sibling::*[N]"

    获取第三个a标签的上一个a标签:"//a[@id='3']/preceding-sibling::a[1]"

    获取第三个a标签的前面的第N个标签:"//a[@id='3']/preceding-sibling::*[N]"

    获取第三个a标签的父标签:"//a[@id=='3']/.."



    原文:https://blog.csdn.net/qq_37059367/article/details/83819828 

    展开全文
  • XPath轴(XPath Axes)可定义某个相对于当前节点的节点集: 1、child 选取当前节点的所有子元素 2、parent 选取当前节点的父节点 3、descendant 选取当前节点的所有后代元素(子、孙等) 4、ancestor 选取当前节点的...

    XPath轴(XPath Axes)可定义某个相对于当前节点的节点集: 
    1、child 选取当前节点的所有子元素 
    2、parent 选取当前节点的父节点 
    3、descendant 选取当前节点的所有后代元素(子、孙等) 
    4、ancestor 选取当前节点的所有先辈(父、祖父等) 
    5、descendant-or-self 选取当前节点的所有后代元素(子、孙等)以及当前节点本身 
    6、ancestor-or-self 选取当前节点的所有先辈(父、祖父等)以及当前节点本身 
    7、preceding-sibling 选取当前节点之前的所有同级节点 
    8、following-sibling 选取当前节点之后的所有同级节点 
    9、preceding 选取文档中当前节点的开始标签之前的所有节点 
    10、following 选取文档中当前节点的结束标签之后的所有节点 
    11、self 选取当前节点 
    12、attribute 选取当前节点的所有属性 
    13、namespace 选取当前节点的所有命名空间节点 
    如:要定位当前td同级后的一个td

    //td[.='text']/following-sibling::td 

         following-sibling 选取当前节点之后的所有同级节点,跟preceding-sibling一样都是选取同级同父的节点,只不过following是取对应节点之后的节点,preceding-sibling取的是该节点之前的节点。

     

         /AAA/BBB/following-sibling::*    取/AAA/BBB节点的之后的所有同级节点

      <AAA> 
         <BBB> 
              <CCC/> 
              <DDD/> 
         </BBB> 
         <XXX> 
              <DDD> 
                   <EEE/> 
                   <DDD/> 
                   <CCC/> 
                   <FFF/> 
                   <FFF> 
                        <GGG/> 
                   </FFF> 
              </DDD> 
         </XXX> 
         <CCC> 
              <DDD/> 
         </CCC> 
       </AAA>

         //CCC/following-sibling::*    选取所有CCC元素的之后所有同级节点

    
    
       <AAA>       
    
         <BBB>       
    
              <CCC/>       
    
              <DDD/>       
    
         </BBB>       
    
         <XXX>       
    
              <DDD>       
    
                   <EEE/>       
    
                   <DDD/>       
    
                   <CCC/>       
    
                   <FFF/>       
    
                   <FFF>       
    
                        <GGG/>       
    
                   </FFF>       
    
              </DDD>       
    
         </XXX>       
    
         <CCC>       
    
              <DDD/>       
    
         </CCC>       
    
       </AAA>
    
    
    
    
    
    

    今天跟大家分享下selenium中根据父子、兄弟、相邻节点定位的方法,很多人在实际应用中会遇到想定位的节点无法直接定位,需要通过附近节点来相对定位的问题,但从父节点定位子节点容易,从子节点定位父节点、定位一个节点的哥哥节点就一筹莫展了,别急,且看博主一步步讲解。

    
     

    1. 由父节点定位子节点

    
     

    最简单的肯定就是由父节点定位子节点了,我们有很多方法可以定位,下面上个例子:

    
     

    对以下代码:

    
     
    <html>
    <body>
    <div id="A">
        <!--父节点定位子节点-->
        <div id="B">
            <div>parent to child</div>
        </div>
    </div>
    </body>
    </html>
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    
     

    想要根据 B节点 定位无id的子节点,代码示例如下:

    
     
    # -*- coding: utf-8 -*-
    from selenium import webdriver
    
    driver = webdriver.Firefox()
    driver.get('D:\\py\\AutoTestFramework\\src\\others\\test.html')
    
    # 1.串联寻找
    print driver.find_element_by_id('B').find_element_by_tag_name('div').text
    
    # 2.xpath父子关系寻找
    print driver.find_element_by_xpath("//div[@id='B']/div").text
    
    # 3.css selector父子关系寻找
    print driver.find_element_by_css_selector('div#B>div').text
    
    # 4.css selector nth-child
    print driver.find_element_by_css_selector('div#B div:nth-child(1)').text
    
    # 5.css selector nth-of-type
    print driver.find_element_by_css_selector('div#B div:nth-of-type(1)').text
    
    # 6.xpath轴 child
    print driver.find_element_by_xpath("//div[@id='B']/child::div").text
    
    driver.quit()
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    
     

    结果:

    
     
    parent to child
    parent to child
    parent to child
    parent to child
    parent to child
    parent to child
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    
     

    第1到第3都是我们熟悉的方法,便不再多言。第4种方法用到了css选择器:nth-child(n),该选择器返回第n个节点,该节点为div标签;第5种方法用到了另一个css选择器: nth-of-type(n),该选择器返回第n个div标签,注意与上一个选择器的区别;第6种方法用到了xpath轴 child,这个是xpath默认的轴,可以忽略不写,其实质是跟方法2一样的。

    
     

    当然,css中还有一些选择器是可以选择父子关系的如last-childnth-last-child等,感兴趣可以自行百度,有机会博主会讲讲css selector。

    
     

    2. 由子节点定位父节点

    
     

    由子节点想要定位到父节点就有点难度了,对以下代码:

    
     
    <html>
    <body>
    <div id="A">
        <!--子节点定位父节点-->
        <div>
            <div>child to parent
                <div>
                    <div id="C"></div>
                </div>
            </div>
        </div>
    </div>
    </body>
    </html>
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    
     

    我们想要由 C节点 定位其两层父节点的div,示例代码如下:

    
     
    # -*- coding: utf-8 -*-
    from selenium import webdriver
    
    driver = webdriver.Firefox()
    driver.get('D:\\py\\AutoTestFramework\\src\\others\\test.html')
    
    # 1.xpath: `.`代表当前节点; '..'代表父节点
    print driver.find_element_by_xpath("//div[@id='C']/../..").text
    
    # 2.xpath轴 parent
    print driver.find_element_by_xpath("//div[@id='C']/parent::*/parent::div").text
    
    driver.quit()
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    
     

    结果:

    
     
    child to parent
    child to parent
    
     
    • 1
    • 2
    
     

    这里我们有两种办法,第1种是 .. 的形式,就像我们知道的,. 表示当前节点,.. 表示父节点;第2种办法跟上面一样,是xpath轴中的一个:parent,取当前节点的父节点。这里也是css selector的一个痛点,因为css的设计不允许有能够获取父节点的办法(至少目前没有)

    
     

    3. 由弟弟节点定位哥哥节点

    
     

    这是第3、第4种情况,我们这里要定位的是兄弟节点了。如以下源码:

    
     
    <html>
    <body>
    <div>
        <!--下面两个节点用于兄弟节点定位-->
        <div>brother 1</div>
        <div id="D"></div>
        <div>brother 2</div>
    </div>
    </body>
    </html>
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    
     

    怎么通过 D节点 定位其哥哥节点呢?看代码示例:

    
     
    # -*- coding: utf-8 -*-
    from selenium import webdriver
    
    driver = webdriver.Firefox()
    driver.get('D:\\Code\\py\\AutoTestFramework\\src\\others\\test.html')
    
    # 1.xpath,通过父节点获取其哥哥节点
    print driver.find_element_by_xpath("//div[@id='D']/../div[1]").text
    
    # 2.xpath轴 preceding-sibling
    print driver.find_element_by_xpath("//div[@id='D']/preceding-sibling::div[1]").text
    
    driver.quit()
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    
     

    结果

    
     
    brother 1
    brother 1
    
     
    • 1
    • 2
    
     

    这里博主也列举了两种方法,一种是通过该节点的父节点来获得哥哥节点,另外一种比较优雅,是通过 xpath轴:preceding-sibling,其能够获取当前节点的所有同级哥哥节点,注意括号里的标号,1 代表着离当前节点最近的一个哥哥节点,数字越大表示离当前节点越远,当然,xpath轴:preceding也可以,但是使用起来比较复杂,它获取到的是该节点之前的所有非祖先节点(这里不太好解释,改天专门写篇博文讲解下所有的轴)

    
     

    4. 由哥哥节点定位弟弟节点

    
     

    源码与 3 一致,要想通过 D节点 定位其弟弟节点,看代码示例:

    
     
    # -*- coding: utf-8 -*-
    from selenium import webdriver
    
    driver = webdriver.Firefox()
    driver.get('D:\\Code\\py\\AutoTestFramework\\src\\others\\test.html')
    
    # 1.xpath,通过父节点获取其弟弟节点
    print driver.find_element_by_xpath("//div[@id='D']/../div[3]").text
    
    # 2.xpath轴 following-sibling
    print driver.find_element_by_xpath("//div[@id='D']/following-sibling::div[1]").text
    
    # 3.xpath轴 following
    print driver.find_element_by_xpath("//div[@id='D']/following::*").text
    
    # 4.css selector +
    print driver.find_element_by_css_selector('div#D + div').text
    
    # 5.css selector ~
    print driver.find_element_by_css_selector('div#D ~ div').text
    
    driver.quit()
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    
     

    结果:

    
     
    brother 2
    brother 2
    brother 2
    brother 2
    brother 2
    
     
    • 1
    • 2
    • 3
    • 4
    • 5
    
     

    博主分享了五种方法定位其弟弟节点,上面三种是用xpath,第一种很好理解,第二种用到了xpath轴:following-sibling,跟preceding-sibling类似,它的作用是获取当前节点的所有同级弟弟节点,同样,1 代表离当前节点最近的一个弟弟节点,数字越大表示离当前节点越远;第三种用到了xpath轴:following,获取到该节点之后所有节点,除了祖先节点(跟preceding方向相反,但因为往下顺序容易读,不容易出错,所以也是可以用来获取弟弟节点的,但也不建议这么使用);第四、第五种,我们用到了css selector,+ 和 ~ 的区别是: +表示紧跟在当前节点之后的div节点,~ 表示当前节点之后的div节点,如果用find_elements,则可获取到一组div节点。

    展开全文
  • xPath获取控件方式 2.1 通过判断控件属性获取控件 控件的所有属性都可以用作判断,比如它的text,index,resource-id是否clickable等,例如: 2.1.1 通过文本查找目标控件 WebElement target1 = driver....
  • 如文章《Appium基于安卓的各种FindElement的控件定位方法实践》所述,Appium拥有众多获取控件的方法。其中一种就是根据控件所在页面的XPATH来定位控件。 本文就是尝试通过自己的试验来尝试对Appium如何用xpath来...
  • 作者:cryanimal QQ:164166060 工具由来 前面的一篇博文较详细地介绍了uiautomatorviewer:扫描和分析Android应用程序的UI控件的工具。 熟悉控件获取的同学都知道,使用uiautomatorviewer可以抓取到的用来定位控件的...
  • XPath 是一门在 XML 文档中查找信息的语言。XPath 用于在 XML 文档中通过元素和属性进行导航。 XPath简介 XPath 是一个 W3C 标准 , XPath 于 1999 年 11 月 16 日 成为 W3C 标准。 XPath 使用路径表达式来选取 XML...
  • 最近一直在用java做爬虫,都是一些没有技术含量的活,仔细想一下底层用到的大概有这算法,一个是匹配算法、一个关于树的算法,全都给我们封装好了,java真是方便、无脑,当然也很low,但是个人原因,工作效率并不高
  • //执行脚本命令 public String runCommand(String cmd,String para,String envName) throws Exception{ { ...... //设置判断元素是否存在时,等待时长15秒 WebElement authorWait = this.findElement(15, id...
  • 最近再写一个android音乐播放器应用,因为需要获得歌手的头像图片,在没有找到合适的获取歌手信息API的情况下,打算直接用百度百科中的歌手头像来实现。这里也就是利用Xpath获取歌手图片的链接地址了。 这里直接...
  • 春天到了,又是交配、咳咳找工作的季节,各种招聘网站也开始活跃起来,为了服务身边的程序员朋友,于是用scrapy写了一个简单的招聘网站的爬取程序,用来自动获取更新招聘信息。 scrapy使用熟练了,用起来还是挺...
  • 如文章《Appium基于安卓的各种FindElement的控件定位方法实践》所述,Appium拥有众多获取控件的方法。其中一种就是根据控件所在页面的XPATH来定位控件。 本文就是尝试通过自己的试验来尝试对Appium如何用xpath来定位...
  • 1、替换Android\android-sdk\tools\lib目录下的uiautomatorviewer.jar 2、百度云盘下载地址:https://pan.baidu.com/s/1slbe2oX 备注:此工具是在网上收集,所有权归创作者所有。 转载于:...
  • 这个我也是在GitHub上面找到的,我使用过的,需要的可以下载使用!
1 2 3 4 5 ... 20
收藏数 4,013
精华内容 1,605
关键字:

xpath 获取android