Selenium: элемент SVG, встроенный в тег Object, не был идентифицирован в Selenium IDE или xPath? - PullRequest
3 голосов
/ 06 декабря 2011

У меня есть html-сегмент, подобный этому

<div id="imageholder>
<object data="1.svg" width="100%" height="100%" type="image/svg+xml">
</object>
</div>.

Когда я вижу элемент проверки в Firefox / firebug, я не вижу структуру файла SVG, но в Chrome я вижу файл svgструктура, как показано ниже:

<div id="imageholder>
<object data="1.svg" width="100%" height="100%" type="image/svg+xml">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" stroke-dasharray="none"
shape-rendering="auto" font-family="'Dialog'" width="4800">
<desc>widthmm=90.48768097536195 heightmm=49.38127063754128</desc>
<g>
<g>....</g>
</g>

Однако я не могу найти тег svg или любой элемент g через X-путь.Я попытался с

//div[contains(@id='imageholder')] 

, тогда я получил элемент правильно.

//div[contains(@id='imageholder')/object] 

также возвращает элемент правильно.Но

//div[contains(@id='imageholder')/object/svg]

терпит неудачу.

Мое требование: мне нужно нажать на несколько g элементов SVG-изображения, но я не могу его найти.Ваша помощь будет оценена.Спасибо

Добавлено несколько дополнительных деталей: [Дек 8,2011]

driver.findElement(By.xpath("//div[@id='imageholder']/object"));//This worked correctly 
driver.findElement(By.xpath("//div[@id='imageholder']/object/*[local-name()='svg' and  namespace-uri()='http://www.w3.org/2000/svg']"));//did not work 

Я также перепробовал все возможные комбинации XPath - Поиск элементов по пространству имен атрибута , заданного наэта ссылка, но не удалось.Спасибо

Для получения более подробной информации, пожалуйста, найдите образец кода.

Sample.html

<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE9;chrome=IE8">
<body>
<div id="imageholder"><object data="1.svg" width="100%" height="100%" type="image/svg+xml"></object></div>
</body>
</html>  

1.svg

<?xml version="1.0"?>
<!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.0//EN'
    'http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd'>
<svg stroke-dasharray="none" shape-rendering="auto" xmlns="http://www.w3.org/2000/svg" font-family="&apos;Dialog&apos;"
 width="4800" text-rendering="auto" fill-opacity="1" contentScriptType="text/ecmascript" color-interpolation="auto"
 color-rendering="auto" preserveAspectRatio="xMidYMid meet" font-size="12" viewBox="0 0 4800 2619" fill="black"
 xmlns:xlink="http://www.w3.org/1999/xlink" stroke="black" image-rendering="auto" stroke-miterlimit="10"
 zoomAndPan="magnify" version="1.0" stroke-linecap="square" stroke-linejoin="miter" contentStyleType="text/css"
 font-style="normal" height="2619" stroke-width="1" stroke-dashoffset="0" font-weight="normal" stroke-opacity="1"
    >
<g style="fill-opacity:0.7; stroke:black; stroke-width:0.1cm;">
    <circle cx="6cm" cy="2cm" r="100" style="fill:red;"
            transform="translate(0,50)"/>
    <circle cx="6cm" cy="2cm" r="100" style="fill:blue;"
            transform="translate(70,150)"/>
    <circle cx="6cm" cy="2cm" r="100" style="fill:green;"
            transform="translate(-70,150)"/>
</g>
</svg>

Пожалуйста, нажмите наsample.html после сохранения файлов.

Ответы [ 3 ]

1 голос
/ 06 декабря 2011

//div[contains(@id='imageholder')/object/svg завершается ошибкой, потому что вы не сообщили процессору, что пространство имен элемента svg не совпадает с другим. См. xmlns="http://www.w3.org/2000/svg".

Вы можете написать: //div[contains(@id,'imageholder')]/object/*[local-name()='svg' and namespace-uri()='http://www.w3.org/2000/svg'].

РЕДАКТИРОВАТЬ (после прочтения вашего обновления):

Проблема может заключаться в том, что в исходном html-файле у вас есть ссылка на svg-файл в элементе object.

Даже если ваш браузер включает файл svg в dom, выражение XPath, похоже, воздействует на сам оригинальный файл (с помощью href). Извините, но я не знаю таких случаев использования XPath и не могу рассказать вам больше.

0 голосов
/ 09 июля 2018

Переключитесь на фрейм по умолчанию, прежде чем пытаться получить доступ к тегу SVG, т.е. фрейм (0). Перепробовал многие решения XPath, но ничего не получалось, но переключение на фрейм работало как шарм, здесь он рассматривал SVG как фрейм.

System.setProperty("webdriver.gecko.driver", "C:\\Users\\Administrator\\Downloads\\geckodriver-v0.18.0-win64\\geckodriver.exe");
    WebDriver d = new FirefoxDriver();
    d.navigate().to("file:///C:/Users/Administrator/Desktop/sample/svg.html");
    Thread.sleep(2000);
    d.switchTo().frame(0);
    Actions builder = new Actions(d);
    WebElement svgObject = d.findElement(By.xpath("(//*[name()='svg']/*[name()='g']/*[name()='circle'])[2]"));
    //"style" here prints the colour of the second circle in the svg tag.  ie( blue circle)
    System.out.println(svgObject.getAttribute("style"));
    System.out.println(svgObject.getAttribute("transform"));
    System.out.println(svgObject.getAttribute("cx"));
    System.out.println(svgObject.getAttribute("cy"));
    System.out.println(svgObject.getAttribute("r"));
    builder.moveToElement(svgObject).click();
0 голосов
/ 16 декабря 2011

Нужно немного поработать, чтобы получить SVG-документ. Кажется, это невозможно через WebElement. Но через JavaScriptExecutor мы можем получить полную ссылку на DOM, и через стандартный шаблон DOM это возможно. Как: Мы можем сделать-> docuemnt.getElementsByTagName ('OBJECT'). ContentDocument. Это даст полную ссылку на SVG DOM.

Ссылка ниже не является прямым ответом, но возможность Sel2.0 можно увидеть через это. Selenium: можно ли установить какое-либо значение атрибута WebElement в Selenium?

Может быть полезным для всех :-) Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...