Получение атрибута через XPath Query успешно в браузере, но не в рамках робота
-
21-12-2019 - |
Вопрос
У меня есть определенный XPath-запрос, который я использую, чтобы получить высоту с определенного HTML-элемента, который отлично возвращает меня желаемое значение, когда я выполняю его в Chrome через Hatch Helper-Plugin.
//*/div[@class="BarChart"]/*[name()="svg"]/*[name()="svg"]/*[name()="g"]/*[name()="rect" and @class="bar bar1"]/@height
.
Тем не менее, когда я использую тот же запрос через атрибут получателя-элемента-ключевого слова в рамках робота
Get Element Attribute//*/div[@class="BarChart"]/*[name()="svg"]/*[name()="svg"]/*[name()="g"]/*[name()="rect" and @class="bar bar1"]/@height
.
... Тогда я получил инвалидную секцию SELECTORECEXCECTION об этом XPath.
InvalidSelectorException: Message: u'invalid selector: Unable to locate an
element with the xpath expression `//*/div[@class="BarChart"]/*[name()="svg"]/*
[name()="svg"]/*[name()="g"]/*[name()="rect" and @class="bar bar1"]/`
.
Итак, робот Framework или Selenium удалили @ -sign и все после него.Я думал, что это был побег --Проблем и добавил и удалил несколько косой перед @height, но не удалось.Я также пытался инкапсулировать результат этого запроса в строке () - команду, но это было также неудачно.
У кого-то есть идея предотвратить сломание моего XPath-запроса?
Решение
Похоже, вы не можете включить ось атрибута в сам XPath, когда вы используете робот.Вы должны получить элемент на XPath, а затем указать имя атрибута за пределами этого.Похоже, синтаксис что-то подобное:
Get Element Attribute xpath=(//*/div[@class="BarChart"]/*[name()="svg"]/*[name()="svg"]/*[name()="g"]/*[name()="rect" and @class="bar bar1"])@height
.
или, возможно, (я никогда не использовал робот):
Get Element Attribute xpath=(//*/div[@class="BarChart"]/*[name()="svg"]/*[name()="svg"]/*[name()="g"]/*[name()="rect" and @class="bar bar1"])[1]@height
.
Эта документация говорит
ATTRETUTE_LOCATOR состоит из локатора элемента, за которым следует знак @ имя и именем атрибута, например "remuction_id @ class".
Так что я думаю, что я опубликовал выше, находится на правильном пути.
Другие советы
Вы правильно в своем наблюдении, что ключевое слово, кажется, удаляет все после окончательного генеракодицетагкода.Более правильно, он использует @
для отделения локатора элемента из имени атрибута и делает это путем разделения строки на этот конечный символ Renacodicetacode.
Никакого количества сбежания не решит проблему, поскольку код не делает ни одного анализа в этой точке.Это точный код (как в этом написании ...), который выполняет эту операцию:
def _parse_attribute_locator(self, attribute_locator):
parts = attribute_locator.rpartition('@')
...
.
Простое решение - отбросить эту заднюю косулью, поэтому ваш XPath будет выглядеть так:
//*/div[@class="BarChart"]/... and @class="bar bar1"]@height`
.