2015-03-09 14 views
8

Chỉ có thể nhận văn bản từ phần tử gốc chứ không phải con của nó trong Selenium?Cách nhận văn bản từ phần tử gốc và loại trừ văn bản khỏi trẻ em (C# Selenium)

Ví dụ: Giả sử tôi có đoạn mã sau:

<div class="linksSection> 
    <a href="https://www.google.com/" id="google">Google Link 
    <span class="helpText">This link will take you to Google's home page.</span> 
    </a> 
    ... 
</div> 

Trong C# (hoặc bất kỳ ngôn ngữ), tôi sẽ có:

string linktext = driver.FindElement(By.CssSelector(".linksSection > a#google")).Text; 
Assert.AreEqual(linkText, "Google Link", "Google Link fails text test."); 

Tuy nhiên, Văn bản liên kết sẽ có "liên kết Google LinkThis sẽ đưa bạn đến trang chủ của Google. "

Nếu không thực hiện một chuỗi các thao tác chuỗi (chẳng hạn như lấy văn bản của tất cả các trẻ em và trừ nó khỏi văn bản kết quả của phụ huynh), có cách nào để lấy văn bản từ phần tử gốc không?

+1

đơn giản trả lời là: không có, bạn phải làm các thao tác chuỗi. Một câu trả lời có liên quan hơn sẽ là sự kết hợp của phương thức JavaScript và XPath substring-before(). http://zvon.org/comp/r/ref-XPath_2.html#Functions~substring-before Nhưng đó vẫn là thao tác chuỗi, chỉ ở một cấp độ khác. – SiKing

+0

Cảm ơn! Giải pháp hiện tại của tôi là thực hiện xác minh "string.Contains()" đơn giản. Nhưng đó có thể là lỗi trong một số trường hợp. – Machtyn

+0

có thể trùng lặp của [Làm thế nào để có được văn bản của một phần tử trong Selenium WebDriver (thông qua Python api) mà không bao gồm văn bản phần tử con?] (Http://stackoverflow.com/questions/12325454/how-to-get-text-of -an-element-in-selenium-webdriver-via-the-python-api-without) – Louis

Trả lời

6

Đây là một common problem trong selenium vì bạn không thể truy cập trực tiếp vào nút văn bản - nói cách khác, biểu thức XPath và bộ chọn CSS phải trỏ đến phần tử thực.

Dưới đây là danh sách các giải pháp khả thi cho vấn đề của bạn:

  • nhận được văn bản các yếu tố cha mẹ, cho mỗi đứa trẻ, nhận văn bản và loại bỏ nó từ văn bản của cha mẹ. Những gì bạn đã để lại là văn bản mong muốn - Google Link trong trường hợp của bạn.
  • nếu bạn muốn nhận được Google Link chỉ để xác nhận, có thể bạn sẽ không sao nếu kiểm tra xem văn bản của phụ huynh có là tarts vớiGoogle Link hay không. Xem StringAssert.StartsWith().
  • tải outerHTML văn bản và nguồn cấp dữ liệu của cha mẹ vào Trình phân tích cú pháp HTML, như Html Agility Pack. Một cái gì đó dọc theo những dòng:

    string outerHTML = driver.FindElement(By.CssSelector(".linksSection > a#google")).GetAttribute("outerHTML"); 
    
    HtmlDocument html = new HtmlDocument(); 
    html.LoadHtml(outerHTML); 
    
    HtmlAgilityPack.HtmlNode a = html.DocumentNode.SelectNodes("//a[@id='google']"); 
    HtmlNode text = strong.SelectSingleNode("following-sibling::text()"); 
    
    Console.WriteLine(text.InnerText.Trim()); 
    
+0

Làm thế nào chúng ta có thể thực hiện nó trong Selenium Java? Tôi đang cố gắng để tìm thấy nó ra, nhưng không thể tìm thấy chức năng LoadHtml có ... bất cứ ai có thể giúp tôi ở đây? – zeal

Các vấn đề liên quan