2017-06-27 2 views
1

Dies ist eine Art, wie aussieht (siehe unten). Ich möchte den Text "Seite 1 bis 20" in einer String-Variable für die spätere Verwendung speichern.Wie man Text, der direkt unter dem div liegt, mit Selen in C# bekommt?

Das ist, was ich tat: string numOfPages = driver.FindElement(By.XPath("//*[@id='tabletransaction']/text()")).Text;

Ive auf vielfältige Weise versucht, aber so ist das Ergebnis ein [Objekt Text] es arbeitet nicht, wie es ein Element sein muss.

<div id="tabletransaction"> 
    <table id ="ticketransaction"> 
     <thead><tr><th>Some text</th></tr></thead> 
     <thead><tr><th>Some text</th></tr></thead> 
     <thead><tr><th>Some text</th></tr></thead> 
     <thead><tr><th>Some text</th></tr></thead> 
    </table> 

    Page 1 to 20 
</div> 
+0

vielleicht Text ist kein Element und es kann kein Element sein? Element hier ist ein 'div', das Text enthält –

+0

Ich weiß das, aber wie kann ich den Text holen. Wenn ich versuche, das direclty auf dem div-Tag zu tun, wird der ganze Text einschließlich des Texts zurückgeholt – jaikl

+0

Mögliches Duplikat von [Wie man Text vom Elternelement erhält und Text von Kindern ausschließt (C# Selenium)] (https: // stackoverflow. com/questions/28945692/how-to-get-text-from-elter-element-und-exclude-text-from-children-c-selen) – Kirhgoph

Antwort

1

Sie benötigen /text() von Ihrem XPath zu entfernen:

Ihr XPath kein Element zurückkehrt; Es gibt einen Textknoten zurück. Während dies möglicherweise in Selenium RC (und durch Erweiterung, Selenium IDE) tadellos war, erfordern die Methoden auf der WebDriver WebElement-Schnittstelle ein Elementobjekt, nicht nur einen DOM-Knoten Objekt. WebDriver funktioniert wie beabsichtigt. Um das Problem zu beheben, müssen Sie das HTML-Markup so ändern, dass der Textknoten in einem Element wie z. B. <span> eingeschlossen wird.

Referenz: https://github.com/seleniumhq/selenium-google-code-issue-archive/issues/5459#issuecomment-192110781

Hinweis: Leider, wenn Sie /text() aus dem XPath entfernen, werden Sie nun den Text des gesamten Elements der Auswahl sein. Ohne Selektoren, die um den Text "Page 1 to 20" gewickelt sind, ist es nicht möglich, nur diesen Text auszuwählen.


Hier ist eine naive Art und Weise Ihr spezifisches Problem zu lösen:

die <div> auswählen. Text und die <table>. Text, dann subtrahieren (string.Replace) die <table>. Text von der <div>. Text:

// "Some text\r\nSome text\r\nSome text\r\nSome text\r\nPage 1 to 20" 
string divText = Driver.FindElement(By.Id("tabletransaction")).Text; 

// ""Some text\r\nSome text\r\nSome text\r\nSome text" 
string tableText = Driver.FindElement(By.Id("ticketransaction")).Text; 

// "Page 1 to 20" 
string remainingText = divText.Replace(tableText, string.Empty).Trim(); 
+0

Vielen Dank! Es funktionierte:) – jaikl

Verwandte Themen