2012-04-27 26 views
8

Tôi đang viết một bài kiểm tra JUnit cho một trang web, sử dụng Selenium và tôi đang cố gắng xác minh rằng văn bản mong muốn tồn tại trong một trang. Mã của trang web tôi đang thử nghiệm trông như sau:Selenium: Trích xuất văn bản của một div với cssSelector trong Java

<div id="recipient_div_3" class="label_spacer"> 
    <label class="nodisplay" for="Recipient_nickname"> recipient field: reqd info </label> 
    <span id="Recipient_nickname_div_2" class="required-field"> *</span> 
    Recipient: 
</div> 

tôi muốn so sánh gì được mong đợi với những gì trên trang, vì vậy tôi muốn sử dụng Assert.assertTrue(). Tôi biết rằng để có được tất cả mọi thứ từ các div, tôi có thể làm

String element = driver.findElement(By.cssSelector("div[id='recipient_div_3']")).getText().replaceAll("\n", " "); 

nhưng điều này sẽ trở lại "reqd thông tin * Người nhận:"

Có cách nào để chỉ nhận được văn bản từ div ("Người nhận ") sử dụng cssSelector, không có các thẻ khác?

Trả lời

4

Bạn không thể làm điều này với một chọn CSS, vì selectors CSS không có một cách tiếp cận đủ hạt mịn để diễn tả "nút văn bản chứa trong DIV nhưng không phải của mình các nội dung khác ". Bạn có thể làm điều đó với một bộ định vị XPath, mặc dù:

driver.findElement(By.xpath("//div[@id='recipient_div_3']/text()")).getText() 

Đó biểu thức XPath sẽ xác định chỉ nút văn bản duy nhất đó là một con trực tiếp của DIV, chứ không phải tất cả các văn bản chứa trong nó và con của nó nút.

+2

Các locator XPath cung cấp là hợp lý và làm việc trong giao diện điều khiển của Chrome, nhưng nó sẽ không làm việc trong Selenium. Selenium sẽ ném lỗi sau đây ... 'Bộ chọn được chọn // div [@ class = 'StdLevel1']/text() không hợp lệ hoặc không dẫn đến một WebElement. Lỗi sau xảy ra: InvalidSelectorError: Kết quả của biểu thức xpath "// div [@ class = 'StdLevel1']/text()" là: [đối tượng Văn bản]. Nó phải là một element.' – BSchlinker

+0

Vì vậy, có một giải pháp hoặc bạn sẽ chỉ lấy div và phân tích cú pháp chuỗi getText()? –

+0

Với sự hiểu biết của tôi, selen Infact làm cho phép hàm văn bản(), nút, vv. – SIslam

4

Tôi không chắc chắn nếu nó có thể với một định vị css, nhưng bạn có thể nhận được văn bản từ div, sau đó nhận được văn bản từ các nút con div và trừ chúng. Một cái gì đó như thế (mã không được kiểm tra):

String temp = ""; 
List<WebElement> tempElements = driver.findElements(By.cssSelector("div[id='recipient_div_3'] *")); 
for (WebElement tempElement : tempElements) { 
    temp =+ " " + tempElement.getText(); 
} 
String element = driver.findElement(By.cssSelector("div[id='recipient_div_3']")).getText().replaceAll("\n", " ").replace(temp, ""); 

Đây là trường hợp khi bạn cố gắng tránh sử dụng xpath. Xpath cho phép để làm điều đó:

//div[@id='recipient_div_3']/text() 
0

Bạn cũng có thể lấy nội dung văn bản của một phần tử và xóa các thẻ bằng regexp. Cũng cần chú ý: bạn nên sử dụng quntifier miễn cưỡng https://docs.oracle.com/javase/tutorial/essential/regex/quant.html

String getTextContentWithoutTags(WebElement element) { 
    return element.getText().replaceAll("<[^>]*?/>", "").trim(); 
} 
Các vấn đề liên quan