2015-12-02 3 views
0

Вот элементы html и команда, которую я запускаю, которая проверяет, существует ли на странице «lol». Он не находит «LOL» и не уверен, почему.Любая идея, почему этот xpath не работает?

<svg data-reactid=".0.1.0.0.1.0" height="2129" width="1252"> 
    <g data-reactid=".0.1.0.0.1.0.$http=2//10=1203=167=127=29090/img/103?token=0a11944b491366ab96caf34c8e3991d436c86d655"> 
    <image height="2129px" width="1252px"xlink:href="http://10.203.67.27:9090/img/103?token=a11944b491366ab96caf34c8e3991d436c86d655"> 
    </g> 
    <g data-reactid=".0.1.0.0.1.0.1"> 
    <line class="severity-inactive " data-reactid=".0.1.0.0.1.0.1.$conn2" y2="1209.895121951221" x2="677.0326086956554" y1="708.8012195121894" x1="1126.1195652173908" style="stroke-width: 7;"> 
    <line class="severity-inactive " data-reactid=".0.1.0.0.1.0.1.$conn4" y2="329.7353658536632" x2="841.593360995849" y1="708.8012195121894" x1="1126.1195652173908" style="stroke-width: 7;"> 
    </g> 
    <g data-reactid=".0.1.0.0.1.0.2"> 
    <g data-reactid=".0.1.0.0.1.0.2.$node4"> 
     <circle class="severity3 " data-reactid=".0.1.0.0.1.0.2.$node4.0" r="9.674435999999993" cy="708.8012195121894" cx="1126.1195652173908"> 
     <g data-reactid=".0.1.0.0.1.0.2.$node4.1"> 
     <rect class="node-label-background" data-reactid=".0.1.0.0.1.0.2.$node4.1.0" height="21" width="22" y="716.8012195121894" x="1115.1195652173908"> 
     <text class="node-label" data-reactid=".0.1.0.0.1.0.2.$node4.1.1" y="721.3012195121894" x="1118.1195652173908">lol</text> 
    </g> 
</g> 


By.xpath(//*[name()='svg']/*[name()='text' and text()='"+lol+"']) 
+0

Вы имеете в виду 'By.xpath (" // * [name() = 'svg']/* [name() = 'text' и text() = '"+ lol +"'] ")' (с дополнительными кавычками только внутри скобок)? Если да, то какова ценность вашей переменной 'lol'? –

+0

Значение lol равно lol, как показано здесь: lol По какой-то причине его просто не нахожу – Shawn

+0

Так что получается, что я не переключился на iframe, в котором был весь HTML-код, поэтому я не видел никаких ценностей и борется. Исправлено ... – Shawn

ответ

0

Это правильно XPath:

By.xpath("//*[name()='svg']//*[name()='text' and text()='lol']") 

Добавить кавычки, используйте 'лол' строку (не изменяется) и добавить вторую косую черту перед text элементом локатора (это не SVG-х прямым ребенок).

+0

Все еще не работает печально. Мне интересно, нужно ли здесь делать '/ previous-sibling :: circle [@ class = 'severity3']' в конце. Xpath возвращается, но по какой-то причине его не находит «lol». И lol = lol. – Shawn

+0

Интересно, он отлично работает для меня, я только что проверил его (после добавления двух дополнительных закрывающих тегов для ''). Однако я попробовал его в консоли браузера, используя '$ x()', а не селен, если это имеет значение. Вы на 100% уверены, что эта разметка присутствует на странице, когда вы ее ищете? Можете ли вы вставить точную ошибку ошибки/утверждения, которую вы получаете? – xersiee

+0

Да html выше показывает сам текст, и я подтвердил его существование и в dom. Ошибка - это всего лишь созданное фреймворком сообщение об ошибке, указывающее false или «lol» не найдено, так что это. Что означает u после добавления двух дополнительных закрывающих тегов? – Shawn

0

Я думаю, что вам не хватает '/'

Yours: By.xpath(//*[name()='svg']/*[name()='text' and text()='"+lol+"'])

Mine: By.xpath(//*[name()='svg']//*[name()='text' and text()='"+lol+"'])

+0

Все еще не работает печально. Мне интересно, нужно ли здесь делать '/ previous-sibling :: circle [@ class = 'severity3']' в конце. Xpath возвращается, но по какой-то причине его не находит «lol». И lol = lol. – Shawn

+0

Другое дело, что ваш XML не очень важен, мне пришлось закрыть много элементов, которые остаются открытыми, чтобы xpath работал. Может быть, если вы исправите их, тогда будет работать xpath? –

+0

Я расширил элементы, чтобы их можно было увидеть на самом деле. Первые два 'g data-reactid''s – Shawn

0

Как насчет //svg//text[contains(text(),'lol')]

(выбор //* для одного тега, чьи имя известно вам (svg) довольно неэффективно, выбор его напрямую намного лучше, аналогично в случае text - вы уже знаете имя тега, поэтому просто используйте его; наконец, contains заботится о том, что искомый текст может быть частью всего текста)

+0

Все еще не работают печально. Мне интересно, нужно ли здесь делать '/ previous-sibling :: circle [@ class = 'severity3']' в конце. Xpath возвращается, но по какой-то причине его не находит «lol». И lol = lol. – Shawn

+0

@Shawn: вышеперечисленный xpath выберет весь элемент (например, ' lol '). Чтобы проверить текст, вы можете использовать getText(): 'WebElement element = driver.findElement (By.xpath (...)); Строковый текст = элемент.getText(); ' Возможно, опубликуйте фрагмент кода для нас, чтобы узнать, чего вы пытаетесь достичь. –

+0

. К сожалению, код assert.verify настолько похож на вершину рамки, что ее сложно разместить здесь. Я думаю, мне нужно позвонить «g», может быть? – Shawn

Смежные вопросы