2016-12-01 10 views
0

Я использую структуру огурца/ruby ​​/ capybara/siteprism, и у меня возникают проблемы с идентификацией элементов, так как либо мы пропускаем идентификаторы, имена и т. Д., Либо создаем их с в реальном времени.Невозможно определить элемент siteprism из заданного текста метки

В основном я пытался определить некоторые из этих элементов в объектной модели страницы сайта. Например, я пытался ввести некоторые данные в поле «ввода» для «First Name» ниже:

<div class="control-group"> 
 
<label class="control-label" for="input_field_dec_<random_number>"> 
 
First Name 
 
<span class="required"></span> 
 
</label> 
 
<div class="controls"> 
 
<input id="input_field_dec_<random_number>" class=" span5" type="text" value="" scripttofire="SetUserFirstName('input_field_dec_<random_number>')" required="required" name="input_field_dec_<random_number>" data-val-required="First Name is required" data-val-regex-pattern="^[a-zA-Z0-9_ \-\']*$" data-val-regex="Only alphabetic and numeric characters allowed" data-val="true"> 
 
<span class="field-validation-valid help-inline" data-valmsg-for="input_field_dec_<random_number>" data-valmsg-replace="true"></span> 
 
</div> 
 
</div>

Есть ли способ, чтобы передать текст метки (например: «First Name '- игнорирование пробелов вокруг, что-то вроде - contains =' First Name '), а затем найти элемент ввода внутри, чтобы настроить его?

я что-то вдоль линий мышления:

element :first_name_field, :xpath, "//label[contains(text()='Continue'])/<and here something to find the input field?>" but cannot figure it out... 
+0

Try ': first_name_field,: поле«Первый Name'' –

+0

@Thomas, что конкретный пример сработал. Однако, он не работает в следующем коде, который кажется мне похожим?

..... В этом случае я использовал элемент: search_box,: field, 'Street или Postcode' .... и я получаю: «Capybara :: ElementNotFound: Не удалось найти поле« Улица или почтовый индекс », " – mickael

+0

Это не будет работать в этом случае, потому что нет никакой ссылки на ярлык и ввод, поскольку метка не завершает ввод или не имеет атрибута 'для'. –

ответ

1

Капибара предоставляет кучу встроенных «селекторы», которые могут быть использованы для этого, и вы можете добавить свои собственные, если вы найдете нужным. Вы можете видеть предоставленные селектора либо самим созданием документов Capybara (рубидоки не запускают собственный двоичный код, используемый для создания этой части документов), либо просматривая файл, где они реализованы. https://github.com/teamcapybara/capybara/blob/master/lib/capybara/selector.rb#L47

Для вашего оригинала Например, вы можете использовать: селектор полей

, который будет соответствовать на вводе соответствующего текста ярлыка. Для вас второго примера (с комментариями), где вход и метка не имеют никакого отношения к (обернутый или for атрибут), вы должны быть в состоянии сделать что-то вроде

element :some_field, :xpath, ".//label[contains(normalize-space(string(.)), 'label text')]/following-sibling::*[1]/self::input" 

Если вы хотите, чтобы сделать это для повторного использования, вы можете добавить свои собственные "селектор", как

Capybara.add_selector(:sibling_input) do 
    label "Label adjacent sibling input" 
    xpath do |locator| 
    XPath.descendant(:label)[XPath.string.n.is(locator)].next_sibling(:input) 
    end 
end 

, который затем может быть использован в качестве элемента

element :some_field, :sibling_input, 'label text' 
+0

wow, сложное выражение xpath для следующего примера. Я отдам его, хотя я пока этого не понимаю. Я хотел сказать, большое спасибо за помощь, объяснения, ссылки и терпение !!! Действительно оценил человека, спасибо огромное! – mickael

+0

@mickael. Добро пожаловать, предоставленный XPath я мог бы быть немного упрощен, так как он был создан из DSath XPath, который я использовал в add_selector (xpath gem - https://github.com/jnicklas/xpath), а не написанный рукой. В основном это говорит о том, что найти метку, содержащую указанный текст, а затем найти соседнего брата (XPath - 1 на основе индексов - поэтому [1] получает первый следующий родственный брат), пока этот родственный элемент является элементом ввода. –