2016-09-06 3 views
0

So hier ist der gegenwärtige XPath, den ich versuche zu verwenden.Konnte Element wegen eines dynamischen xpath nicht finden

//*[@id="highcharts-33"]/svg/g[3]/g[1]/text 

Das Problem ist, dass dies ein dynamischer XPath ist, so geht es wie "highcharts-33", "highcharts-34" etc ... Ich mache Screenshots von Thesen Graphen, indem Sie auf ein Kontrollkästchen klicken. Jedes Mal, wenn das Kontrollkästchen aktiviert/deaktiviert ist, haben die nächsten Diagramme eine andere ID.

Hier ist der Fehler, den ich in der cmd bekommen bin:

NoSuchElementException: Nachricht: Kann Element suchen: { "Methode": "XPath", "Selektor": "// * [enthält (@ ID, 'highcharts -')]/svg/g [3]/g [1]/text "}

Sie können hier sehen, ich versuche zu verwenden" enthält ". Ich habe auch versucht, "Starts mit" zu verwenden, aber ich kann den Graphen immer noch nicht finden.

Hier sind die Dinge, die ich versucht habe:

textvote = self.driver.find_element_by_xpath("//*[contains(@id,'highcharts-')]/svg/g[3]/g[1]/text").text 
textvote = self.driver.find_element_by_xpath("//*[starts-with(@id,'highcharts-')]/svg/g[3]/g[1]/text").text 

ich auf Stack-Überlauf gesucht und sah auf sich einige Themen, und es wurde immer beginnt mit-/ enthält oder ein unbeantwortetes Thema. Also benutze ich starts-with/contains wrong.

Wenn Sie möchten, dass ich mehr Code teile, zögern Sie nicht. Danke.

Edit: Hinzufügen relevent HTML

<div id="chartListContainer"> 
<div id="chart0" class="gauge-chart" data-highcharts-chart="16"><div  class="highcharts-container" id="highcharts-33" 
<div class="highcharts-container" id="highcharts-33" 
<svg version="1.1" 
<g class="highcharts-data-labels highcharts-tracker" 
<g zIndex="1" 
<text x="0" zIndex="1" style="font-size:30px;font-family:Open Sans;color:#1abb1a;fill:#1abb1a;" y="32"><tspan>80.0% (4 votes)</tspan></text> 

Ich versuche, den Text aus der letzten Zeile zu extrahieren.

+0

die relevent html hinzufügen auch mit ein oder zwei Ebenen über – Grasshopper

+0

Müssen Sie Ihre HTML auch teilen .. –

+0

Bitte fügen Sie die HTML des Elements. – Dalvenjia

Antwort

0

Ich gehe davon aus, dass es nur ein <text> Element in Ihrem <div id="highcharts-*> Element, so dass Sie CSS-Selektor div[id^="highcharts"] text

textvote = self.driver.find_element_by_css("div[id^='highcharts-'] text").text 

Diese CSS wählt alle <text> Elemente innerhalb eines <div> Element mit id, beginnend mit "highcharts-" könnten versuchen, , aber wenn Sie mehr als eine <text> Elemente haben, könnten Sie in Schwierigkeiten geraten.

EDIT:

Nach einem weiteren Blick scheint, dass ich falsch war anzunehmen, dass es nur ein <text> Element war, ein fester CSS-Selektor Ihre XPath zu imitieren ist:

textvote = self.driver.find_element_by_css("div[id^='highcharts-']>svg>g:nth-of-type(3)>g:nth-of-type(1)>text").text 
+0

Es gab tatsächlich mehr als ein Element, so dass Ihre zweite Idee perfekt funktionierte. Vielen dank für Deine Hilfe. – xZeasy