在Selenium中选择SVG标签内的g元素

3

我刚刚开始使用Selenium,在某些地方卡住了,需要专家帮助。

这是我的HTML代码:

<div id='d3_tree'>
   <svg>
     <g transform="translate(20,50)>
        <g class='node'>
        </g> 
        <g class='node pe_node'>
        </g>
        <g class='node pe_node'>
        </g> 
     </g>
   </svg>
</div>

我需要选取所有class为pe_node<g>元素,并对它们调用上下文菜单。 我已经尝试按以下方式获取svg文件:

node = self.driver.find_elements(By.XPATH, "//div[@id='d3_tree']/'svg']/g")

我读过一些资料,了解到 SVG 不能直接进行选择。因此,我尝试了以下方法:

nodes = self.driver.find_elements(By.XPATH, "//div[@id='d3_tree']/*[name()='svg']/g")

并且

  nodes = self.driver.find_elements(By.XPATH, "//div[@id='d3_tree']/*[local-name()='svg']/g")

但是对我来说仍然不起作用,结果中出现了[]

有人可以指导我如何选择svg内class为pe_node的<g>吗?

任何帮助都将不胜感激。

谢谢!

5个回答

6
你已经到了一半,以下内容应该可以工作:
nodes = self.driver.find_elements(By.XPATH, "//div[@id='d3_tree']/*[name()='svg']/*[name()='g']")

'svg'中的每个元素都必须被引用为`/*[name()='']`。

在这种情况下,您可以使用以下简化:

nodes = self.driver.find_elements(By.XPATH, "//div[@id='d3_tree']/*/*[name()='g']")

1
这只为我选择了第一个 g - jds

0
你可以这样写:
//div[@id='d3_tree']/*[name()='svg']/*[name()='g' and @class='node pe_node']/*[name()='g'][2]

0

你能不能使用 tagName 来选择 <svg> 元素?

node = driver.findElement(By.tagName("svg"))
otherNodes = node.findElements(By.Xpath("./g[contains(@class, 'pe_node')]")

谢谢@Mark,但是那段第二行代码对我不起作用 :( - user2243651
抱歉之前没有看到你在使用Python绑定。尝试 node = driver.find_element_by_tag_name("svg") nodes = node.find_element_by_xpath("./g[contains(@class, 'pe_node')]")希望这能给你一个 pe_nodes 列表。 - Mark Rowlands

0
你可以尝试一下,我不知道你在用哪种语言。但是下面的Selenium可能会对你有用。节点将返回所有带有类为“node pe_node”的svg标签下的元素。
node = self.driver.find_element(By.XPATH, "//div[@id='d3_tree']/svg]")
nodes = node.find_elements(By.XPATH,"//g[@class='node pe_node']")

谢谢@omkar,我正在使用Python语言。我尝试了你的代码,但它仍然无法工作:( - user2243651
我能够获取节点,但是节点仍然是 []。 - user2243651
不确定如何在Python中编写代码,但Nodes = node.findElements(By.Xpath("//g[@class='node pe_node']")应该适用于您。如果不行,可能会有其他问题。 - Omkar

0

以下XPath应该可以正常工作://div[@id='d3_tree']//g[contains(@class, 'pe_node')]


谢谢@cherya,我已经尝试了,但它仍然返回[]括号 :( - user2243651
你可以尝试使用CSS选择器。如果这些类是唯一的,那么代码会像这样:nodes = self.driver.find_elements(By.cssSelector(".node pe_node")); - ievche
我正在使用Python语言,但是出现了一个错误:AttributeError: type object 'By' has no attribute 'cssSelector'。 - user2243651
尝试使用'driver.find_elements_by_css_selector(".node pe_node")',但我不确定 :) - ievche

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接