2011-08-24 49 views
12

Tất cả các ví dụ về findElement (By.xpath) Tôi đã thấy tìm kiếm toàn bộ trang, ví dụ:Selenium 2 - Có thể findElement (By.xpath) được scoped đến một yếu tố cụ thể?

WebElement tr = ... // find a particular table row (no problem here) 
WebElement td = tr.findElement(By.xpath("/td[3]")); // Doesn't work! 

Tôi cũng đã thử các biến thể khác mà không may mắn:: "td [3]", "child :: td [3]"

WebElement td = driver.findElement(By.xpath("//td[3]")); 

Những gì tôi muốn đạt được điều này là

Sử dụng "// td [3]" tìm nút khớp đầu tiên trong toàn bộ trang, nghĩa là không bị giới hạn ở tr của tôi. Vì vậy, nó trông giống như khi bạn findElement bởi xpath, WebElement mà bạn gọi hàm findElement() đếm không có gì.

Có thể phạm vi findElement (By.xpath) cho một WebElement cụ thể không?

(Tôi đang sử dụng Chrome, trong trường hợp nó quan trọng.)

XIN LƯU Ý: By.xpath ("// td [3]") chỉ là một ví dụ. Tôi không tìm kiếm những cách khác để đạt được điều tương tự. Câu hỏi đặt ra chỉ là cố gắng xác định xem foo.findElement() có nhận thấy bất kỳ thông báo nào của foo khi được sử dụng với bộ chọn By.xpath hay không.

Trả lời

0
what i m understanding that u want to retrieve a particular td from a tr, so here's a snippet you can try it with your code to find 3rd td... 



WebElement tr=//...find a particular table row 
    List<WebElement> columns = tr.findElements(By.tagName("td")); 
    Iterator<WebElement> j = columns.iterator(); 
    int count=0; 
    while(j.hasNext()) 
      { 
       WebElement column = j.next(); 
       if(count==2) 
       { 
        System.out.print(column.getText()); 
       } 
       count++; 
      } 

You can change count value in if condition to retrieve another td.. 
Hope this will help you.. 
+0

Cảm ơn bạn đã cho tất cả các rắc rối này, Jay, nhưng "/ td ​​[3]" đã được chỉ là một ví dụ. Tôi muốn biết liệu bạn có thể thực hiện loại truy vấn có phạm vi bằng cách sử dụng xpath hay không, bởi vì việc có thể làm như vậy sẽ rất thuận tiện trong các tình huống nhất định. –

2

Tôi nghĩ đây có thể là lỗi trong cách mà Selenium2 sử dụng xpath. Tuy nhiên, tôi tin rằng tôi đã giới hạn thành công phạm vi bằng cách sử dụng ":: tổ tiên" trước đây.

Trong mọi trường hợp, bạn đã thử sử dụng Bộ chọn Css để giải quyết vấn đề này chưa? Đó có phải là một lựa chọn cho bạn? Hãy thử điều này:

tr.findElement (By.cssSelectors ("td: nnth of of type (3)"));

này nên thực hiện công việc và là tương đương với những gì bạn đã cố gắng ban đầu:

tr.findElement (By.xpath ("// td [3]"));

+0

Cảm ơn lời khuyên 'tổ tiên ::' - tôi sẽ thử điều này. Như tôi đã nhận xét trong câu trả lời cuối cùng, "/ td ​​[3]" chỉ là một ví dụ. Tôi không thích bộ chọn không xpath nếu có thể (không phải vì chúng không đáng tin cậy trong IE). Nhưng câu hỏi này là hoàn toàn để thử và xác định xem bạn có thể làm một truy vấn phạm vi bằng cách sử dụng xpath. –

4

Tôi cũng gặp vấn đề này và dành khá nhiều thời gian để tìm ra giải pháp thay thế. Và đây là những gì tôi đã tìm ra:

WebElement td = tr.findElement(By.xpath("td[3]")); 

Không chắc chắn tại sao, nhưng điều này phù hợp với tôi.

+2

Bằng cách không có dấu gạch chéo hàng đầu (hoặc hai) truy vấn là tương đối thay vì tuyệt đối. Xem câu trả lời của tôi cho một liên kết đến tài liệu. – Adam

+0

WebDriver treo/đợi tôi cho đến khi tôi thay đổi thời gian chờ ngầm định về 0 (mặc định). http://seleniumhq.org/docs/04_webdriver_advanced.html#implicit-waits – Jayen

10

Dựa trên câu trả lời của ZzZ Tôi cho rằng vấn đề là các truy vấn bạn đang thử là tuyệt đối thay vì tương đối. Bằng cách sử dụng bắt đầu /, bạn bắt buộc tìm kiếm tuyệt đối. Thay vào đó, hãy sử dụng tên thẻ như ZzZ được đề xuất, ./ hoặc .//.

Look trong XPath docs trong "Vị trí Đường dẫn Expression"

+1

Điều này đúng và cũng được giải thích trong [Tài liệu Selen] (http://selenium.googlecode.com/svn/trunk/docs/api/java /org/openqa/selenium/WebElement.html) cho Giao diện WebElement, trong phương thức "findElements". – gamliela

0

WebElement td = tr.findElement (By.xpath ("/ td ​​[3]"));

Nếu bạn chỉ muốn tìm các phần tử con của tr, hãy sử dụng đường dẫn tương đối không phải là tuyệt đối.

này nên làm việc:

int index = 3; 
List<WebElement> tds = tr.findElements(By.xpath(".//td")); 
System.out.println(tds[index].getText()); 
Các vấn đề liên quan