Selenium WebDriver:使用XPath单击SVG中的元素
我有一个带有几个圆形和矩形元素的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]
我花了一些时间研究这个,它似乎是一个Selenium和SVGs的一个常见问题,但我想知道是否有一个解决方法。 我发现的唯一解决方案是与SVG本身交互,我已经可以做到了。
我使用Selenium 2.28(并试用2.29)w / Java + Firefox 17。
任何想法不胜感激。
对于任何有兴趣的人,我用以下方式解决了这个问题:
1)我最初是在OSX上用Firefox 17和Selenium 2.28 / 29进行测试,但发现它只适用于Windows 18上的火狐18和Selenium 2.29
2)与标准SVG进行交互:
driver.findElement(By.xpath(YOUR XPATH)).click();
不起作用。 您需要使用操作。
3)与SVG对象进行交互,以下XPath可以工作:
"/*[name()='svg']/*[name()='SVG OBJECT']";
SVG对象是SVG元素下的任何对象(例如,circle,rect,text等)。
点击一个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();
不起作用。
试试这个解决方法:
WebElement mapObject = driver.findElement(By.xpath("//*[name()='svg']/*[name()='rect']"));
((JavascriptExecutor) driver).executeScript("arguments[0].click();", mapObject);
每当我尝试点击某些元素时遇到太多问题时,我都会使用此解决方法。
我们可以通过做这两件事来避免奇怪的xpath选择
WebElement mapObject = (WebElement) driver.executeScript('return document.querySelector(arguments[0])', "svg rect")
((JavascriptExecutor) driver).executeScript("arguments[0].dispatchEvent(new MouseEvent('click', {view: window, bubbles:true, cancelable: true}))", mapObject);
这对osx和phantomjs有效,但我认为它应该可以在任何现代浏览器中使用。
(我们使用js驱动程序,所以随时修复任何编译错误)
链接地址: http://www.djcxy.com/p/88723.html上一篇: Selenium WebDriver: clicking on elements within an SVG using XPath