Селен - поднимаясь по дереву - PullRequest
3 голосов
/ 25 августа 2011

Я работаю в Python с unittest и Selenium RC над веб-приложением монстра (загрузка 4 мегабайта).

Я начинаю с чего-то вроде

xp = '//div[id="kahoona"]//button[text()="Big"]'
selenium.click(xp)

что нормально, пока один из наших разработчиков не начнет возиться с такими вещами, как перемещение обработчика событий javascript вверх по дереву до некоторого родительского элемента на 8 уровней вверх. В этот момент щелчок Selenium просто выдает ошибку. Они также случайным образом вставляют и удаляют уровни, поэтому на 8 уровней сегодня будет 6 завтра, а на следующий день 9.

Это создает кошмар, так как мне нужно декодировать спагетти, генерируемые extjs, и по одному Поднимитесь на один уровень вверх - каждый раз по новому xpath и повторяйте тест до тех пор, пока ошибки не прекратятся

То, что я хочу сделать, это, учитывая некоторый html, который может выглядеть так сегодня - только конечные точки являются определенными - (некоторые элементы будут иметь идентификаторы или классы, а некоторые - нет):

'//div[id="kahoona"]//div//table//tr//td//div//div//div//button[text()="Big"]'

Мне нужно найти способ, начиная с кнопки и используя Selenium, подняться по дереву dom (которое неизвестно и изменяется из-за вышеупомянутого поворота) к внешней оболочке и попробовать что-то вроде selenium.click (the_current_xpath) в каждый уровень до это больше не терпит неудачу. В этот момент у меня должен быть xpath, который работает.

Если это можно сделать относительно эффективно, я могу написать адаптивные тесты, которые обходят бесконечную работу. Разработчики делают свое дело - я не имею никакого влияния и не могу получить доступ к источнику.

Любые предложения очень приветствуются.

Ответы [ 2 ]

6 голосов
/ 28 августа 2011

При использовании xpath:

//button[text()="Big"/parent::*

он поднимется на 1 уровень от кнопки «Большой».

Чтобы пройти 2 уровня, используйте:

//button[text()="Big"/parent::*/parent::*

А затем вы можете написать цикл для добавления /parent::* в xpath, а затем попробовать щелкнуть, пока он не выдаст исключение, а затем выйти из цикла.

1 голос
/ 06 июня 2014

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

'./parent::*/parent::*/parent::*/parent::*'

Точка и косая черта ./ в начале начинаются с текущего узла.Таким образом, код выше идет вверх по DOM на 4 уровня.

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