Поиск svg элементов на странице

Тег Link не требует закрытия, т. к. является одиночным.
Достаточно того, чтобы конкретный div был закрыт.

require 'selenium-webdriver'

uri = 'data:text/html,<html><div id="foo">bar</div>'

driver = Selenium::WebDriver.for :chrome
driver.get uri
element = driver.find_element :id, 'foo'

# bar
puts element.text

driver.close

Заметь, что в моём примере тег html не закрыт, т. е. HTML является битым, но при этом Selenium отлично справился со своей задачей. DOM при этом не было разрушен.

Ой))) прошу прощения)) про link и забыл совсем)) увлекся попытками найти причину проблемы))

Проблема еще в том что если смотреть сорс страницы, то этого дива там нету. У меня есть подозрения что он обновляется как-то динамически. Может он не добавляет его в DOM?

Кстати да! Это же svg, а они чаще всего динамически добавляются. Посмотрите по коду , может где встречается инициализация этого элемента.

Надо wait этого элемента попробовать тогда.

Если ты его видишь в браузере — значит в DOM всё попало.
При каких обстоятельствах происходит событие создание SVG я не знаю, зависит от страницы.
Нужно её посмотреть, а пока это не получается сделать.
Selenium дожидается загрузки страницы и выполнения всех JS скриптов на ней, в том числе и AJAX.

Есть возможность посмотреть на сам проект живьём?

Ну или хотя бы посмотреть бы , где в коде js фигурирует этот id. А wait не помогает?

К сожалению не могу показать сам проект =( Но насчет DOM верно. Поговорю с разработчиками сего чуда. Wait пробовал, не помогает, просто вылетает по истечению времени. Спасибо за старания

Господа меня только что осенило какой глупый недочет я не замечал. Дело в том что когда я вызывал свой граф, он строился в новой вкладке браузера chrome, а драйвер продолжал искать в предыдущей вкладке. Насколько я знаю selenium не умеет ориентироваться между вкладками. Может вы знаете решение как переключаться между ними?

Умеет. switchTo().window(), например.

driver.switch_to.window driver.window_handles[0]

Переключит тебя на первую вкладку, например.

1 лайк

Спасибо огромное ребята!!! +100500 вам в карму =) Считаю свой вопрос закрытым.

Таки получилось добиться результата? Интересно же. :slight_smile:

ДА получилось! просто переключился между вкладками =) В большинстве случаев всегда так, надо смотреть не на глобальные вещи, а на мелкие недочеты…собственно из-за них все и валится ))

Главное, что из-за темы многое подчеркнули.
@klysak07 — что можно переключаться между вкладками
@sidelnikovmike — что тег link не требует закрытия
@tit — что есть ещё люди, которые используют svg вместо canvas
@all — что Ruby самый лучший язык. :slight_smile:

1 лайк

Про ruby я не согласен.
А про link - надо запомнить)))

1 лайк

просто для информации - занимательный факт, может кому пригодится: не знаю как в ruby-версии webdriver, но в java driver.windowHandles имеет тип set, что не гарантирует по 0 индексу (условно обозначим так первый элемент, отданный итератором) наличие именно первой открытой вкладки. Может вернуться handle для любой случайной открытой вкладки (окна) - нужно обращать на это внимание. По крайней мере в java

Можно у полученных Handles’ов вытягивать Title страницы и так определять нужные вкладки.

специально перечитал все сообщения, это из-за чего у тебя такое убеждение? :smile: