在Selenium WebDriver中使用By.Xpath快速定位页面元素

本文介绍使用Selenium WebDriver通过XPath进行精确页面元素定位的方法,包括如何利用多个属性值和contains函数提高定位效率。

转载:

http://www.51testing.com/html/38/113838-849231.html



以登录页面密码框定位为例,讲解如何在selenium webdriver中通过by.xpath定位页面元素,快速获取元素位置并完成操作。

 

问题引入:

 

用Selenium IDE录制后的脚本如下:

driver.findElement(By.name("pass")).clear();

driver.findElement(By.name("pass")).sendKeys("密码");

driver.findElement(By.id("passwords")).clear();

driver.findElement(By.id("passwords")).sendKeys("123456");

回放的时候,页面非常难定位,需要很长时间才能找到密码框并输入密码,如果超时了找不到就会报错。

 

解决方案:

既然有时候能回放成功,有时候又找不到页面元素,那肯定是这个元素定位不够准确,所以在查找的时候会消耗很长时间,那么通过xpah定位是否可以?

 

Xpath查找元素对象时有这样一种定位方式,即通过//定位,详情请参考:http://www.w3school.com.cn/xpath/xpath_syntax.asp

//

从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。

比如这里密码框是输入框input,想要查找input的位置可以通过//input来实现,如果只是//input则可能会定位到多个input元素,此时就需要通过键值对更精确的定位,语法就是//input[@key=value],即://input[@name='pass']

 

driver.findElement(By.xpath("//input[@name='pass']")).clear();

driver.findElement(By.xpath("//input[@name='pass']")).sendKeys("密码");

driver.findElement(By.xpath("//input[@id= passwords]")).clear();

driver.findElement(By.xpath("//input[@id= passwords]")).sendKeys("123456");

重新回放,时间仍然很长,看来通过一个元素键值对定位是不可靠的,那能不能通过多个元素呢?就跟QTP中的高级描述性编程一样。那xpath的语法是什么,多个元素键值对怎么连接到一起呢?

 

首先查找name=pass的这个元素的另外一个元素键值对:class= textfild,用这两个定位一下试试看。

driver.findElement(By.xpath("//input[@name='pass'and@class=’ textfild’]")).clear();

driver.findElement(By.xpath("//input[@name='pass'and@class=’ textfild’]")).sendKeys("密码");

driver.findElement(By.xpath("//input[@id= passwordsand@class=’ textfild required’]")).clear();

driver.findElement(By.xpath("//input[@id=passwordsand@class=’textfild required’]")).sendKes(“12..”);

再回访,速度果然快了,很快便识别到了密码框的位置,并且进行了输入。

 

关于xpath查找元素还可以通过contains(一个字符串查找函数)来实现,语法是

//input[contains(@id,vakue)andcontains(@id,value)],此中的id和value就是定位input元素的键值对

 

例如:

//input[contains(@class,'textfild') and contains(@name,'pass')]

 

那最后经过整合和简化,4句的代码可简化为以下两句

driver.findElement(By.xpath("//input[contains(@class,'textfild')andcontains(@name,'pass')]")).clear();

driver.findElement(By.xpath("//input[@id='passwords'and@class='textfild required'and@type='password']")).sendKeys("123456");

 

为什么能简化为2行呢,看上面的截图,其实一上来的时候密码框里有“密码”两个字,当鼠标移入密码框获取焦点以后,“密码”文字消失,用户就可以输入自己真正的密码。所以

driver.findElement(By.xpath("//input[@name='pass'and@class=’ textfild’]")).sendKeys("密码");

这句话是我们不需要的。因为当密码框获取焦点以后,“密码”文字就消失了,所以下面的清空也没有必要存在了

driver.findElement(By.xpath("//input[@id= passwordsand@class=’ textfild required’]")).clear();

这样,代码就简化了。

回放,一切ok。



Selenium WebDriver自动化测试中,实现对登录页面的密码输入框的高效定位是提高测试稳定性和效率的关键。要实现这一点,首先需要理解XPath的基础语法及其在页面元素定位中的应用。《Selenium WebDriver:优化By.Xpath定位页面元素技巧》这本书籍详细介绍了XpathSelenium中的运用,并提供了多种定位页面元素的技巧和最佳实践。在定位密码输入框时,可以采取以下步骤: 参考资源链接:[Selenium WebDriver:优化By.Xpath定位页面元素技巧](https://wenku.csdn.net/doc/6412b49abe7fbd1778d402a0?spm=1055.2569.3001.10343) 1. **分析元素特征**:首先,需要对密码输入框进行分析,了解其在HTML文档中的结构和属性。通常,密码输入框会有一个`<input>`标签,并具有特定的`type`属性值为`password`。 2. **基础Xpath定位**:可以直接利用Xpath定位`type`属性为`password`的`<input>`元素,例如`//input[@type='password']`。 3. **属性组合定位**:为了提高定位的准确性,可以结合使用`id`、`name`或其他属性。例如,如果密码输入框有一个`id`属性值为`passwordField`,则可以使用`//input[@id='passwordField']`。 4. **动态属性定位**:如果密码输入框的属性值是动态生成的,可以使用XPath中的`contains()`函数来定位,如`//input[contains(@class, 'pass-field')]`。 5. **键值对定位**:如果页面使用了键值对的形式来标识输入框,可以使用XPath的谓词来定位,如`//input[@name='password'][@type='password']`。 在实际应用中,可能需要结合多种定位策略来确保定位的准确性。例如,可以先使用id进行定位,如果未找到,则尝试使用name,最后再根据其他属性或类名进一步缩小范围。这样可以确保即使在复杂或动态变化的页面上,也能够稳定地定位到密码输入框。 建议在编写Xpath表达式时,尽量保持简洁,并且避免使用过于复杂的选择器。这样不仅提高了定位效率,还能减少脚本的维护成本。同时,对于每一个定位策略,都要进行测试,确保其在不同环境下都能稳定工作。通过不断实践和优化,可以显著提升自动化测试的效率和稳定性。 参考资源链接:[Selenium WebDriver:优化By.Xpath定位页面元素技巧](https://wenku.csdn.net/doc/6412b49abe7fbd1778d402a0?spm=1055.2569.3001.10343)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值