selenium定位方法(java实例)(二)

 从下图中可以看到selenium有三类定位元素的方法,一种是直接通过属性、标签以及链接来定位,一种是XPath方式,最后一种是CSS方式。

 

下表列举了元素定位的例子

selenium之页面元素定位方法
   方法  例子
   通过ID来定位  WebElement wElement = driver.findElement(By.id("kw"))
   通过Name来定位  WebElement wElement = driver.findElement(By.name("wd"))
   通过Class定位  WebElement wElement = driver.findElement(By.className("s_ipt"))
   通过Tag来定位  List<WebElement> inputs = driver.findElements(By.tagName("input"))
   通过Link来定位  WebElement wElement = driver.findElement(By.linkText("新闻"))
   通过PartialLink来定位  WebElement wElement = driver.findElement(By.partialLinkText("使用百度"))
XPath定位   1.绝对路径  WebElement wElement = driver.findElement(By.xpath("/html/body/div/div/div/div/div/form/span/input"))
   2.相对路径  WebElement wElement = driver.findElement(By.xpath("//form/span/input"))
   3.利用元素属性定位  WebElement wElement = driver.findElement(By.xpath("//input[@id='kw']"))
   4.利用text()方法定位 WebElement wElement = driver.findElement(By.xpath("//span[text()='确定']"))    span可以使用*替换
   5.利用contains()方法定位

WebElement wElement = driver.findElement(By.xpath("//a[contains(@href,'basicinfo')"))

WebElement wElement = driver.findElement(By.xpath("//*[contains(text(),'退出')]"))

   6.层级与属性结合  WebElement wElement = driver.findElement(By.xpath("//span[@class='bg s_ipt_wr iptfocus quickdelete-wrap']/input"))
   7.使用逻辑运算符  WebElement wElement = driver.findElement(By.xpath("//input[@class='s_ipt' and @id='kw']"))
 CSS定位  1.通过class属性定位  WebElement wElement = driver.findElement(By.cssSelector(".s_ipt"))
   2.通过id属性定位  WebElement wElement = driver.findElement(By.cssSelector("#kw"))
   3.通过标签名定位  List<WebElement> inputs = driver.findElements(By.cssSelector("input"))
   4.通过父子关系定位  List<WebElement> inputs = driver.findElements(By.cssSelector("span>input"))
   5.通过属性定位  WebElement wElement = driver.findElement(By.cssSelector("[id=kw]"))
   6.通配符  WebElement wElement = driver.findElement(By.cssSelector("[class$=_ipt]"))
   7.组合定位  WebElement wElement = driver.findElement(By.cssSelector("form.fm>span>input.s_ipt"))

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

注:driver.findElement代表定位到一个元素,driver.findElements代表返回一组元素。

 

 

 

 

 

 

 

 

下面通过实例来说明:

 

 下面是百度首页的部分HTML代码,其中黄底部分就是一个输入框和一个按钮,将使用百度首页来编写测试脚本,并验证脚本。

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4 <body link="#0000cc">
 5 <div id="swfEveryCookieWrap" data-for="result" style="width: 0px; height: 0px; overflow: hidden;">
 6 <script>
 7 <div id="wrapper" style="display: block;">
 8 <script>
 9 <div id="head">
10 <div class="head_wrapper">
11 <div class="s_form">
12 <div class="s_form_wrapper">
13 <div id="lg">
14 <a id="result_logo" onmousedown="return c({'fm':'tab','tab':'logo'})" href="/">
15 <form id="form" class="fm" action="/s" name="f">
16 <input type="hidden" value="utf-8" name="ie">
17 <input type="hidden" value="8" name="f">
18 <input type="hidden" value="1" name="rsv_bp">
19 <input type="hidden" value="1" name="rsv_idx">
20 <input type="hidden" value="" name="ch">
21 <input type="hidden" value="baidu" name="tn">
22 <input type="hidden" value="" name="bar">
23 <span class="bg s_ipt_wr iptfocus quickdelete-wrap">
24 <input id="kw" class="s_ipt" autocomplete="off" maxlength="255" value="" name="wd">
25 </span>
26 <span class="bg s_btn_wr">
27 <input id="su" class="bg s_btn" type="submit" value="百度一下">
28 </span>
29 <span class="tools">
30 <input type="hidden" value="" name="rn">
31 <input type="hidden" value="" name="oq">
32 <input type="hidden" value="e142557200096242" name="rsv_pq">
33 <input type="hidden" value="51ebs1YfGfrIuFRBo4wcRYuW9Io+gk3kpwseb9ioGcn4djCUsWDwr56pCKk" name="rsv_t">
34 <input type="hidden" value="cn" name="rqlang">
35 </form>
36 <div id="m"></div>
37 </div>
38 </div>
39 <div id="u">
40 <div id="u1">
41 </div>
42 </div>
43 <div id="s_tab" class="s_tab">
44 <div id="ftCon">
45 <div id="wrapper_wrapper"></div>
46 </div>
47 <div id="c-tips-container" class="c-tips-container"></div>
48 <script>
49 <script>
50 <script>
51 <script src="https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/static/protocol/https/jquery/jquery-1.10.2.min_f2fb5194.js" type="text/javascript">
52 <script>
53 <script type="text/javascript">
54 <script>
55 <script>
56 </body>
57 </html>

 下图是利用firefox中的firebug插件查看百度首页信息的截图。

 

 下面编写了18个test,分别对应本页面顶部的表格内容。

  1 package com.test.location;
  2 
  3 import static org.junit.Assert.*;
  4 
  5 import java.util.Iterator;
  6 import java.util.List;
  7 import java.util.concurrent.TimeUnit;
  8 
  9 import javax.lang.model.element.Element;
 10 
 11 import org.junit.After;
 12 import org.junit.Before;
 13 import org.junit.Test;
 14 import org.openqa.selenium.By;
 15 import org.openqa.selenium.WebDriver;
 16 import org.openqa.selenium.WebElement;
 17 import org.openqa.selenium.firefox.FirefoxDriver;
 18 import org.openqa.selenium.interactions.Actions;
 19 
 20 public class TestLocation {
 21     WebDriver driver;
 22 
 23     @Before
 24     public void setUp() throws Exception {
 25 
 26         //获取Driver
 27         driver = new FirefoxDriver();        
 28         driver.get("http://www.baidu.com/");
 29         //将屏幕最大化
 30         driver.manage().window().maximize();
 31         //driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
 32     }
 33 
 34     @After
 35     public void tearDown() throws Exception {
 36         //退出浏览器
 37         
 38         driver.quit();
 39     }
 40 ==================================================================================================================
 41     //通过ID来定位
 42     @Test
 43     public void test001_GetByID() {
 44         //清空输入框,并输入查询关键字“selenium”,然后点击查询按钮
 45         driver.findElement(By.id("kw")).clear();    
 46         driver.findElement(By.id("kw")).sendKeys("selenium");
 47         driver.findElement(By.id("su")).click();
 48         
 49         Boolean flag = driver.findElement(By.linkText("Selenium - Web Browser Automation")).isDisplayed();
 50         assertTrue("\"Selenium - Web Browser Automation\" is not display",flag);
 51     }
 52 ===================================================================================================================
 53     //通过Name来定位
 54     @Test
 55     public void test002_GetByName(){
 56         //清空输入框,并输入查询关键字“selenium”,然后点击查询按钮
 57         driver.findElement(By.name("wd")).clear();    
 58         driver.findElement(By.name("wd")).sendKeys("selenium");
 59         driver.findElement(By.id("su")).click();
 60         
 61         Boolean flag = driver.findElement(By.linkText("Selenium - Web Browser Automation")).isDisplayed();
 62         assertTrue("\"Selenium - Web Browser Automation\" is not display",flag);
 63     }
 64 ====================================================================================================================    
 65     //通过Class定位
 66     @Test
 67     public void test003_GetByClass(){
 68         //清空输入框,并输入查询关键字“selenium”,然后点击查询按钮
 69         driver.findElement(By.className("s_ipt")).clear();    
 70         driver.findElement(By.className("s_ipt")).sendKeys("selenium");
 71         driver.findElement(By.id("su")).click();
 72         
 73         
 74         Boolean flag = driver.findElement(By.linkText("Selenium - Web Browser Automation")).isDisplayed();
 75         assertTrue("\"Selenium - Web Browser Automation\" is not display",flag);
 76     }
 77  ====================================================================================================================   
 78     //通过Tag来定位
 79     @Test
 80     public void test004_GetByTag(){
 81         //清空输入框,并输入查询关键字“selenium”,然后点击查询按钮
 82         //input 这个tag在百度首页中比较多,所以需要使用findElements(),将所有input返回,并从中找寻需要的两个input
 83         List<WebElement> inputs = driver.findElements(By.tagName("input"));
 84         Iterator<WebElement> it = inputs.iterator();        
 85         WebElement we = null;
 86         WebElement inputWe = null;
 87         WebElement buttonWe = null;
 88         while(it.hasNext()){
 89             we = (WebElement)it.next();
 90             if(we.getAttribute("id").toString().equals("kw")){
 91                 inputWe = we;
 92             }
 93             
 94             if(we.getAttribute("id").toString().equals("su")){
 95                 buttonWe = we;
 96             }
 97         }
 98         
 99         //找到之后开始操作
100         if(inputWe!=null && buttonWe!=null){
101             inputWe.clear();
102             inputWe.sendKeys("selenium");
103             buttonWe.click();                        
104         }else{            
105             System.out.println("can not find input and button");            
106         }
107         
108         //判断结果
109         Boolean flag = driver.findElement(By.linkText("Selenium - Web Browser Automation")).isDisplayed();
110         assertTrue("\"Selenium - Web Browser Automation\" is not display",flag);    
111     }
112  ============================================================================================================================   
113     //通过Link来定位
114     @Test
115     public void test005_GetByLink(){
116         
117         //点击新闻链接
118         driver.findElement(By.linkText("新闻")).click();
119         
120         //获取title
121         Boolean flag = driver.getTitle().toString().contains("新闻");
122         assertTrue("\"新闻\" is not included in title",flag);
123     }
124   ===============================================================================================================  
125     //通过PartialLink来定位
126     @Test
127     public void test006_GetByPartialLink(){
128                 
129         driver.findElement(By.partialLinkText("使用百度")).click();
130         
131         //获取title
132         Boolean flag = driver.getTitle().toString().contains("百度免责");
133         assertTrue("the page of \"百度免责声明\" is not open",flag);
134     }
135  ================================================================================================================   
136     //XPath定位
137     //XPath定位-1.绝对路径
138     @Test 
139     public void test007_GetByAbsolutePath(){
140         
141         driver.findElement(By.xpath("/html/body/div/div/div/div/div/form/span/input")).sendKeys("selenium");
142         driver.findElement(By.xpath("/html/body/div/div/div/div/div/form/span[2]/input")).click();
143         
144         Boolean flag = driver.findElement(By.linkText("Selenium - Web Browser Automation")).isDisplayed();
145         assertTrue("\"Selenium - Web Browser Automation\" is not display",flag);
146     }
147  ===========================================================================================================================   
148     @Test //XPath定位-2.相对路径
149     public void test008_GetByRelativePath(){
150         
151         driver.findElement(By.xpath("//form/span/input")).sendKeys("selenium");
152         driver.findElement(By.xpath("//form/span[2]/input")).click();
153         
154         Boolean flag = driver.findElement(By.linkText("Selenium - Web Browser Automation")).isDisplayed();
155         assertTrue("\"Selenium - Web Browser Automation\" is not display",flag);
156     }
157 ==============================================================================================================================    
158     //XPath定位-3.利用元素属性定位
159     @Test 
160     public void test009_GetByElementAttribute(){
161         
162         driver.findElement(By.xpath("//input[@id='kw']")).sendKeys("selenium");
163         driver.findElement(By.xpath("//input[@id='su']")).click();
164         
165         /*// 表示当前页面某个某个目录
166          * input 表示定位元素的标签名
167          * [@id='kw']表示这个元素的id属性值等于kw
168          * 
169          * 除了使用id这个属性,也可以使用name和class属性等其他属性来定位,只要值是唯一的。
170          *1.//input[@name='wd']
171          *2.//input[@class='s_ipt']
172          *3.//*[@class='bg s_btn']  符号* 代表不想指定标签名
173 */        
174         
175         Boolean flag = driver.findElement(By.linkText("Selenium - Web Browser Automation")).isDisplayed();
176         assertTrue("\"Selenium - Web Browser Automation\" is not display",flag);
177     }
178 ==================================================================================================================================    
179     //XPath定位-4.层级与属性结合
180     @Test
181     public void test010_GetByParent(){
182         
183         driver.findElement(By.xpath("//span[@class='bg s_ipt_wr iptfocus quickdelete-wrap']/input")).sendKeys("selenium");
184         driver.findElement(By.xpath("//span[@class='bg s_btn_wr']/input")).click();
185         //可以通过先定位父元素,在加上层级关系来定位目标元素。  这种方法还可以扩展到先查找爷爷元素。
186         Boolean flag = driver.findElement(By.linkText("Selenium - Web Browser Automation")).isDisplayed();
187         assertTrue("\"Selenium - Web Browser Automation\" is not display",flag);
188     }
189  ===================================================================================================================================   
190     //XPath定位-5.使用逻辑运算符
191     @Test
192     public void test011_GetByAttributeCombination(){
193         //这里就是元素属性的组合
194         driver.findElement(By.xpath("//input[@class='s_ipt' and @id='kw']")).sendKeys("selenium");
195         driver.findElement(By.xpath("//input[@class='bg s_btn' and @id='su']")).click();
196         
197         Boolean flag = driver.findElement(By.linkText("Selenium - Web Browser Automation")).isDisplayed();
198         assertTrue("\"Selenium - Web Browser Automation\" is not display",flag);
199     }
200     
201  ==================================================================================================================================   
202     //CSS定位
203     //CSS定位-1.通过class属性定位
204     @Test
205     public void test012_GetByClassAttribute(){
206         
207         //使用符号(.)来表示用class属性来定位
208         driver.findElement(By.cssSelector(".s_ipt")).sendKeys("selenium");
209         driver.findElement(By.id("su")).click();;
210         
211         Boolean flag = driver.findElement(By.linkText("Selenium - Web Browser Automation")).isDisplayed();
212         assertTrue("\"Selenium - Web Browser Automation\" is not display",flag);
213     }
214  =================================================================================================================================   
215     //CSS定位-2.通过id属性定位
216     @Test
217     public void test013_GetByIdAttribute(){
218         
219         //使用符号(#)来表示用id属性来定位
220         driver.findElement(By.cssSelector("#kw")).sendKeys("selenium");
221         driver.findElement(By.cssSelector("#su")).click();;
222         
223         Boolean flag = driver.findElement(By.linkText("Selenium - Web Browser Automation")).isDisplayed();
224         assertTrue("\"Selenium - Web Browser Automation\" is not display",flag);
225     }
226 ======================================================================================================================================    
227     //CSS定位-3.通过标签名定位
228     @Test
229     public void test014_GetByTagAttribute(){
230         //清空输入框,并输入查询关键字“selenium”,然后点击查询按钮
231         //input 这个tag在百度首页中比较多,所以需要使用findElements(),将所有input返回,并从中找寻需要的两个input
232         List<WebElement> inputs = driver.findElements(By.cssSelector("input"));
233         Iterator<WebElement> it = inputs.iterator();        
234         WebElement we = null;
235         WebElement inputWe = null;
236         WebElement buttonWe = null;
237         while(it.hasNext()){
238             we = (WebElement)it.next();
239             if(we.getAttribute("id").toString().equals("kw")){
240                 inputWe = we;
241             }
242             
243             if(we.getAttribute("id").toString().equals("su")){
244                 buttonWe = we;
245             }
246         }
247         
248         //找到之后开始操作
249         if(inputWe!=null && buttonWe!=null){
250             inputWe.clear();
251             inputWe.sendKeys("selenium");
252             buttonWe.click();                        
253         }else{            
254             System.out.println("can not find input and button");            
255         }
256         
257         try {
258             Thread.sleep(3000);
259         } catch (InterruptedException e) {
260             // TODO Auto-generated catch block
261             e.printStackTrace();
262         }
263         
264         //判断结果
265         Boolean flag = driver.findElement(By.linkText("Selenium - Web Browser Automation")).isDisplayed();
266         assertTrue("\"Selenium - Web Browser Automation\" is not display",flag);    
267     }
268 =============================================================================================================================    
269     //CSS定位-通过父子关系定位
270     @Test
271     public void test015_GetByParentTag(){
272         //清空输入框,并输入查询关键字“selenium”,然后点击查询按钮
273         //input 这个tag在百度首页中比较多,所以需要使用findElements(),将所有input返回,并从中找寻需要的两个input
274         List<WebElement> inputs = driver.findElements(By.cssSelector("span>input"));
275         Iterator<WebElement> it = inputs.iterator();        
276         WebElement we = null;
277         WebElement inputWe = null;
278         WebElement buttonWe = null;
279         while(it.hasNext()){
280             we = (WebElement)it.next();
281             if(we.getAttribute("id").toString().equals("kw")){
282                 inputWe = we;
283             }
284             
285             if(we.getAttribute("id").toString().equals("su")){
286                 buttonWe = we;
287             }
288         }
289         
290         //找到之后开始操作
291         if(inputWe!=null && buttonWe!=null){
292             inputWe.clear();
293             inputWe.sendKeys("selenium");
294             buttonWe.click();                        
295         }else{            
296             System.out.println("can not find input and button");            
297         }
298         
299         try {
300             Thread.sleep(3000);
301         } catch (InterruptedException e) {
302             // TODO Auto-generated catch block
303             e.printStackTrace();
304         }
305         
306         //判断结果
307         Boolean flag = driver.findElement(By.linkText("Selenium - Web Browser Automation")).isDisplayed();
308         assertTrue("\"Selenium - Web Browser Automation\" is not display",flag);    
309     }
310  ===========================================================================================================================       
311     //CSS定位-通过属性定位
312     @Test
313     public void test016_GetByAttribute(){
314         
315         //在中括号[]中可以放置任意唯一的属性值对来定位
316         driver.findElement(By.cssSelector("[id=kw]")).sendKeys("selenium");
317         driver.findElement(By.cssSelector("[id=su]")).click();;
318         
319         Boolean flag = driver.findElement(By.linkText("Selenium - Web Browser Automation")).isDisplayed();
320         assertTrue("\"Selenium - Web Browser Automation\" is not display",flag);
321     }
322  ===========================================================================================================================   
323     //CSS定位-通配符
324         @Test
325         public void test017_GetByAttributeAndWildcard(){
326             
327             //[class$=_ipt]代表以_ipt结尾
328             //[class^=bg]代表以bg开头
329             //[class*=_ip]代表中间内容是_ip
330             //这种方法存在一定的不稳定性,因为会出现匹配到多个元素的情况
331             driver.findElement(By.cssSelector("[class$=_ipt]")).sendKeys("selenium");
332             driver.findElement(By.cssSelector("[class^=bg]")).click();;
333             
334             try {
335                 Thread.sleep(3000);
336             } catch (InterruptedException e) {
337                 // TODO Auto-generated catch block
338                 e.printStackTrace();
339             }
340             
341             Boolean flag = driver.findElement(By.linkText("Selenium - Web Browser Automation")).isDisplayed();
342             assertTrue("\"Selenium - Web Browser Automation\" is not display",flag);
343         }
344==================================================================================================================================     
345     //CSS定位-组合定位
346     @Test
347     public void test018_GetByCombination(){
348         
349         //通过先定位父元素,再定位子元素。通过元素的class或者id属性来定位。
350         driver.findElement(By.cssSelector("form.fm>span>input.s_ipt")).sendKeys("selenium");
351         driver.findElement(By.cssSelector("form#form>span>input#su")).click();;
352     
353         
354         Boolean flag = driver.findElement(By.linkText("Selenium - Web Browser Automation")).isDisplayed();
355         assertTrue("\"Selenium - Web Browser Automation\" is not display",flag);
356     }
357     
358     
359 }

 以上方法都是为了定位到目标元素,没有好坏之分,只要能够定位到元素,使用上面的任何一个方法都可以。

posted @ 2016-07-01 10:54  月色深潭  阅读(4342)  评论(0编辑  收藏  举报