selenium+python定位之高级方法一

 

3.2.3 Xpath 定位方法深入探讨

  • 使用绝对路径定位元素。

例如:driver.find_element_by_xpath ("/html/body/div/form/input")。特点:这个路径是从网页起始标签<html>开始一直到要定位的元

素的路径,如果要定位的元素在页面最下面,则这个 Xpath 路径会非常长。如果在要定位的元素与页面开始之间的元素有任何增减,元素定位就会失败。

 

  • 使用相对路径定位元素。

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

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

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

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

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

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

例如:driver. find_element_by_xpath ("//input[@id='username']"); driver. find_element_by_xpath ("//img[@alt='flowr']");

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

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

例如:driver. find_element_by_xpath ("//input[@id='username' and @name='userID']");

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

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

例如:driver. find_element_by_xpath ("//input[@button]")

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

  • 类似于  cssSlector,使用部分属性值匹配元素.

例如:

(a)starts-with()

driver. find_element_by_xpath ("//input[stars-with(@id,'user')]")

(b)ends-with()

driver. find_element_by_xpath ("//input[ends-with(@id,'name')]")

(c)contains()

例如:driver. find_element_by_xpath

("//input[contains(@id,"ernam")]")

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

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

例如:driver. find_element_by_xpath ("//input[@*='username']")

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

(2)运用 Xpath 定位元素的思路

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

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

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

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

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

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

 

(4)Xpath 编写出错的情况

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

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

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

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

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

原因:这种情况多半是因为测试用例执行到代码的时候,被定位

元素没有加载出来造成的。网速原因,执行代码的机器原因,都会造成加载比程序执行的慢的情况。

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

(6)定位页面嵌入式元素的情况

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值