Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么这个Selenium/XPath查询只选择第一个`g`标记?_Selenium_Xpath_Svg - Fatal编程技术网

为什么这个Selenium/XPath查询只选择第一个`g`标记?

为什么这个Selenium/XPath查询只选择第一个`g`标记?,selenium,xpath,svg,Selenium,Xpath,Svg,我有一个svg元素,里面有多个g标记。通常,当我按名称选择标记时,我会得到页面上所有标记的列表。例如,这将返回SeleniumWebElement实例的列表: browser.find_elements_by_xpath('//a') 但是当我尝试选择svg元素中的所有g标记时,我只返回第一个元素。例如: browser.find_element_by_xpath('//*[name()="svg"]/*[name()="g"]') 这里是我的标记: <svg xmlns="http:

我有一个
svg
元素,里面有多个
g
标记。通常,当我按名称选择标记时,我会得到页面上所有标记的列表。例如,这将返回Selenium
WebElement
实例的列表:

browser.find_elements_by_xpath('//a')
但是当我尝试选择
svg
元素中的所有
g
标记时,我只返回第一个元素。例如:

browser.find_element_by_xpath('//*[name()="svg"]/*[name()="g"]')
这里是我的标记:

<svg xmlns="http://www.w3.org/2000/svg">
    <g>...</g>
    <g>...</g>
    <g>...</g>
    ...
</svg>

...
...
...
...

如何选择所有
g
标记?

这是因为您使用了
find\u element\u by\u xpath
返回第一个元素。要返回所有元素,请使用
find\u elements\u by\u xpath

browser.find_elements_by_xpath('//*[name()="svg"]/*[name()="g"]')
但我会使用更短的CSS选择器:

browser.find_elements_by_css_selector('svg > g')

我会这样做:

使用以下XML:

...
<svg>
    <g>1</g>
    <g>2</g>
    <g>3</g>
</svg>
...
这将返回3个节点,如本网站所示:

注1:如果在
svg
标记上引入名称空间,您将在上面的站点上看到此错误:
XPath查询的默认(无前缀)名称空间URI始终为“”,并且无法将其重新定义为“http://www.w3.org/2000/svg“。


注2:这里还有一个类似的问题:

我不同意CSS定位器较短。如果写得正确,它们的长度通常相同:
//svg/g
@djangofan,如果“//svg/g”起作用,则您的语句是正确的,但事实并非如此。XPath表达式是我尝试的第一个表达式,但它没有返回任何元素。我从中获得了
name()=“svg”
代码片段
 //svg/g