dom中有一个rect对象:
<rect class="slv-blank" id="id123" height="8.8" stroke-width="1px" width="18.8" x="59.2" y="37.5"></rect>
我正在尝试使用以下代码进行搜索:
WebDriverWait(driver, 1).until(ec.presence_of_element_located(("xpath", '//rect[@id="id123"]'))).click()
这不起作用。
但是以下内容确实存在:
WebDriverWait(driver, 1).until(ec.presence_of_element_located(("xpath", '//*[name()="rect"][@id="id123"]'))).click()
关于第一个为什么不起作用的任何线索吗?
答案 0 :(得分:2)
<rect>
<rect>
元素是基本的SVG形状,可创建矩形,该矩形由其角的位置,宽度和高度定义。矩形的角可能会变圆。
一个例子:
<svg viewBox="0 0 220 100" xmlns="http://www.w3.org/2000/svg">
<!-- Simple rect element -->
<rect x="0" y="0" width="100" height="100" />
<!-- Rounded corner rect element -->
<rect x="120" y="0" width="100" height="100" rx="15" ry="15" />
</svg>
<rect>
个元素中的attributes如下:
x
:此属性确定矩形的x坐标。
y
:此属性确定矩形的y坐标。
width
:此属性确定矩形的宽度。
height
:此属性确定矩形的高度。
rx
:此属性确定矩形的水平角半径。
ry
:此属性确定矩形的垂直角半径。
pathLength
:此属性允许以用户单位指定路径的总长度。
注意:从SVG2开始,x,y,宽度,高度,rx和ry是几何属性,这意味着这些属性也可以用作该元素的CSS属性。
由于<rect>
元素是 SVG 元素,因此要定位此类元素,您必须在使用SVG namespace来访问元素时明确指定xpath,如下所示:
对于<svg>
元素:
//*[name()="svg"]
对于<g>
元素:
//*[name()="svg"]/*[name()="g"]
对于<rect>
元素:
//*[name()="svg"]/*[name()="g"]/*[name()="rect"]
//*[name()="svg"]/*[name()="rect"]
您可以在
中找到一些相关的详细讨论。答案 1 :(得分:1)
使用Action
类或JavaScript
执行程序。
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
from selenium.webdriver.common.action_chains import ActionChains
elememnt=WebDriverWait(driver, 1).until(ec.presence_of_element_located(("xpath", '//*[@id="id123"]')))
ActionChains(driver).move_to_element(elememnt).click().perform()
OR
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
from selenium.webdriver.common.action_chains import ActionChains
elememnt=WebDriverWait(driver, 1).until(ec.presence_of_element_located(("xpath", '//*[@id="id123"]')))
driver.execute_script("arguments[0].click();",elememnt)