Selenium WebDriver:使用XPath单击SVG中的元素

2022-08-31 22:35:39

我有一个包含一些圆形和矩形元素的SVG对象。使用webdriver,我可以单击主svg对象,但不能单击其中的任何元素。问题似乎只存在于单击(或任何鼠标交互)上,因为我可以使用getAttribute()来返回宽度,ID,x / y,文本等的值,以获取其下的任何内容。

下面是一个 HTML 示例:

    <div id="canvas">
        <svg height="840" version="1.1" width="757" xmlns="http://www.w3.org/2000/svg" style="overflow: hidden; position: relative;">
            <image x="0" y="0" width="757" height="840" preserveAspectRatio="none">
            <circle cx="272.34" cy="132.14">
            <rect x="241.47" y="139.23">
            <text style="text-anchor: middle; x="272.47" y="144.11">
        </svg>
    </div>

WebDriver尝试右键单击矩形元素的示例(但失败了):

    WebElement mapObject = driver.findElement(By.xpath("//*[name()='svg']/*[name()='rect']"));
    Actions builder = new Actions(driver);
    builder.contextClick(mapObject).perform();

但这有效并返回一个值:

    driver.findElement(By.xpath("//*[name()='svg']/*[name()='rect']")).getAttribute("x");    

当WebDriver出错时,通常是这样的:

    org.openqa.selenium.WebDriverException: '[JavaScript Error: "a.scrollIntoView is not a function" {file: "file:///var/folders/sm/jngvd6s97ldb916b7h25d57r0000gn/T/anonymous490577185394048506webdriver-profile/extensions/fxdriver@googlecode.com/components/synthetic_mouse.js" line: 8544}]' when calling method: [wdIMouse::move]

我花了一些时间研究这个问题,这似乎是硒和SVG的一个常见问题,但是我想知道是否有解决方法。我发现的唯一解决方案是与SVG本身进行交互,我已经可以做到了。

我正在使用Selenium 2.28(并尝试了2.29)w/ Java + Firefox 17。

任何想法都非常感谢。


答案 1

对于任何感兴趣的人,我通过以下方式解决了这个问题:

1)我最初是在OSX上使用Firefox 17和Selenium 2.28 / 29进行测试的,但发现它仅适用于带有Firefox 18和Selenium 2.29的Windows(至少对我来说)。

2)与标准SVG交互:

driver.findElement(By.xpath(YOUR XPATH)).click();

不起作用。您需要使用操作。

3)要与SVG对象交互,以下XPath的工作原理:

"/*[name()='svg']/*[name()='SVG OBJECT']";

SVG 对象是 SVG 元素下的任何内容(例如圆形、矩形、文本等)。

单击 SVG 对象的示例:

WebElement svgObject = driver.findElement(By.xpath(YOUR XPATH));
Actions builder = new Actions(driver);
builder.click(svgObject).build().perform();

注意:您需要在 click() 函数中调用路径;用:

moveToElement(YOUR XPATH).click().build().perform();

不起作用。


答案 2

请尝试以下解决方法:

WebElement mapObject = driver.findElement(By.xpath("//*[name()='svg']/*[name()='rect']"));
((JavascriptExecutor) driver).executeScript("arguments[0].click();", mapObject);

每当我在尝试单击某些元素时遇到太多问题时,我都会使用此解决方法。


推荐