元素定位-XPATH定位方法总结

1、Xpath定位方法探讨

xpath是比较常用的一种定位元素的方式,因为它很方便,缺点是,消耗系统性能。如果Xpath使用的比较好,几乎可以定位到任何页面元素,而且受页面变化影响较小。

1.1、什么是XPATH:

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

  详细使用方法可见 W3School官方文档:http://www.w3school.com.cn/xpath/index.asp

1.2、XPATH节点选择方式

1)Chrome插件工具:Xpath helper可以验证定位元素的位置准确性、可以查看某个元素的xpath路径,但路径通常较长不建议此方式

2)Chrome浏览器:鼠标右键copy->Copy Xpath直接复制某个元素xpath路径(常用方式)

3)手动编写xpath路径:方式二不能满足所有情况,需要手动微调路径借助方式一来验证

1.3、XPATH节点定位方法与特点

  • 使用绝对路径定位元素

  例如:driver.findElement(By.xpath("/html/body/div/form/input"))。

  特点:这个路径是从网页起始标签开始一直到要定位的元素的路径,如果要定位的元素在页面最下面,则这个Xpath路径会非常长。如果在要定位的元素与页面开始之间的元素有任何增减,元素定位就会失败。

  • 使用相对路径定位元素

  例如:driver. findElement(By.xpath ("//input") ) 返回查找到的第一个符合条件的元素。

  特点:相对路径一般只会包含与被定位元素最近的几层元素有关,相对路径写的好的话,页面变动影响最小,而且定位准确。

  • 使用索引定位元素,索引的初始值为1,注意与数组等区分开。

  例如:driver. findElement(By.xpath ("//input[2]") )返回查找到的第二个符合条件的元素。

  特点:如果一个页面中有多个相似的元素,或是一个层下面有多个同样的元素的时候,需要用索引的方法来定位,否则无法区分。

  • 结合属性值来定位元素。

  例如:driver. findElement(By.xpath ("//input[@id=‘username‘]"));

     driver. findElement(By.xpath ("//img[@alt=‘flowr‘]"));

  特点:属性定位也是比较常用的方法,如果元素中没有常见的id,name,class等直接有方法可调用的属性,也可以查找元素中是否有其他能唯一标识元素的属性,如果有,就可以用此方法定位。

  • 使用逻辑运算符,结合属性值定位元素,and与or。

  例如:driver.findElement(By.xpath("//input[@id=‘username‘ and @name=‘userID‘]"));

  特点:多个属性值联合定位,更能准确定位到元素。并且如果多个相同标签的元素,如果其包含的属性值有不同的,也可以用这个方法区分开来。

  • 使用属性名来定位元素。

  例如:driver. findElement(By.xpath ("//input[@button]"))

  特点:此方法可以区分同一种标签,含有不同属性名的元素。定位相对简单一些儿,但也同样存在着无法区分同种标签含有同种属性名的多个元素,这个时候要配合索引定位才行。

  • 使用部分属性值模糊匹配元素.

  例如:

  (a)starts-with()

    //input[starts-with(@id,"kw")]

    //div[starts-with(@id,"u_sp")]/a[1]

  (b)contains()

  例如://input[contains(@id,"kw")]

  特点:此方法更加灵活,可以定位属性值不太规律,或是部分变动,中间有空格的情况。注:如果属性值中间包含空格,Webdriver定位的时候容易出错,时而能定位到时而定位不到,所以应该避免用含用空格的属性值定位。可以采用此方法,进行部分属性值定位。

  • 使用任意属性值匹配元素。

  例如:driver. findElement(By.xpath ("//input[@*=‘username‘]"))

  特点:此方法相当于模糊查询,只要欲定位的标签,如input中任何属性值等于‘username’,就能匹配成功。缺点,可能会匹配含有这个属性值的其他元素,所以我们在定位的时候要查看一下这个元素值在页面中是否唯一。

1.4、运用Xpath定位元素的思路

当我们在做自动化测试的时候,想要对一个页面元素定位,通过上面我们讲到的选择定位方法筛选后,决定用Xpath定位了,此时我们应该怎么写Xpath呢?请按以下步骤来分析:

(a)先看一个这个元素是否有明显的,唯一的属性值。如果有,我们就用相对路径加属性值定位,这是最简单准确的定位方法。如://input[@alog-alias=’search’]。

(b)如果要定位的元素,不符合上面的特症,元素属性要么是动态的,要么就是不能区分这个元素的,还有就是属性值中间有空格的情况,都无法定位。所以从此元素开始,向他的上一层查找。

(c)当遇到了一个符合条件的元素时,对其写Xpath,然后在Selenium IDE(或者xpath helper)中验证是否能定位到该元素。如://div[@type=’good’],在Selenium IDE中验证能定位到这个div。

(d)然后从这个元素开始,一级级往下写,真到要定位的元素为止。如果你比较肯定写的是正确的,可以写完后再验证,如果不肯定,就写一层,用Selenium IDE验证一下,以确保安全。如://div[@type=’good’]/div/input

(e)当Selenium IDE定位成功后,再放到测试用例中去调试运行。虽然Selenium IDE能定位到的代码也能定位到,不过还有因为延迟,操作顺序等会影响代码定位的因素存在。

1.5、元素定位不到的原因及解决办法

在我们编写自动化测试用例的过程中,经常会遇到元素定位不到的现象,有的时候我们用Selenium IDE检查的时候也能在Firebug中看到,可是运行代码的时候,总是提示元素找不到。经过我以往和经验和大家在网上的讨论,总结了以下几种情况:

(1)定位属性值是动态变化的情况(常见问题)

现象:在我们定位元素的时候,发现有id, name或其他的属性存在,于是就用相应的定位方法去定位。可是运行的时候提示定位不到,然后我们再去查看元素的时候,发现属性值和我们写代码的时候不一样了。

原因:通常产生这种情况的原因就是你使用的属性值是动态变化的,主要表现有属性值是一串数据,或是字符加一串数据等情况。页面加载一次变化一次,每次都不相同。

解决办法:我们应尽量避免用这样的属性值去定位,而采用这个元素下的其他固定不变的属性值。或是向上层查找,采用Xpath定位。

(2)Iframe中的元素定位出错的情况

现象:我们在定位元素的时候,查看网页源码,发现有iframe存在。可是我们没有做特殊处理,而是直接用通用的定位方法,name ,id,  xpath或者CSS来定位。用Selenium IDE验证能查找到元素,可是运行测试用例的时候,总是元素找不到。

原因:在我们运行测试脚本的时候,代码获取的是页面的句柄,而iframe在句柄中是当成一个元素来处理的。脚本是没有办法自己去iframe中去定位元素的,所以当搜索完页面时,发现找不到要定位的元素,就当错误处理。

解决办法:当需要定位iframe中的元素的时候,先将句柄切换到iframe中(driver.switchTo().frame("framename");),然后再去定位,就能定位到要测试的元素。

(3)不同页面或iframe切换时元素定位情况

现象:当我们在编写测试用例的时候,会遇到打开一个新页面,或是切换到一个新的iframe中,然后再去定位元素进行操作。但是我们的定位方法写的没有问题,而且在Selenium IDE中也验证通过,可是代码运行的时候还是会提示找不到元素。

原因:其实这个和定位iframe中元素的情况是一样的,在打开一个页面或是切换到一个iframe的时候,driver获取的是当前页面或是iframe的句柄。当你的操作切换到新的页面或是iframe的时候,如果代码不去做相应的切换,查找元素的时候还会在原来的句柄下查找,当然会出现查找不到的情况。

解决办法:当操作切换页面或是iframe的时候,我们的测试脚本也要做相应的切换,选择新打开的页面或是切换到新的iframe下。然后再去定位的时候,就会在新页面或是iframe下定位了。

(4)Xpath编写出错的情况(常见问题)

现象:如果我们对一个元素编写了对应的Xpath,然后在没有通过Selenium IDE进行验证的情况吧,就去编写代码执行测试用例。会出现查找不到元素的情况,或是页面发生了变化,导致Xpath路径有了变化,也会查找不到元素。

原因:主要的问题就是Xpath编写出错了,或是页面有改动。不管是增加了新的模块或是隐藏的div,都会影响Xpath路径的。

解决办法:将代码中的Xpath拷出来,放到Selenium IDE中进行验证。如果出错了,就做相应的修改。这个也是代码维护中当遇到的问题,被测试对象变化,导致测试用例的修改。

(5)操作速度过快,被定位的元素没有加载出来的情况(常见问题)

现象:在测试用例运行过程中,会出现被定位的元素有的时候能定位的到,有的时候却定位不到的现象。而我们去页面上验证我们的定位方法的时候,没有一点儿问题,显示不是定位方法写错了。

原因:这种情况多半是因为测试用例执行到代码的时候,被定位元素没有加载出来造成的。网速原因,执行代码的机器原因,都会造成加载比程序执行的慢的情况。

解决办法:在我们定位元素之前,评估一下页面的加载情况,如果有加载慢的地方,需要添加一定等待时间self.sleep(5000),等上几秒后再去定位操作。

(6)定位页面嵌入式元素的情况(很少遇到)

现象:在页面中会有一些儿嵌入式元素,如object,播放器等。这个时候,我们对其操作的时候,是无法定位到上面的元素的。

原因:嵌入式元素对webdriver来说是一个元素,不管里面包含多少元素,都无法操作。对于object对象,网上有说要对相应的Flash重新编译,添加相应的代码或是控件才能定位。但这样一样又不安全了,所以嵌入式对象一直是自动化测试的盲区。

解决办法:嵌入式对象如果是简单的单击操作,可是用模拟鼠标单击相应的区域,就能完成操作。如果是输入操作,我们可以先模拟点击输入区,然后模拟键盘进行输入。除此之外,好像也没有什么好的办法。

原文地址:https://www.cnblogs.com/xjx767361314/p/10152498.html

时间: 2024-10-13 22:33:57

元素定位-XPATH定位方法总结的相关文章

java selenium (六) XPath 定位

什么是xpath xpath 是XML Path的简称, 由于HTML文档本身就是一个标准的XML页面,所以我们可以使用Xpath 的用法来定位页面元素. xpath定位的缺点 xpath 这种定位方式, webdriver会将整个页面的所有元素进行扫描以定位我们所需要的元素, 这是个非常费时的操作,  如果脚本中大量使用xpath做元素定位的话, 脚本的执行速度可能会稍慢 testXpath.html 代码如下 <html> <head><title>Test Xpa

Web元素定位方法_8大元素+xpath定位

元素定位,顾名思义就是根据元素的特征,来确认元素的条件,然后根据条件去找到唯一的那个元素. 一.八大元素 1.只根据元素的一个属性来找元素(6大) 1)id.name.class_name(只支持一个class值).tag_name 2)只针对a元素 link_text.partial_link_text 示例: 1 # class - 只能是class属性当中的一个值 2 driver.find_element_by_class_name("s_ipt") # 1个元素 - 匹配到的

用XPath精确定位节点元素&amp;selenium使用Xpath定位之完整篇

在利用XSL进行转换的过程中,匹配的概念非常重要.在模板声明语句 xsl:template match = ""和模板应用语句xsl:apply-templates select = "" 中,用引号括起来的部分必须能够精确地定位节点.具体的定位方法则在XPath中给出. 之所以要在XSL中引入XPath的概念,目的就是为了在匹配XML文档结构树时能够准确地找到某一个节点元素.可以把XPath比作文件管理路 径:通过文件管理路径,可以按照一定的规则查找到所需要的文件

xpath定位方法详解

1.xpath较复杂的定位方法: 现在要引用id为“J_password”的input元素,可以像下面这样写: WebElement password = driver.findElement(By.xpath("//*[@id='J_login_form']/dl/dt/input[@id='J_password']")); 其中//*[@id=’ J_login_form’]这一段是指在根元素下查找任意id为J_login_form的元素,此时相当于引用到了form元素.后面的路径

appium -- Xpath定位元素

如文章<Appium基于安卓的各种FindElement的控件定位方法实践>所述,Appium拥有众多获取控件的方法.其中一种就是根据控件所在页面的XPATH来定位控件. 本文就是尝试通过自己的试验来尝试对Appium如何用xpath来定位控件做一个阐述,当中如有不对的地方敬请大家指出. 1. 背景 本文尝试使用的试验对象是SDK自带的NotePad应用实例,假设已经有两个Notes分别是“note1”和“note2”添加到Notepad上面,我们要做的就是尝试用xpath的方法来定位“not

使用Xpath定位元素

1.xpath较复杂的定位方法: 现在要引用id为"J_password"的input元素,可以像下面这样写: WebElement password = driver.findElement(By.xpath("//*[@id='J_login_form']/dl/dt/input[@id='J_password']")); 其中//*[@id=' J_login_form']这一段是指在根元素下查找任意id为J_login_form的元素,此时相当于引用到了fo

定位页面元素之xpath详解以及定位不到测试元素的常见问题

一.定位元素的方法 id:首选的识别属性,W3C标准推荐为页面每一个元素设置一个独一无二的ID属性, 如果没有且很难找到唯一属性,解决方法:(1)找开发把id或者name加上.如果不行,解决思路可以是: 1. 找到该按钮的特征,例如按钮的文字是 submit: 2. 用XPath定位,可以这样写://button[@value='submit'].(注意是单引号!!) name:和id一致 ClassName:对某些具有相同类的元素一网打尽的好方法 link text 和 partial lin

selenium2元素定位Xpath和cssSelector

Selenium2中元素有以下几种定位方法, 常用的有Id,xpath, cssSelector XPATH介绍:    XPATH是一种选择器 ?XPATH在firefox中用firepath验证 ?XPATH常用符号说明 / 表示绝对路径,绝对路径是指从根目录开始 // 表示相对路径 . 表示当前层 .. 表示上一层 * 表示通配符 @ 表示属性 [] 属性的判断条件表达式 各种xpath的方法直接在百度主页进行操作,请参考. <1> /html/div ,没有节点可以被选择,因为/如果用

Selenium-Python学习——通过XPath定位元素

用Xpath定位元素的方法总是记不住,经常要翻出各种文档链接参考,干脆把需要用到的内容整到这个笔记中方便查找. Xpath是在XML文档中定位节点的语言.使用 XPath 的主要原因之一是当想要查找的元素缺少合适的 id 或name属性.XPath定位器可以用来绝对或相对定位缺少id或name属性的元素,也可以是用其他属性进行定位. 通过XPath定位的元素容易受html调整的影响,可以先通过id或name属性找到就近的元素,如父元素,用以加强测试脚本的稳定性. 例如,源文件如下: <html>