XPath не локализующий элемент - PullRequest
0 голосов
/ 28 мая 2019

Что не так с моим путем, чтобы выбрать следующее:

<label class="form-control-label" for="profile_form_state">State</label>

Xpath:

xpath = '//label[ends-with(@for, "_state")]'

Я использую rspec и capybara

 expect(rendered).to have_xpath(xpath)

Ошибка:

   xmlXPathCompOpEval: function ends-with not found

Ответы [ 4 ]

1 голос
/ 28 мая 2019

В ответ на @ har07, XPath 1.0 (который реализован в браузерах) не имеет ends-with, но в CSS предусмотрен селектор атрибутов end-with $=

expect(rendered).to have_css(‘label[for$=“_state”]’)

, или вы можете использовать регулярное выражениесо встроенным :label селектором Capybaras

expect(rendered).to have_selector(:label, for: /_state$/)

Если вы действительно хотите придерживаться XPath поверх CSS, тогда вы можете использовать гем xpath, который Capybara использует для создания собственных XPath инаписать

xpath = XPath.descendant(:label).where(XPath.attr(:for).ends_with('_start'))
expect(rendered).to have_xpath(xpath)
0 голосов
/ 28 мая 2019

Другие возможные значения Xpath

// label [содержит (@for, '_state')]

или

// label [text () = 'State']

или

// метка [содержит (текст (), «состояние»)]

0 голосов
/ 28 мая 2019

Попробуйте следующий Xpath.

xpath = '//label[contains(., "State")]'
0 голосов
/ 28 мая 2019

Похоже, ваш процессор XPath поддерживает только XPath, 1.0, тогда как ends-with определяется в XPath 2.0 и выше. Но вы можете моделировать ends-with() в XPath 1.0 , используя substring() и string-length():

xpath = '//label["_state" = substring(@for, string-length(@for) - string-length("_state") +1)]'

Вы можете немного сократить выражение, заменив string-length("_state") +1 предварительно вычисленным значением 5 (длина слова _state минус один):

xpath = '//label["_state" = substring(@for, string-length(@for) - 5)]'
...