由于动态xpath,无法定位元素

时间:2016-09-06 14:55:01

标签: python xpath selenium-webdriver

所以这是我尝试使用的当前XPath。

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

问题是这是一个动态X路径,所以它就像" highcharts-33"," highcharts-34"等等...我点击一个复选框,制作这些图表的截图。每次选中/取消选中复选框时,下一个图形将具有不同的ID。

以下是我进入cmd的错误:

  

NoSuchElementException:消息:无法找到元素:{"方法":" xpath","选择器":" // * [包含( @id,' highcharts - &#39)] / SVG / g的[3] / G [1] /文本"}

你可以在这里看到我试图使用"包含"。我也尝试使用"开始 - 用"但我仍然无法找到图表。

以下是我尝试过的事情:

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

我搜索了堆栈溢出,并在其上看到了一些主题,它始终是开始 - 包含/包含或未回答的主题。所以我可能正在使用start-with /包含错误。

如果您希望我分享更多代码,请不要犹豫。 谢谢。

编辑:添加相关的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>

我试图从最后一行中提取文字。

1 个答案:

答案 0 :(得分:1)

我假设您的<text>元素中只有一个<div id="highcharts-*>元素,因此您可以尝试使用CSS选择器div[id^="highcharts"] text

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

此CSS选择<text>元素内的所有<div>元素,其中id以“highcharts-”开头,但如果您有多个<text>元素,则可能会遇到麻烦。< / p>

编辑:

再看一下我认为假设那里只有一个<text>元素是错误的,一个固定的CSS选择器来模仿你的xpath:

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