本文是用JAVA语言记录WebDriver3.0使用xpath方法定位元素。Xpath语言中提供了7种节点:文档节点(根节点)、元素、属性、文本、命名空间、处理指令及注释。
本文档参考《selenium WebDriver 3.0 自动化测试框架实战指南》
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title>浩云集中存储系统</title> 5 </head> 6 <body style="text-align:center"> 7 <div style="position:fixed;left:50%;top:50%;margin-left:-200px;margin-top:-150px;width:430px;height:280px; 8 background-image:url(./images/login.bmp);"> 9 <form style="position:fixed;margin-left:83px;margin-top:90px;" action="phpScript/login.php" method="post"> 10 <p style="position:fixed;"> 11 <text>用户名:</text> 12 <input style="width:150px;" name="usrName" value="admin"/> 13 </p> 14 <p style="position:fixed;margin-top:50px;margin-left:16px"> 15 <span stype="">密码:</span> 16 <input style="width:150px;" type="password" name="usrPwd" /> 17 </p> 18 <p style="position:fixed;margin-left:70px;margin-top:80px;"> 19 <input type="button" value="取消" onclick=""/> 20 <input type="submit" value="登录"/> 21 </p> 22 </form> 23 </div> 24 </body> 25 </html>
WebElement driver = new ChromeDriver();
driver.get("URL");
1、绝对路径定位元素。可使用firefox firebug组件复制其路径。(定位12行)
driver.findElement(By.xpath("/html/body/div/form/p[1]/input"));
或driver.findElement(By.xpath("/html/body/div/form/p[1]/input[@name='usrName']"));
2、使用相对路径定位元素(定位12行)
driver.findElement(By.xpath("//input[@name='usrName']"));
或driver.findElement(By.xpath("//form/p/input"));
或driver.findElement(By.xpath("//input[@value='admin']"));
3、使用索引号定位元素(定位16行)
driver.findElement(By.xpath("//form/p[2]/input"));
p[2]:2是索引。索引是根据页面元素中相同标签名之间出现的索引位置来进行定位的。
4、使用页面元素的属性值定位元素。
使用相对路径与元素属性结合方法定位。属性值不会自动改变。
driver.findElement(By.xpath("//input[@name='usrName']")); //name属性与相对路径结合
driver.findElement(By.xpath("//input[@type='submit']"));//
driver.findElement(By.xpath("//img[@href='www.sogou.com']"));
driver.findElement(By.xpath("//div[@id='username']));
5、使用模糊属性值定位元素。
xpath函数 | 定位表达式实例 | 表达式解释 |
starts-with(str1,str2) | //img[starts-with(@alt,'name')] | 查找属性alt的属性值以“name”关键学开始的页面元素。 |
contains(str1,str2) | //img[contains(@alt,'img')] | 查找属性alt的属性包含“img”关键字的页面元素,只要包含即可,无需考虑位置。 |
driver.findElement(By.xpath("//input[starts-with(@placeholder,'用户')]"));
driver.findElement(By.xpath("//input[starts-with(@name,'pass')]"));
driver.findElement(By.xpath("//input[contains(@placeholder,'户')]")).sendKeys(username);
driver.findElement(By.xpath("//input[contains(@name,'ssw')]")).sendKeys(userpassword);
6、使用XPath轴(Axes)定位元素。
XPath轴关键字 | 轴的含义说明 | 定位表达 式实例 | 表达式解释 |
parent | 选择当前节点的上层父节点 | //img[@alt='div2-img2']/parent::div | 查找到alt的属性值为div2-img2的img元素,并基于该img元素的位置找到它上一级的div页面元素。 |
child | 选择当前节点的下层所有子节点 | //div[@id='div1']/child::img | 查找到ID属性值为div1的div元素,并基于该div元素的位置找到它下层节点中的img页面元素。 |
ancestor | 选择当前节点的所有上层的节点 | //img[@alt='div2-img2']/ancestor::div | 查找到alt属性值为div2-img2的img元素,并基于该img元素的位置找到它上级的div页面元素。 |
descendant | 选择当前节点的所有下层节点(子、孙节点) | //div[@name='div2]/descendant::img | 查找name属性值为div2的div元素,并基于该div元素的位置找到它下级的所有节点中的Img页面元素。 |
following | 选择在当前节点之后显示的所有节点 | //div[@id='div1']/following::img | 查找ID属性值为div1的div元素,并基于该div元素的位置找到它后面节点中的img页面元素。 |
following-sibling | 选择当前节点后续所有兄弟节点 | //a[@href='http://www.sougou.com']/following-sibling::input | 查找链接地址为http://www.sougou.com的链接页面元素a并基于链接的位置找到它后续兄弟节点中的input页面元素。 |
preceding | 选择当前节点前面的所有节点 | //img[@alt='div2-img2']/preceding::div | 查找到属性alt的属性值为div2-img2的图片页面元素img,并基于该元素位置找到它前面节点中的div页面元素。 |
preceding-sibling | 选择当前节点前面的所有兄弟节点 | //input[@value='查询']/preceding-sibling::a[1] | 查找到value属性值为“查询”的input元素,并基于该元素的位置找到它前面同级节点中的第一个a[1]链接页面元素。 |